LVM(Logical Volume Manager)は、複数のハードディスクを仮想的に1つのハードディスクとしてまとめることができます。
スナップショットを作成したり、パーティションのサイズをオンラインで増やしたりできます。
基本操作は、意外と簡単なのでハードディスク増設のタイミングでLVMに移行しようと思います。
LVMの概要
LVMでは、物理的なハードディスクのパーティションにPV(Physical Volume)を作成します。
複数のPVを仮想的なハードディスクであるVG(Volume Group)にまとめることができます。
VGにまとめるPVは、同じハードディスクに配置される必要がないため、複数のハードディスクを仮想的な一台のハードディスクとして構成することができるのがポイントですね。
最後にVGにLV(Logical Volume)を作成します。
OSから見るとLVが通常のパーティションとして認識され、ここにファイルシステムを作成していきます。
PVの内部は、PE(Physical Extents)と呼ばれる固定長のブロックにわかれていてパーティションのスナップショットを取ったり、ミラーしたり、サイズ変更するといったことが柔軟にできるようです。
だいたい、こんなイメージです。
以下、事前の練習として、VBox環境で2GBのハードディスクを2つ作って3GBの論理ボリュームを作成してみました。
作成したハードディスク
Virtual Boxで下記のようにlvm1.vdiとlvm2.vdiというハードディスクを2つ追加しました。
仮想環境は、こうした検証に向いてますね。
増設したハードディスクが接続されているデバイスファイルは、fdisk -l で確認できます。
下記の場合、/dev/sdbと/dev/sdcに未フォーマットの2GBのハードディスクが接続されていることが分かります。
$ sudo fdisk -l Disk /dev/sda: 8589 MB, 8589934592 bytes 255 heads, 63 sectors/track, 1044 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x000e6c60 Device Boot Start End Blocks Id System /dev/sda1 * 1 993 7976241 83 Linux /dev/sda2 994 1044 409657+ 5 Extended /dev/sda5 994 1044 409626 82 Linux swap / Solaris Disk /dev/sdb: 2147 MB, 2147483648 bytes 255 heads, 63 sectors/track, 261 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x00000000 Disk /dev/sdb doesn't contain a valid partition table Disk /dev/sdc: 2147 MB, 2147483648 bytes 255 heads, 63 sectors/track, 261 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x00000000 Disk /dev/sdc doesn't contain a valid partition table $
パーティションの作成
実際に構成するとなると物理的なパーティションのサイズどうしたらよいのか分からないのですが、今回は、2GBのパーティションを作成します。
(1TBのハードディスクがあった場合、1TBのパーティション一つというのは違和感があるのですが、じゃあいくつにすれば良いかとなると…)
LVMを使うときには、パーティションタイプを8eにします。
$ sudo fdisk /dev/sdc Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0x3c1e2cd9. 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) Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-261, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-261, default 261): Using default value 261 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/sdc: 2147 MB, 2147483648 bytes 255 heads, 63 sectors/track, 261 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x3c1e2cd9 Device Boot Start End Blocks Id System /dev/sdc1 1 261 2096451 8e Linux LVM Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. $
PVの作成
PVは、pvcreateコマンドで作成します。
物理的に異なる/dev/sdb1と/dev/sdc2の2つの物理パーティションをPVとして構成しました。
pvdisplayやpvscanでLVMで構成されているPV, VG, LVの状態が確認できます。
$ sudo pvcreate /dev/sdb1 Physical volume "/dev/sdb1" successfully created $ sudo pvcreate /dev/sdc1 Physical volume "/dev/sdc1" successfully created $ $ sudo pvdisplay -C PV VG Fmt Attr PSize PFree /dev/sdb1 lvm2 -- 2.00G 2.00G /dev/sdc1 lvm2 -- 2.00G 2.00G $ sudo pvscan PV /dev/sdb1 lvm2 [2.00 GB] PV /dev/sdc1 lvm2 [2.00 GB] Total: 2 [4.00 GB] / in use: 0 [0 ] / in no VG: 2 [4.00 GB] $
VGの作成
VGは、vgcreateコマンドで作成します。
testvgという名前のVGに/dev/sdb1と/dev/sdc1を1つの仮想的なハードディスクに構成しました。
$ sudo vgcreate testgv /dev/sdb1 /dev/sdc1 Volume group "testgv" successfully created $ sudo pvdisplay -C PV VG Fmt Attr PSize PFree /dev/sdb1 testgv lvm2 a- 2.00G 2.00G /dev/sdc1 testgv lvm2 a- 2.00G 2.00G $ sudo pvscan PV /dev/sdb1 VG testgv lvm2 [2.00 GB / 2.00 GB free] PV /dev/sdc1 VG testgv lvm2 [2.00 GB / 2.00 GB free] Total: 2 [3.99 GB] / in use: 2 [3.99 GB] / in no VG: 0 [0 ] $
LVの作成
LVは、lvcreateというコマンドで作成します。
testlvという3GBのLVをtestvgに作成しました。
物理的には、2GB×2本のディスクで3GBのハードディスクが作成できたことになります。
デバイスファイルは、/dev/testvg/testlvです。
$ sudo lvcreate -n testlv --size 3G testvg Logical volume "testlv" created $
ext3フォーマット
ここからは、通常のパーティションと同じです。
ext3としてフォーマットしてマウントすると3GBのファイルシステムとして利用できます。
$ sudo mkfs.ext3 /dev/testvg/testlv mke2fs 1.41.4 (27-Jan-2009) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 196608 inodes, 786432 blocks 39321 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=805306368 24 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912 Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 27 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. $ mount -t ext3 /dev/testvg/testlv /mnt $ df -k | egrep "mnt|test|Filesystem" Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/testvg-testlv 3096336 70212 2868840 3% /mnt $