LVM設定


LVM(logical volume manager)とは,複数のハード・ディスクやパーティションにまたがった記憶領域を一つの論理的なディスクとして扱うことのできるディスク管理機能のことで、従来のパーティショニングより柔軟なディスク運用が可能です。

UNIXに限らずWindowsにおいてもディスクを使用する際に、パーティションの切り方に悩みます。
ディスクのパーティションは一度切ると通常は変更できない為、作成時に将来を見越したパーティションを作成しなければならないためです。
例えば10GBのパーティションを作成し、数年後に10GBを使い切りそうになっても、そのパーティションを拡張するのは容易ではありません。どうしても拡張したい場合は、パーティションに入っているデータを何処かへ退避し、パーティションを削除し作り直すしかありません。

そこでLVM(Logical Volume Manager)では、物理ディスクを仮想化し柔軟なパーティション管理を実現します。

また、LVMにはSnapshot機能があるのでシステムバックアップが非常に簡単に取得できます。

今回は新品のUSB接続の外付けHDDを使用し、LVMでのファイルシステム作成を見ていきます。

LVMの基礎知識

LVMは以下順番でファイルシステムを作成していきます。
LVMパーティションの作成(PVの作成)→VG作成→LV作成→FSの作成→mount

用語について

PV Physical Volume 物理ディスク内に作成したLVMパーティション
VG Volume Group 1つ以上のPVで作成した仮想化したディスク
PE Physical Extent VG内に切り分けたLVに割り当てる領域の単位
LV Logical Volume VG内に作成する仮想化したパーティション。1つ以上のPEを割り当てる。

ディスクの認識とフォーマット

HDDをUSBに繋ぐとsyslogにこのようなメッセージが出力されます。

# tail -f syslog
Nov 22 20:43:45 localhost kernel: Attached scsi disk sda at scsi1, channel 0, id 0, lun 0
Nov 22 20:43:45 localhost kernel: SCSI device sda: 117210240 512-byte hdwr sectors (60012 MB)
Nov 22 20:43:45 localhost kernel:  /dev/scsi/host1/bus0/target0/lun0: unknown partition table
Nov 22 20:43:45 localhost kernel: WARNING: USB Mass Storage data integrity not assured
Nov 22 20:43:45 localhost kernel: USB Mass Storage device found at 2
Nov 22 20:43:45 localhost kernel: USB Mass Storage support registered.
Nov 22 20:43:45 localhost usb.agent[2686]:      usb-storage: loaded successfully
#

USBはSCSIディスクと認識され、この場合は/dev/sdaとなりました。
mountコマンドを打つとUSBデバイスが認識されたことが分かります

# mount
/dev/mapper/VG00-lv00 on / type reiserfs (rw)
proc on /proc type proc (rw,>efaults)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/hda2 on /boot type ext3 (rw)
/dev/mapper/VG00-LV01 on /home type reiserfs (rw)
/dev/mapper/VG00-LV04 on /tmp type reiserfs (rw)
/dev/mapper/VG00-LV02 on /usr type reiserfs (rw)
/dev/mapper/VG00-LV03 on /usr/local type reiserfs (rw)
/dev/mapper/VG00-LV05 on /var type reiserfs (rw)
/dev/mapper/VG00-LV06 on /backup type reiserfs (rw)
usbfs on /proc/bus/usb type usbfs (rw)
#

HDDが認識されたらfdiskを使って、LVMとして使用するパーティションを作成します。
パーティションの形式はLinux LVMを指定します。

# fdisk /dev/sda
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.

The number of cylinders for this disk is set to 57231.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): p             ←''p''でパーティションテーブルを表示

Disk /dev/sda: 60.0 GB, 60011642880 bytes
64 heads, 32 sectors/track, 57231 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): m              ←''m''でfdiskで使用できるコマンドを表示
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

Command (m for help): n                        ←''n''で新しいパーティションを作成
Command action
   e   extended
   p   primary partition (1-4)
p                                        ←''p''でプライマリパーティションを作成
Partition number (1-4): 1        ←最初のパーティションなので''1''を指定
First cylinder (1-57231, default 1):  ←一番内側のシリンダーから使っていくので、そのままEnter
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1075-57231, default 57231): +40960M  ←40GBを割り当て

Command (m for help): p               ←''p''でパーティションの表示

Disk /dev/sda: 60.0 GB, 60011642880 bytes
64 heads, 32 sectors/track, 57231 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes

  Device Boot      Start         End      Blocks   Id  System
/dev/sda1            1           40138    40001536   83  Linux  ←/dev/sda1が作成された

Command (m for help): t              ←''t''でパーティションタイプを設定
Partition number (1-4): 1             ←設定するパーティションを指定
Hex code (type L to list codes): L  ←''L''で設定できるパーティションをリスト

 0  Empty           1e  Hidden W95 FAT1 80  Old Minix       be  Solaris boot
 1  FAT12           24  NEC DOS         81  Minix / old Lin bf  Solaris
 2  XENIX root      39  Plan 9          82  Linux swap / So c1  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  83  Linux           c4  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
 5  Extended        41  PPC PReP Boot   85  Linux extended  c7  Syrinx
 6  FAT16           42  SFS             86  NTFS volume set da  Non-FS data
 7  HPFS/NTFS       4d  QNX4.x          87  NTFS volume set db  CP/M / CTOS / .
 8  AIX             4e  QNX4.x 2nd part 88  Linux plaintext de  Dell Utility
 9  AIX bootable    4f  QNX4.x 3rd part 8e  Linux LVM       df  BootIt
 a  OS/2 Boot Manag 50  OnTrack DM      93  Amoeba          e1  DOS access
 b  W95 FAT32       51  OnTrack DM6 Aux 94  Amoeba BBT      e3  DOS R/O
 c  W95 FAT32 (LBA) 52  CP/M            9f  BSD/OS          e4  SpeedStor
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a0  IBM Thinkpad hi eb  BeOS fs
 f  W95 Ext'd (LBA) 54  OnTrackDM6      a5  FreeBSD         ee  EFI GPT
10  OPUS            55  EZ-Drive        a6  OpenBSD         ef  EFI (FAT-12/16/
11  Hidden FAT12    56  Golden Bow      a7  NeXTSTEP        f0  Linux/PA-RISC b
12  Compaq diagnost 5c  Priam Edisk     a8  Darwin UFS      f1  SpeedStor
14  Hidden FAT16 <3 61  SpeedStor       a9  NetBSD          f4  SpeedStor
16  Hidden FAT16    63  GNU HURD or Sys ab  Darwin boot     f2  DOS secondary
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fd  Linux raid auto
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fe  LANstep
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid ff  BBT
1c  Hidden W95 FAT3 75  PC/IX
Hex code (type L to list codes): 8e   ←Linux LVMの''8e''を指定
Changed system type of partition 3 to 8e (Linux LVM)

Command (m for help): p                ←''p''でパーティションテーブルを表示

Disk /dev/sda: 60.0 GB, 60011642880 bytes
64 heads, 32 sectors/track, 57231 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            1           40138    40001536   8e  Linux LVM  ←/dev/sda1がLinux LVMに変更された

Command (m for help): w            ←''w''で作成したパーティションテーブルを書き込み
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
#

以上でLVMパーティションの作成は終了です。

VGの作成

LVMパーティションをPVとして定義します。

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

次にVGを作成します。
VGの名前をvg00(名前は任意の名前でかまわない)、PEのサイズを64MB(通常2の倍数単位)にします。

# vgcreate -s64m vg00 /dev/sda1
  Volume group "vg00" successfully created
#

vgdisplayコマンドでVGの情報を確認します。

# vgdisplay
 --- Volume group ---
 VG Name               vg00
 System ID
 Format                lvm2
 Metadata Areas        1
 Metadata Sequence No  1
 VG Access             read/write
 VG Status             resizable
 MAX LV                0
 Cur LV                0
 Open LV               0
 Max PV                0
 Cur PV                1
 Act PV                1
 VG Size               38.12 GB
 PE Size               64.00 MB
 Total PE              610
 Alloc PE / Size       0 / 0
 Free  PE / Size       610 / 38.12 GB
 VG UUID               I0Wmk0-358u-kVZ9-J0L3-O6xV-DC3W-pCG1oI
#

以上でVGの作成は終了です。
今回は1つのPVを1つのVGに割り当てましたが、複数のPVをVGに割り当てることでVGの拡張が可能になります。

ここがLVMの利点で、VGの空きPEを使い果たしても新たにPVを追加することでVGの拡張が可能となります。
新しくPVを加えることで、VGの空きPEが増えることになります。

LVの作成

作ったVGにLVを作成していきます。
今回は以下のlvを作成します。

LV name size
lv00 10GB
lv01 3GB
lv02 3GB
lv03 3GB
lv04 4GB
lv05 5GB

ではlvcreateコマンドでLVを作成していきます。

# lvcreate -nlv00 -L3g vg00
  Logical volume "lv00" created
# lvcreate -nlv01 -L10g vg00
  Logical volume "lv01" created
# lvcreate -nlv02 -L10g vg00
  Logical volume "lv02" created
# lvcreate -nlv03 -L3g vg00
  Logical volume "lv03" created
# lvcreate -nlv04 -L3g vg00
  Logical volume "lv04" created
# lvcreate -nlv05 -L5g vg00
  Logical volume "lv05" created
#

LVの情報を見てみます。

# lvdisplay
  --- Logical volume ---
  LV Name                /dev/vg00/lv00
  VG Name                vg00
  LV UUID                3w1x34-c6MQ-aRDL-2ESe-5pr6-INRP-BBYDV4
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                3.00 GB
  Current LE             48
  Segments               1
  Allocation             inherit
  Read ahead sectors     0
  Block device           254:7

  --- Logical volume ---
  LV Name                /dev/vg00/lv01
  VG Name                vg00
  LV UUID                D8U9nf-XU6X-aOXU-3MYB-Tfog-vp7N-U1t2RO
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                10.00 GB
  Current LE             160
  Segments               1
  Allocation             inherit
  Read ahead sectors     0
  Block device           254:8

  --- Logical volume ---
  LV Name                /dev/vg00/lv02
  VG Name                vg00
  LV UUID                HjGsXT-rnHD-0uZJ-HoJ1-kb3w-cI6L-zZd5jk
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                10.00 GB
  Current LE             160
  Segments               1
  Allocation             inherit
  Read ahead sectors     0
  Block device           254:9

  --- Logical volume ---
  LV Name                /dev/vg00/lv03
  VG Name                vg00
  LV UUID                dJKlQS-ihww-ax0u-jYoZ-xBvA-zdUN-7xdpvk
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                3.00 GB
  Current LE             48
  Segments               1
  Allocation             inherit
  Read ahead sectors     0
  Block device           254:10

  --- Logical volume ---
  LV Name                /dev/vg00/lv04
  VG Name                vg00
  LV UUID                yfpLE3-ZKjs-2ITV-76yy-achm-FVIl-iczycw
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                3.00 GB
  Current LE             48
  Segments               1
  Allocation             inherit
  Read ahead sectors     0
  Block device           254:11

  --- Logical volume ---
  LV Name                /dev/vg00/lv05
  VG Name                vg00
  LV UUID                cxrbvl-jELA-Z10X-GQHY-W70w-XdPD-XgZ4W4
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                5.00 GB
  Current LE             80
  Segments               1
  Allocation             inherit
  Read ahead sectors     0
  Block device           254:12

#

以上でLVの作成は終了です。
40GBのvg00に対して合わせて28GB分しかLVを作成しませんでした。
今回作ったLVの容量が足りなくなった場合に、vg00の空きPEをLVに追加で割り当てることで、LVの拡張が可能になり柔軟なディスク運用が行えます。
作成したLVは /dev/vg00/lv00 というようにシステムに認識されます。

FSの作成

作成したLVにファイルシステムを作成します。
FSは主なものでも、ext2, ext3, xfs, jfs, ReiserFS などがあります。
それぞれ特徴があり、自分の好みで選ぶのがいいでしょう。
今回はdumpコマンドでバックアップが取得できること、一番メジャーなFSであり実績が十分なことから
ext3を選びました。(今から考えると、FSのfreezeが行えるxfsにすればよかったかなと思います)

LVにファイルシステムを作成するには以下のコマンドを使います。

# mkfs -t ext3 /dev/vg00/lv00

これを全部のLVに対して行えばFSの作成は終了です。

mount

FSを作成しただけではまだ使えるようになりません。
今回はひとまず/tmp下にそれぞれのLVをマウントしてみることにします。

/tmp下にマウントポイントを作成します。

# mkdir /tmp/lv00

以下全LV分のマウントポイントを作成します。
次に実際にマウントしていきます。

# mount -t ext3 /dev/vg00/lv00 /backup/lv00

全LV分をマウントしていきます。
mountコマンドとdfコマンドで正しくマウントできたか確認してみましょう。

# mount
/dev/mapper/vg00-lv00 on /backup/lv00 type ext3 (rw)
/dev/mapper/vg00-lv01 on /backup/lv01 type ext3 (rw)
/dev/mapper/vg00-lv02 on /backup/lv02 type ext3 (rw)
/dev/mapper/vg00-lv03 on /backup/lv03 type ext3 (rw)
/dev/mapper/vg00-lv04 on /backup/lv04 type ext3 (rw)
/dev/mapper/vg00-lv05 on /backup/lv05 type ext3 (rw)
#
# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/vg00-lv00
                       3096336     32828   2906224   2% /backup/lv00
/dev/mapper/vg00-lv01
                      10321208     32828   9764092   1% /backup/lv01
/dev/mapper/vg00-lv02
                      10321208     32828   9764092   1% /backup/lv02
/dev/mapper/vg00-lv03
                       3096336     32828   2906224   2% /backup/lv03
/dev/mapper/vg00-lv04
                       3096336     32828   2906224   2% /backup/lv04
/dev/mapper/vg00-lv05
                       5160576     32828   4865604   1% /backup/lv05
#

これで実際にファイルを読み書きできる状態になりました。

fstabの編集

最後にfstabに作ったFSの情報を書き込みます。
このままですと再起動した際には/tmp/lv00などは自動的にmountされません。
/etc/fstabにFSの情報を書き込むことによって起動時に自動的にmountされるようになります。

以下の情報を追記します。

# vi /etc/fstab
/dev/mapper/vg00-lv00 /tmp/lv00      ext3    defaults        0       2
/dev/mapper/vg00-lv01 /tmp/lv01      ext3    defaults        0       2
/dev/mapper/vg00-lv02 /tmp/lv02      ext3    defaults        0       2
/dev/mapper/vg00-lv03 /tmp/lv03      ext3    defaults        0       2
/dev/mapper/vg00-lv04 /tmp/lv04      ext3    defaults        0       2
/dev/mapper/vg00-lv05 /tmp/lv05      ext3    defaults        0       2

以上でLVMの全ての作業は終了です。

LVMで作ったファイルシステムのバックアップ方法はこちらを参照してください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


1 + 3 =

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>