Step by Step: LVM RAID logical volumeでソフトウェアRAID 1 (Fedora 20)

(2014.11)

Red Hat Enterprise Linux 6.3から, LVM がRAID logical volumeをサポートした。RHEL7 (Fedora 18~19相当) でも、サポートされている。

LVM は、Logical Volume (LV) をどの物理ディスクにアサインするかを明示的に指定することができる。さらに、RAID logical volume機能で、複数の物理ディスクにミラーして配置することもできる。

/bootについては LVM化できないが、それ以外の領域については、全部をLVMに載せることで冗長性と柔軟性を得ることができる。

できあがりイメージはこんな感じ。

Volume Group (VG) を、物理ディスクをまたいで一つだけ作る。その上でミラー化された RAID logical volumeを作る。

swap領域は、ミラーリングしなくていいので、別々のLV にすればOK.

/boot については, mdカーネルドライバを使って RAID 1構成にする。その手順はこちら; Step by Step: シングルHDDをRAID 1に変換; LVM on RAID編 (Fedora 20)

Step by Step

[[注意]] 私(堀川)の手元の環境ではできましたが、同じことをしても失敗するリスクがあります。データを失ったとしても,私は責任を負えません。事前に必ず, データをバックアップしてください。

現況

lvsコマンドで現況を表示。-o オプションは、表示する列を指定。大きさは, オプションを指定しないときと --units g などと小文字のときは 1024が基数だが, --units G などと大文字を与えると 1000が基数になる.

# lvs -a -o vg_name,name,copy_percent,devices,size
  VG      LV      Copy%  Devices         LSize 
  vg_mypc lv_home        /dev/sda2(186)  92.69g
  vg_mypc lv_root        /dev/sda2(3152) 50.00g
  vg_mypc lv_swap        /dev/sda2(0)     5.81g

LVについて表示したときに、どの物理ディスクに置かれているかが透けて見える。

いったん PCの電源を切り、新しい HDD を接続。fdisk などで, 必要なパーティションを切る。

VGを一つにまとめる

新しく接続したHDDにすでにPV, VGがあった場合、VGを一つに統合する。

一つのVG上のLVで名前が被ってはいけないので、RAID化しない生かす LVは名前を変える。

vgchangeコマンドで、アクティブ/非アクティブの切替え。-a nオプションで非アクティブにする。

# vgchange -a n vg_newhdd

lvrenameコマンドで, LVの名前変更. 例えば, 'root' LVが被っているとして, root2に変更。

いらないLVなら lvremove で単に削除してもOK.

# lvrename vg_newhdd lv_root lv_root2

vgmergeコマンドで、VGを連結して一つにする。コマンド引数は, dest srcの順。

# vgmerge -v vg_mypc vg_newhdd
    Checking for volume group "vg_newhdd"
    Checking for volume group "vg_mypc"
  Extent sizes differ: 65536 (vg_mypc) and 8192 (vg_newhdd)

上のケースは失敗. 単一のVGには異なる物理エクステント (Physical Extent; PE) の大きさを混ぜることができない.

物理エクステントは, (PVではなく) VGの属性で, VGの大きさの単位.

vgdisplayコマンドでPE sizeを確認できる. vgchange コマンドでPE sizeを変更できることになっているが、実際には成功しない.

この場合は, VGを作りなおすしかない. 当然, そのVG上のLV, データはすべて失われる. vgremoveコマンドで VGを削除し, vgextend コマンドで VGに PVを追加する.

話を戻して, vgmerge コマンドが成功したら, 新しいHDDのほうの不要なLVを削除。

# lvremove vg_mypc/lv_root2

RAIDデバイスに変換

Linear LV (RAIDでないLV) を, lvconvertコマンドで RAIDデバイスに変換する.

-mオプション (--mirrors) ... ミラーの数. -m 1だと 2-sides.

# lvconvert -v --type raid1 -m 1 vg_mypc/lv_root
    Executing: /usr/sbin/modprobe dm-raid
    Archiving volume group "vg_mypc" metadata (seqno 6).
  Insufficient free space: 1 extents needed, but only 0 available

おや? 空き領域はあるのに。

理由: LVの領域のほかに metadataの領域が必要。VGに metadata分の空きがない場合, LVを縮めてやる必要がある。

metadata は 4MB~32MBぐらいあればいい。

LVを切り詰める

VGにmetadata分の空きがあれば、当然このステップは不要。

Fedora 20だと、ファイルシステムは次のいずれかだろう。Btrfs はLVMの上には載らない。(Btrfs側がRAID機能も持つ。)

XFSだとどうしようもない。dump & restore しかない。

File system サイズ変更可能?
ext4 拡張: on-line, 縮小: off-line
ext3 拡張: on-line, 縮小: off-line
XFS 拡張: on-line, 縮小: 不能.

root LVを縮めたいときは, GParted などのLive CDでブートして操作する。

ファイルシステムはアンマウントする.

# umount /home

逆に, Live CDでブートしたときは, LVが有効になっていないので、LVを有効にする。

$ sudo lvchange -a y /dev/vg_mypc/root

いずれの場合も, ファイルチェックを必ずおこなっておく。

# fsck.ext4 -f /dev/mapper/vg_mypc-lv_home

LVの上に載っているファイルシステムを縮める. 最後の引数が大きさ。下の例だと, 150Gにする。resize2fsに与える大きさは, 常に 1024が基数.

# resize2fs /dev/mapper/vg_mypc-lv_home 150G

その後、LVを縮める。このとき, LVは非アクティブでなければならない.

lvreduce -L 150g /dev/mapper/vg_mypc-lv_home

再マウント。

mount -t ext4 /dev/mapper/... /home

進捗

領域を空けてから lvconvert したら, 今度は成功。

すぐに完了が返ってくるが, 裏でミラーリングが進行する。lvsコマンドで進捗を見れる。

# watch lvs -a -o vg_name,name,copy_percent,devices,size

Cpy%Sync が増加していくことが分かる。

Trouble shooting

(2014.12.10)

Fedora 20では上に書いた手順でよかったが, 別の機械のFedora 19で同じようにしたところ、ミラー化後の再起動時に, Dracut emergency modeに落ちてしまった。

ここから大嵌まり。

ミラー化は成功。しかし、/bootをMD RAID化していなかったため、initramfsに明示的にMDカーネルドライバを組込むのを失念していた。

LVM logical volumeでは, MDカーネルドライバを使っている。

Fedora 19では, Fedora 20とは違い, デフォルトでは組込まれないようだ。

こういう状況で、GRUB2から /boot上ののinitramfsを読み込むところまでは動くが、initramfsにMDカーネルドライバが含まれておらず、刺さった。

金庫の鍵が金庫の中状態。

どうするか。

1) インストールディスクでbootして、LVMを認識させる。

とにかく、LVMを認識できれば、後は何とかなる。

2) どこかのディレクトリ以下に各LVをmountして, ディレクトリツリーを再現する。

chrootしたうえで、dracutコマンドで initramfs を再作成。

dracutコマンドでinitramfsを作りなおしてもうまくいかなかった場合は, きちんとLVMが認識できている状態で, kernelのアップデートを行えばいい。アップデート中に, initramfsが裏で作成される。

dracut に与えるオプションが違うのだろうか。

(1) kernel module

/etc/modules.conf ファイルは, もはやない。insmod コマンドも古い.

今は modprobe コマンドを使う。

# /usr/sbin/modprobe dm-raid

名前が紛らわしいが, MDではなく dmやね.

どのカーネルモジュールがインストールされているかは lsmod コマンド。

lsinitrd コマンドで, initramfsファイルの内容を見れる。

usr/lib/modules/<kernel version>/kernel/drivers/md/dm-raid.ko が含まれるかどうかを確認する。

(2) LVM

/etc/sysconfig/lvm という設定ファイルも, もはやない。

/etc/lvm/lvm.conf ファイルに設定がある。

(3) LVが自動認識されない

dracut shellにて,

# vgscan
# vgchange -a y
# blkid
# ln -s /dev/mapper/luks-$UUID /dev/root
# exit

exit コマンドで, bootが再開される。/dev/root が dracutから抜けたときに root になる.

はずだが、今回の件では, root が認識できなかったので, dracut shell でvgscanコマンドなどが実行できなかった。

インストールディスクから boot すればよい。

(4) initramfs を作り直す

動いている状態で,

# dracut /boot/initramfs-raid.img 3.17.3

/etc/dracut.conf ファイルが設定ファイル