ksaitoの日記

日々試したことの覚え書き

LVMでディスク管理

移転しました。

自動的にリダイレクトします。

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
$