- 複数のパーティションを1つの領域(Volume Group)としてまとめて利用できる。ストレージを後で追加可能。
- 実際に利用する際は、Volume Group 内に LV (Logical Volume) を作成し、LV をフォーマットしてマウントする。LV は動的にサイズ変更可能。
作成 2013.03.26
更新 2023.02.28
更新 2023.02.28
Linux LVM (Logical Volume Manager) まとめ
目次
概念
Linux LVM (Logical Volume Manager) は、複数のディスクやパーティションを論理的に1つの領域として扱う機能。LVM 上で作成した論理ボリュームは、サイズを動的に変更したりスナップショットを作成してバックアップ処理を効率化したりすることができる。主な用途としては、必要量が不明な領域に対してあらかじめLVMを設定しておくことで容量が不足した際に使われていない領域を融通したり、追加ストレージを結合することでハードウェアをリプレースすることなく増量したりするような目的で使用される。
新規作成
作業順序としては以下の通り。
- PV (Phisical Volume) 作成 ~ 物理パーティションをLVM用に設定
- VG (Volume Group) 作成 ~ PV を VG に割り当てる
- LV (Logical Volume) 作成 ~ VG から論理パーティションを切り出す
- LV を任意のファイルシステムでフォーマット
- フォーマットした領域をマウント
PV (Phisical Volume) 作成
fdisk コマンドで物理パーティションを作成する。接続しているディスクは以下のコマンドで確認できる。
今回は、/dev/sdb にパーティションを1つだけ作成し、LVM用に指定した後、書き込む。
# fdisk -lfdisk コマンドはシェル形式となっており、p パーティション表示、n パーティション新規作成、d パーティション削除、q 変更を中止して終了、w 書き込んで終了、t パーティションタイプの変更 などがある。
今回は、/dev/sdb にパーティションを1つだけ作成し、LVM用に指定した後、書き込む。
# fdisk /dev/sdb Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0x0f958ebf. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-1044, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-1044, default 1044): Using default value 1044 Command (m for help): t Selected partition 1 Hex code (type L to list codes): 8e Changed system type of partition 1 to 8e (Linux LVM) Command (m for help): p Disk /dev/sdb: 8589 MB, 8589934592 bytes 255 heads, 63 sectors/track, 1044 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x0f958ebf Device Boot Start End Blocks Id System /dev/sdb1 1 1044 8385898+ 8e Linux LVM Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. #最後に pvcreate コマンドでLVMを使用する準備が整う。
# pvcreate /dev/sdb1 Physical volume "/dev/sdb1" successfully created
VG (Volume Group) 作成
ボリュームグループ "vg01" を作成する。ちなみに、グループ名に数字をつける必要はない。
# vgcreate vg01 /dev/sdb1 Volume group "vg01" successfully created複数の領域をまとめて指定することもできる。
# vgcreate vg02 /dev/sdc1 /dev/sdd1 Volume group "vg02" successfully created
LV (Logical Volume) 作成
vg01 の空き領域をすべて使って論理ボリューム "lv10" を作成する。
CentOS ではデバイスとして /dev/dm-数字 が作成され、シンボリックリンクとして /dev/vg01/lv10 と /dev/mapper/vg01-lv10 が作成される。
CentOS ではデバイスとして /dev/dm-数字 が作成され、シンボリックリンクとして /dev/vg01/lv10 と /dev/mapper/vg01-lv10 が作成される。
# lvcreate -n lv10 -l 100%FREE vg01サイズを指定する場合は以下の通り。以下の例は vg01 に 300GB の lv10 を作成する。
# lvcreate -n lv10 --size 300G vg01デバイスマッパーに割り当てられた数字を確認するには以下のコマンドを実行する。Block device の :の右の数字がそれに該当する。
# lvdisplay
LV をフォーマット
フォーマットは物理パーティションに実行するのと同様に指定する。
ext4 の場合は以下の通り。
ext4 の場合は以下の通り。
# mkfs.ext4 /dev/vg01/lv10 mke2fs 1.41.12 (17-May-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 524288 inodes, 2096128 blocks 104806 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=2147483648 64 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 31 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. #
フォーマットした領域をマウント
"/data" ディレクトリを作成し、そこにマウントする。
マウント時にファイルシステムを指定する必要は特にない。
/etc/fstab
マウント時にファイルシステムを指定する必要は特にない。
# mkdir /data # mount /dev/mapper/vg01-lv10 /data #次回起動時のマウント用に /etc/fstab に追記する。
/etc/fstab
/dev/mapper/vg01-lv10 /data ext4 defaults 0 0
既存の領域にストレージを追加してLVを拡張する
作業順序としては以下の通り。
ファイルシステムのサイズ変更については、ファイルシステムによって異なるため以降の章で言及する。
- PV (Phisical Volume) 作成 ~ 物理パーティションをLVM用に設定
- VG (Volume Group) に追加 ~ PV を VG に割り当てる
- LV (Logical Volume) 拡張 ~ VG の空き領域を LV へ割り当てる
- ファイルシステムのサイズを変更する
ファイルシステムのサイズ変更については、ファイルシステムによって異なるため以降の章で言及する。
PV (Phisical Volume) 作成
/dev/sdc に物理パーティション /dev/sdc1 を作成する。
操作は前章と同じため省略。
操作は前章と同じため省略。
VG (Volume Group) に追加
"vg01" に /dev/sdc1 を追加する。
PV 追加後に実行すると Free のサイズが増加している。
# vgextend vg01 /dev/sdc1 Volume group "vg01" successfully extendedVG の名前を確認したい場合は、vgdisplay コマンドを使用する。
PV 追加後に実行すると Free のサイズが増加している。
# vgdisplay
LV (Logical Volume) 拡張
lv10 に vg01 の空き領域をすべて追加するには以下の通り。
+ があることを確認すること
+ があることを確認すること
# lvextend -l +100%FREE /dev/vg01/lv10 Extending logical volume lv10 to 15.99 GiB Logical volume lv10 successfully resized
ファイルシステムの領域拡張
LV を拡張するだけでは使用できない。ファイルシステムサイズの変更操作が必要。
ext3, ext4
resize2fs コマンドを使用する。サイズを指定しない場合は空いている領域をすべて使用するはずだが、ハングアップすることがあるためお勧めしない。
以下のコマンド例では、/dev/vg00/lv00 内のファイルシステムサイズを 2048GB へ変更する。
領域以上の値を指定するとエラーメッセージが表示され、何も変更されず終了する。縮小することも可能。ただし、縮小する場合はいったんアンマウントする必要がある。
以下のコマンド例では、/dev/vg00/lv00 内のファイルシステムサイズを 2048GB へ変更する。
領域以上の値を指定するとエラーメッセージが表示され、何も変更されず終了する。縮小することも可能。ただし、縮小する場合はいったんアンマウントする必要がある。
# resize2fs /dev/vg00/lv00 2048G
ext2
動的拡張に対応していないため、いったんアンマウントして変更後に再度マウントする。
# umount /data # resize2fs /dev/vg00/lv00 256G # mount /data
xfs
オンラインリサイズが可能。マウントポイントに対して実行することに注意。
# xfs_growfs /data
スナップショット
バックアップ用途で使用される。スナップショットのリソースは有限なため、バックアップ取得完了後は直ちに解放しなければならない。なお、スナップショットを取得した時点までロールバックするような操作はできない。
スナップショットの作成
ここで設定するサイズは、スナップショット対象との差分保持可能容量。VG に空き容量がないと作成できない。
作成した瞬間からスナップショットが有効になっている。
以下の例では、lv00 のスナップショットを snap1 として作成する。差分保持のバッファは 3GB
作成した瞬間からスナップショットが有効になっている。
以下の例では、lv00 のスナップショットを snap1 として作成する。差分保持のバッファは 3GB
# lvcreate -s -L 3G --name snap1 /dev/vg00/lv00
バックアップ
バックアップ方法は任意。dump コマンドを使用した場合は以下の方法で。
# dump 0uf /backup/lv00.dump /dev/vg00/snap1この場合のリストアは以下で可能。リストア用の領域を仮に /mnt/diskimg へマウントしたとする。
# cd /mnt/diskimg # restore -rf /backup/lv00.dumpスナップショットはスナップショット元のファイルシステムと同じため、フォーマットすることなくマウント可能
# mount /dev/vg00/snap1 /mnt/snaptar などでバックアップする
# tar cjf lv00.tar.bz2 /mnt/snap/
スナップショットの解放
マウントしていた場合は、マウントを解除してから実施する。
# lvremove /dev/vg00/snap1
その他
デバイスマッパーとの関連を確認する
Red Hat 系では OSインストール時に LV を直接マウントせず、デバイスマッパーを経由してマウントしている。
デバイスマッパーは /dev/dm-数字 の形式となっており、以下のコマンドで確認できる。
デバイスマッパーは /dev/dm-数字 の形式となっており、以下のコマンドで確認できる。
# dmsetup ls表示された値を
# lvdisplayのBlock device の値と比較する
# ls -l /dev/mapper/で /dev/dm- との関係がわかる。
パーティションがどのグループに所属しているか確認する
# pvscan一括で確認する方法もある
# lsblk -p -o NAME,FSTYPE,SIZE,MOUNTPOINT
ディスクの空き容量が 0% のとき
couldn't create temporary archive name
のエラーメッセージが出たときは、autobackup を無効にするため、-An を追加する
のエラーメッセージが出たときは、autobackup を無効にするため、-An を追加する
# vgextend -An vg01 /dev/sdc1 # lvextend -An -l +100%FREE /dev/vg01/lv10
追加情報