作成 2013.03.26
更新 2023.02.28
Linux LVM (Logical Volume Manager) まとめ
目次
概念
新規作成
PV (Phisical Volume) 作成
VG (Volume Group) 作成
LV (Logical Volume) 作成
LV をフォーマット
フォーマットした領域をマウント
既存の領域にストレージを追加してLVを拡張する
PV (Phisical Volume) 作成
VG (Volume Group) に追加
LV (Logical Volume) 拡張
ファイルシステムの領域拡張
ext3, ext4
ext2
xfs
スナップショット
スナップショットの作成
バックアップ
スナップショットの解放
その他
デバイスマッパーとの関連を確認する
パーティションがどのグループに所属しているか確認する
ディスクの空き容量が 0% のとき
追加情報
概念
Linux LVM (Logical Volume Manager) は、複数のディスクやパーティションを論理的に1つの領域として扱う機能。LVM 上で作成した論理ボリュームは、サイズを動的に変更したりスナップショットを作成してバックアップ処理を効率化したりすることができる。主な用途としては、必要量が不明な領域に対してあらかじめLVMを設定しておくことで容量が不足した際に使われていない領域を融通したり、追加ストレージを結合することでハードウェアをリプレースすることなく増量したりするような目的で使用される。
  • 複数のパーティションを1つの領域(Volume Group)としてまとめて利用できる。ストレージを後で追加可能。
  • 実際に利用する際は、Volume Group 内に LV (Logical Volume) を作成し、LV をフォーマットしてマウントする。LV は動的にサイズ変更可能。
新規作成
作業順序としては以下の通り。
  1. PV (Phisical Volume) 作成 ~ 物理パーティションをLVM用に設定
  2. VG (Volume Group) 作成 ~ PV を VG に割り当てる
  3. LV (Logical Volume) 作成 ~ VG から論理パーティションを切り出す
  4. LV を任意のファイルシステムでフォーマット
  5. フォーマットした領域をマウント
以降の手順は、/dev/sdb を丸ごと1つのLVにするまでの例を記載する。
PV (Phisical Volume) 作成
fdisk コマンドで物理パーティションを作成する。接続しているディスクは以下のコマンドで確認できる。
# fdisk -l
fdisk コマンドはシェル形式となっており、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 が作成される。
# lvcreate -n lv10 -l 100%FREE vg01
サイズを指定する場合は以下の通り。以下の例は vg01 に 300GB の lv10 を作成する。
# lvcreate -n lv10 --size 300G vg01
デバイスマッパーに割り当てられた数字を確認するには以下のコマンドを実行する。Block device の :の右の数字がそれに該当する。
# lvdisplay
LV をフォーマット
フォーマットは物理パーティションに実行するのと同様に指定する。
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" ディレクトリを作成し、そこにマウントする。
マウント時にファイルシステムを指定する必要は特にない。
# mkdir /data
# mount /dev/mapper/vg01-lv10 /data
#
次回起動時のマウント用に /etc/fstab に追記する。
/etc/fstab
/dev/mapper/vg01-lv10 /data                     ext4    defaults        0 0
既存の領域にストレージを追加してLVを拡張する
作業順序としては以下の通り。
  1. PV (Phisical Volume) 作成 ~ 物理パーティションをLVM用に設定
  2. VG (Volume Group) に追加 ~ PV を VG に割り当てる
  3. LV (Logical Volume) 拡張 ~ VG の空き領域を LV へ割り当てる
  4. ファイルシステムのサイズを変更する
以降の手順は、/dev/sdc を先ほど作成した "vg01" へ丸ごと追加し、"lv10" を拡張するまでの例を記載する。
ファイルシステムのサイズ変更については、ファイルシステムによって異なるため以降の章で言及する。
PV (Phisical Volume) 作成
/dev/sdc に物理パーティション /dev/sdc1 を作成する。
操作は前章と同じため省略。
VG (Volume Group) に追加
"vg01" に /dev/sdc1 を追加する。
# vgextend vg01 /dev/sdc1
  Volume group "vg01" successfully extended
VG の名前を確認したい場合は、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 へ変更する。
領域以上の値を指定するとエラーメッセージが表示され、何も変更されず終了する。縮小することも可能。ただし、縮小する場合はいったんアンマウントする必要がある。
# resize2fs /dev/vg00/lv00 2048G
ext2
動的拡張に対応していないため、いったんアンマウントして変更後に再度マウントする。
# umount /data
# resize2fs /dev/vg00/lv00 256G
# mount /data
xfs
オンラインリサイズが可能。マウントポイントに対して実行することに注意。
# xfs_growfs  /data
スナップショット
バックアップ用途で使用される。スナップショットのリソースは有限なため、バックアップ取得完了後は直ちに解放しなければならない。なお、スナップショットを取得した時点までロールバックするような操作はできない。
スナップショットの作成
ここで設定するサイズは、スナップショット対象との差分保持可能容量。VG に空き容量がないと作成できない。
作成した瞬間からスナップショットが有効になっている。
以下の例では、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/snap
tar などでバックアップする
# tar cjf lv00.tar.bz2 /mnt/snap/
スナップショットの解放
マウントしていた場合は、マウントを解除してから実施する。
# lvremove /dev/vg00/snap1
その他
デバイスマッパーとの関連を確認する
Red Hat 系では OSインストール時に LV を直接マウントせず、デバイスマッパーを経由してマウントしている。
デバイスマッパーは /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 を追加する
# vgextend -An vg01 /dev/sdc1
# lvextend -An -l +100%FREE /dev/vg01/lv10
追加情報

©2004-2017 UPKEN IPv4