がらくたネット


LVM

LVM

LVM(Logical Volume Manager)

PV物理ボリューム=物理媒体、Diskとか
PE物理エクステント
VGボリュームグループ、PEの集合体
LV論理ボリューム=パーティション、VGを元に割当

パーティション番号=8e=LVMのこと

pvcreate デバイス名
vgcreate VG名 デバイス名
lvcreate -L サイズ -n LV名 VG名
pvdisplay
vgdisplay
lvextend
mke2fs -j /dev/VG名/LV名

作成

/dev/sdbに作成してみる

fdiskでLVMパーティション作成

# fdisk /dev/sdb
コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 1
最初 シリンダ (1-2610, default 1):
Using default value 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-2610, default 2610):
Using default value 2610
コマンド (m でヘルプ): t
16進数コード (L コマンドでコードリスト表示): 8e
領域のシステムタイプを 1 から 8e (Linux LVM) に変更しました
コマンド (m でヘルプ): p

Disk /dev/sdb: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        2610    20964793+  8e  Linux LVM
コマンド (m でヘルプ): w
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読込みします。
ディスクを同期させます。

PV作成

# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created

VG作成 VG名とパーティションデバイス名が必須

# vgcrea tetestvg /dev/sdb1
  Volume group "testvg" successfully created

LV作成 VG名が必要。-nでLV名を付与できる。-Lでサイズ指定できる。

# lvcreate -L 1G -n home1_lv testvg
  Logical volume "home1_lv" created 

LVにFS(ファイルシステム)作成 デバイス名が必要。デバイス名はlvdisplayで表示可能。

# mkfs.ext3 /dev/testvg/home1_lv

マウント 適当にマウントしてみて容量とかを確認してみる

拡張

GUIツールなら一発でできるがCUIは面倒だ

LVが拡張可能(PVも拡張可能だが、LUNレベルでオンライン拡張をサポートしているデバイス使用時に限る)

LVはオンラインで拡張可能 lvextendを利用

ext3はオンラインでの拡張が可能 ext2online、縮小はオフラインのみ resize2fs

# pvcreate デバイス名
# vgcreate VG名 デバイス名
# lvcreate -L サイズ -n LV名 VG名

# mke2fs -j /dev/VG名/LV名
または
# lvextend -v -L+追加容量 LVパス名
または
# lvresize -v -L+追加容量 LVパス名
# ext2online -v LVパス名

縮小

LVの縮小で/(root)パーティションがある場合は、レスキューモードを利用してやる。 縮小は該当パーティションをアンマウントしておく必要あり。

インストCDでrescueモード指定
RescueタイプではSkipを選択(rootパーティションをマウントしない為)
 
lvm vgchange -a y LVMで全てのVGを有効化
fsck.ext4 -f /dev/vg/lv_root fsckしないとresizeできない。-fでファイルシステムがcleanとなっている場合もチェックする
resize2fs -p /dev/vg/lv_root 10G
lvm lvreduce -L10G /dev/vg/lv_root

LVMで拡張@KVM

KVMを利用していてイメージファイルにqcow2フォーマットで
OSはLVMで構成している場合の拡張方法

まず仮想HDDを20GB拡張

cd /var/lib/libvirt/images
qemu-img resize [FILENAME] +20G

で、KVMを起動させてfdiskでLVMパーティションを作成
作成したパーティションのIDを83から8eに変更して書込み
最後に再起動

fdisk /dev/vda
警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを
      強く推奨します。 and change display units to
         sectors (command 'u').

コマンド (m でヘルプ): u
セクタ数 の表示/項目ユニットを変更します

コマンド (m でヘルプ): p

ディスク /dev/vda: 42.9 GB, 42949672960 バイト
ヘッド 16, セクタ 63, シリンダ 83220, 合計 83886080 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x0001d58b

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/vda1   *        2048     1026047      512000   83  Linux
パーティション 1 は、シリンダ境界で終わっていません。
/dev/vda2         1026048    41943039    20458496   8e  Linux LVM
パーティション 2 は、シリンダ境界で終わっていません。

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本パーティション (1-4)
p
パーティション番号 (1-4): 3
最初 セクタ (63-83886079, 初期値 63): 41943040
Last セクタ, +セクタ数 or +size{K,M,G} (41943040-83886079, 初期値 83886079):
初期値 83886079 を使います

コマンド (m でヘルプ): t
パーティション番号 (1-4): 3
16進数コード (L コマンドでコードリスト表示): 8e
領域のシステムタイプを 3 から 8e (Linux LVM) に変更しました

コマンド (m でヘルプ): p

ディスク /dev/vda: 42.9 GB, 42949672960 バイト
ヘッド 16, セクタ 63, シリンダ 83220, 合計 83886080 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x0001d58b

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/vda1   *        2048     1026047      512000   83  Linux
パーティション 1 は、シリンダ境界で終わっていません。
/dev/vda2         1026048    41943039    20458496   8e  Linux LVM
パーティション 2 は、シリンダ境界で終わっていません。
/dev/vda3        41943040    83886079    20971520   8e  Linux LVM

コマンド (m でヘルプ): w
パーティションテーブルは変更されました!

ioctl() を呼び出してパーティションテーブルを再読込みします。

警告: パーティションテーブルの再読込みがエラー 16 で失敗しました: デバイスもしくはリソースがビジー状態です。
カーネルはまだ古いテーブルを使っています。新しいテーブルは
次回リブート時か、partprobe(8)またはkpartx(8)を実行した後に
使えるようになるでしょう
ディスクを同期しています。

reboot

起動後、OSにログインしてpvを作成
vgに作成したpvを追加して
lvを拡張、ファイルシステムを拡張
dfで確認

pvcreate /dev/vda3
  Physical volume "/dev/vda3" successfully created
vgextend vg /dev/vda3
  Volume group "vg" successfully extended
lvextend -l +100%FREE /dev/vg/lv_root
  Extending logical volume lv_root to 35.50 GiB
  Logical volume lv_root successfully resized
resize2fs /dev/vg/lv_root
  resize2fs 1.41.12 (17-May-2010)
  Filesystem at /dev/vg/lv_root is mounted on /; on-line resizing required
  old desc_blocks = 1, new_desc_blocks = 3
  Performing an on-line resize of /dev/vg/lv_root to 9307136 (4k) blocks.
  The filesystem on /dev/vg/lv_root is now 9307136 blocks long.
df -h

LVMで拡張@KVM v2

KVMを利用していてOSはLVMとXFSで構成している場合の拡張方法

XFSはオンライン拡張ができる
CentOS7からはデフォルトでxfsファイルシステムが採用されているので簡単に容量拡張できる
パーティションをLVMで組む(論理パーティション管理)か 旧来のパーティション(物理パーティション管理)で組むかにより手順が異なる

  • growpart

cloud-utils-growpartパッケージで導入されるツール
空き容量に合わせてパーティションサイズを変更してくれる

  • xfs_growfs

xfsファイルシステムの拡張ツール

  • xfs_info

xfsファイルシステム情報表示ツール
xfs_growfs -nと同じ

vdaが20GBで割り当てられているサーバを容量拡張でvdaが40GBになる場合
最初にディスクサイズが20GB→40GBに増加すれば、手順内での再起動は不要!

vdaディスクの容量確認とパーティション構成確認を行う
# lsblk

20GBから40GBにディスク容量が増えていれば
# growpart /dev/vda 2

増えた部分をvdaのパーティション2の領域に割り当て、増やしたいパーティション番号はlsblkで調べておく

旧来のパーティション管理の場合はこの次はdf -Thまで飛ぶ

pvサイズ確認
# pvdisplay
まだ増えていないはず

pvを拡張
# pvresize /dev/vda2

pvサイズが拡張されたことを確認
# pvdisplay

vgのFree領域が増えているのを確認
# vgdisplay

lvのサイズ確認
# lvdisplay /dev/centos/root

lvを拡張
# lvextend -l +100%FREE /dev/centos/root

lvサイズが拡張されたことを確認
# lvdisplay /dev/centos/root

ここからは旧来パーティション管理でも同じ

マウントされているパーティションサイズを確認
# df -Th

xfsファイルシステムを拡張する
# xfs_growfs /dev/centos/root

パーティションが拡張されたことを確認
# df -Th

別HDDを追加してLVM管理にした場合

pvを作成
# pvcreate /dev/vdb

既存VGに追加
# vgextend centos /dev/vdb

これでvgのFree領域が増えるので後の手順は同じ