~nabeken/diary/

Gentoo Linux(6年くらい)とFreeBSD(1年くらい)とOpenBSD(新参者)を使う日々。


IHANet BGP peering overview

LVM (Logical Volume Manager) を使うべきいくつかの理由

Posted on Fri Sep 19 11:37:55 +0900 2008 by nabeken

こんな経験はないだろうか。

  • fstab に sda1 などをベタ書きしていたせいで、急に mount できなくなった
    • root パーティションだと焦りますね
  • ディスク容量が足りなくなったので、増設したはいいが、移行が面倒だし、移行後のディスクはどうしたものか
    • しかも、また fstab 修正し忘れて慌てた
  • 新しいマシンにこれまでのディスクを付けたが、また fstab 書き換え面倒だお
  • 新しいパーティションが欲しいが、もう作れない

LVM を使いましょう。ディスクが1台しかなくても使いましょう。最近では、ディストリビューションのインストーラーでも LVM を扱うことができるので、CentOSなどは知らぬ間に LVM になっていることもあります。

LVM でできること

  • fstab にブロックデバイス名(sdaやhdaなど)を書く必要がなくなる
    • 代わりに好きな名前を付けることができる
  • ディスクを束ねることができる(好きな名前を付けたデバイス名には複数のブロックデバイスを紐付けることができる)
  • ディスク交換が非常に楽になる
    • ディスクが足りなくなったときは、追加して、ちょろっとコマンドを打てばよい
  • ファイルシステムのスナップショットが作れる
    • このスナップショットを dd などでバックアップもできる(rsyncとか他でもいいけど)

LVMは動作時に全ブロックデバイスを走査して、メタデータを探すので、ディスクの接続順などには一切影響を受けません。これが一番の利点です。

利用例

昔の作業記録から、どんなことができるのかを紹介します。手順は当時のままなので、古いです。

make a root file system

VG main からルートファイルシステム(LV)を作ります。VG に空きがない場合はすでに作った LV から空けます。

# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/main/root         10G  2.8G  7.3G  28% /
/dev/main/home        214G  184G   30G  87% /home

もともと、 LV home は 230GB でしたが、今回ルートファイルシステムを作るにあたって、 10GB 減らすことにしました。減らす場合シングルユーザーモードで /dev/main/home を umount してからやる方ことにしました。ちなみに、増やす場合は mount 中でもできます。

# init 1 (もしくは grub で kernel option に linux single を追加して boot する)
# umount /dev/main/home
# resize_reiserfs -s -10G /dev/main/home
# lvreduce -s -10G /dev/main/home

ここまでですでに 10GB 減りました。先にファイルシステムを縮小することに注意してください。

# lvcreate -L 10G main /dev/main/root

/dev/main/root ができあがっているはずです。あとはこの上にファイルシステムを作って mount すれば完了です。

make a initrd (initial ram disk)

kernel の設定に注意します。ルートファイルシステムで使っているファイルシステムはモジュールではなく、 kernel に組み込みます。LVM も組み込みます。

# cd /boot (もしくは、 kernel のある場所)
# lvmcreat_initrd

で、 initrd-lvm-2.4.27.gz ができます。これを boot loader のオプションに指定するだけです。grub の場合は

# cat /boot/grun/menu.lst

# Boot automatically after 30 secs.
timeout 3

# By default, boot the first entry.
default 0

# Gentoo Linux
title Gentoo Linux (Linux-2.4.27)
kernel (hd0,0)/bzImage-2.4.27 root=/dev/main/root ramdisk_size=8192
initrd (hd0,0)/initrd-lvm-2.4.27.gz

案外、簡単でした。実際には 20MB も必要ありません。最低、 grub から見える場所に kernel, initrd が置ける分だけあればいいです。

# df -h

Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/main/root         10G  2.5G  7.6G  25% /
/dev/main/home        214G  185G   29G  87% /home
/dev/hda5              14G  3.5G   11G  25% /mnt/oldroot

今は上のような構成になっています。

# hdparm -t /dev/main/root
/dev/main/root:
 Timing buffered disk reads:   90 MB in  3.04 seconds =  29.61 MB/sec
# hdparm -t /dev/main/home
/dev/main/home:
 Timing buffered disk reads:  134 MB in  3.00 seconds =  44.67 MB/sec

Software RAID と組合せる

LVM で使うディスクを Software RAID 状のアレイに指定することもできます。RAID0 でディスク容量を拡張するよりも、LVMを使って拡張するほうがパーティションの柔軟性が上がるでしょう。(ただし、Linux専用になってしまうのが難点)

また、RAID1 でも同様にしてできます。いくつも RAID1 なパーティションを作るよりも楽です。(Software RAID も自動でブロックデバイスを走査してアレイを作ります)

 # cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath] [faulty] 
md0 : active raid1 sdb1[1] sda1[0]
      96256 blocks [2/2] [UU]
      
md1 : active raid1 sdb2[1] sda2[0]
      160738240 blocks [2/2] [UU]
      
unused devices: 

 # pvdisplay
  --- Physical volume ---
  PV Name               /dev/md1
  VG Name               raid1
  PV Size               153.29 GB / not usable 2.94 MB
  Allocatable           yes 
  PE Size (KByte)       4096
  Total PE              39242
  Free PE               17226
  Allocated PE          22016
  PV UUID               bZJvLN-SEFs-hfRz-19bp-V61y-bO3b-3Jn05U

 # lvdisplay
  --- Logical volume ---
  LV Name                /dev/raid1/home
  VG Name                raid1
  LV UUID                xPvsep-5ZNI-xkMn-mgMc-Zxei-1wPi-uabY5U
  LV Write Access        read/write
  LV Status              available
  # open                 2
  LV Size                20.00 GB
  Current LE             5120
  Segments               1
  Allocation             inherit
  Read ahead sectors     0
  Block device           253:0
   
  --- Logical volume ---
  LV Name                /dev/raid1/root
  VG Name                raid1
  LV UUID                EdGw3x-Dg76-mlFK-Q6UG-i5PJ-SnRw-hsSG7A
  LV Write Access        read/write
  LV Status              available
  # open                 2
  LV Size                30.00 GB
  Current LE             7680
  Segments               1
  Allocation             inherit
  Read ahead sectors     0
  Block device           253:1
   
  --- Logical volume ---
  LV Name                /dev/raid1/backup
  VG Name                raid1
  LV UUID                su5jEh-7Q7x-7suK-KlXx-13j6-bafg-c2vYss
  LV Write Access        read/write
  LV Status              available
  # open                 2
  LV Size                36.00 GB
  Current LE             9216
  Segments               2
  Allocation             inherit
  Read ahead sectors     0
  Block device           253:2

こんな感じで RAID1 状にたくさんボリュームを作ることができます。dd で吸うこともできるので、ブロックデバイスでできることは大半がボリュームに対してもできます。

とにかく、たくさんディスクを束ねる

ストレージサーバとしては、RAIDを使わなくてもたくさんディスクを束ねられるのは楽だと思います。ディスク1台に障害があっても、被害はそのディスクに留めることができます。(ファイルシステム的に、そのディスク以外のものはなんとか復旧できる)

このマシンは3〜4年ほど前からこつこつと拡張してきたマシンです。ディスクの交換はそれなりに行っていますが、fstabを書き換えたことは1度もありません。途中でマシン(M/B, CPU)を交換しましたが、同様に追加作業は特に発生しませんでした。

 # pvdisplay
  --- Physical volume ---
  PV Name               /dev/sde1
  VG Name               storage
  PV Size               298.09 GB / not usable 26.81 MB
  Allocatable           yes (but full)
  PE Size (KByte)       32768
  Total PE              9538
  Free PE               0
  Allocated PE          9538
  PV UUID               DqE9OL-5Eic-VAWX-JAtk-NEgg-tRXG-vUA14l
   
  --- Physical volume ---
  PV Name               /dev/sdc1
  VG Name               storage
  PV Size               298.09 GB / not usable 26.81 MB
  Allocatable           yes (but full)
  PE Size (KByte)       32768
  Total PE              9538
  Free PE               0
  Allocated PE          9538
  PV UUID               wwezAP-OZyu-2USB-QIry-W4Nd-KIa5-nL3f6W
   
  --- Physical volume ---
  PV Name               /dev/sdd
  VG Name               storage
  PV Size               465.76 GB / not usable 12.02 MB
  Allocatable           yes (but full)
  PE Size (KByte)       32768
  Total PE              14904
  Free PE               0
  Allocated PE          14904
  PV UUID               17HYjm-yKSH-ioMd-RrKR-EOR6-sLFX-spKeeW
   
  --- Physical volume ---
  PV Name               /dev/sdf1
  VG Name               storage
  PV Size               465.76 GB / not usable 9.50 MB
  Allocatable           yes (but full)
  PE Size (KByte)       32768
  Total PE              14904
  Free PE               0
  Allocated PE          14904
  PV UUID               5gWUnD-lyyX-X80y-j583-dibh-2UoM-tXyas1
   
  --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               storage
  PV Size               465.76 GB / not usable 9.50 MB
  Allocatable           yes 
  PE Size (KByte)       32768
  Total PE              14904
  Free PE               2119
  Allocated PE          12785
  PV UUID               m3t4K3-V87D-cTZZ-9KKy-MiNc-X3pv-kFYFN1
   
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               main
  PV Size               153.29 GB / not usable 3.05 MB
  Allocatable           yes 
  PE Size (KByte)       4096
  Total PE              39242
  Free PE               29002
  Allocated PE          10240
  PV UUID               YD0ryp-Mt0A-qM6J-k1wp-nuFO-KovJ-l4Ws4b
 
 # vgdisplay storage
  --- Volume group ---
  VG Name               storage
  System ID             yuki1073744028
  Format                lvm2
  Metadata Areas        5
  Metadata Sequence No  113
  VG Access             read/write
  VG Status             resizable
  MAX LV                256
  Cur LV                1
  Open LV               1
  Max PV                256
  Cur PV                5
  Act PV                5
  VG Size               1.95 TB
  PE Size               32.00 MB
  Total PE              63788
  Alloc PE / Size       61669 / 1.88 TB
  Free  PE / Size       2119 / 66.22 GB
  VG UUID               rY3ZfD-4U1K-H9lH-Mi33-jyd9-ZE2r-T02yOd