単純なmd(RAID5)からlvmを使った構成に変更する際のコマンドの覚書

概要

自宅のサーバには単純なRAID5のアレイを2系統繋いでいる。ディスクを新規に購入したのを機会に、これをRAID+LVMの構成に変更する。このとき必要なコマンドをここにメモする。

イントロ

Linux の MD (multidisk)機構はソフトウエアRAIDを実現する仕組みである。RAID1やRAID5最近のバージョンでは、RAIDを構成するドライブ群の自動認識や、動的な構成変更、つまり3台のドライブを繋いで使っていたRAIDを4台に増やす、などといったことが容易にできるようになっている。詳しい解説は https://raid.wiki.kernel.org/index.php/Linux_Raid 。これはLDPで管理されていた The Software-RAID HOWTO の最新版。
Linux LVM(論理ボリューム管理)は、ディスクを抽象化する機構。ディスクのパーティションをいったん「ボリュームグループ」にまとめ、一定の大きさの「フィジカルエクステント」に切り刻み、それをまとめて「ロジカルボリューム」として使う。フィジカルエクステントは物理的なドライブと強く結びついていないので、物理的なドライブに縛られない運用が可能である。ドライブを追加することで容量を増やすことも出来るし、小さいドライブから大きなドライブにエクステントを移動できる。ただしMDで巨大なボリュームグループを作って柔軟な運用をしていると、ドライブが壊れたときにどの部分を失うか予想できないという不利がある。
この両者を組み合わせると、RAIDでデータの安全を確保した状態で、物理ドライブの縛りから少し自由になれる。RAIDだけの場合でも、同程度のディスクを2台以上用意し、容量が足りなくなったらディスクを追加していくことで安全に容量拡大が図れるため、普通はこの方法がお勧め。しかし私のように複数のRAIDアレイを持っている場合、MDを噛ませることでRAID間のデータの移動が容易になり、古いアレイを引退させるのが非常に容易になる。

これまでの構成

  • /: システム領域。500GBディスクの先頭パーティションの1-1020シリンダを使用。8GB弱。
  • /md0: 500GBディスク4台によるRAID5(1.35TiB)。
heliopora:~# ls /md0
backup/  home/  lost+found/  old/
  • /md1: 1.5TBディスク2台によるRAID5(1.35TiB)。写真やDVカムからの取り込みやノートマシンからのバックアップ、その他もろもろでいっぱい。
heliopora:~# ls /md1
lost+found/  nobu/

ディスクのやりくりがつかなくなっていたため、混乱がある。/md0に/backupと/homeが混在しているだけでなく、本来は/backup/nobu(日々のバックアップをしないファイル)にあるべき動画などのファイルが/home/kmf/nobuの中に入っている。これらを正しく/md1に移すと/md1/backupは非常に巨大に、/homeはそれなりに小さくなる。

手順

  1. 2TBのドライブを普通のドライブとしてフォーマットして/md1の中味を全部移す。
  2. /backupの2台のRAIDをもう一度初期化してlvmを入れる。1.35TiBくらいのRAID5+lvmになる。ここに2TBドライブに移しておいたデータを戻す。
  3. 空になった2TBのドライブを3台目のディスクとして/backupのRAIDに入れる。これで2.7TiBのRAID5+lvmになる。
  4. /md0の中味を/md1に移す。このとき/homeと/backupは別論理ボリュームとする。非常時に移しやすくするため。
  5. /md0のRAID5の台数を減らして再構築し、500GBのドライブを2台引退させる。500GBディスクは発熱が大きく、PATAなので置き換えていく。予備を確保する意味もある。
  6. 再構築したRAIDをlvmにして2.7TiBのlvmと結合し、3.1TiB程度のボリュームグループとする。/backupや/homeの容量が足りなくなったら適宜使う。
  7. 新しい大きめのディスクを買ってきたら3.1TiBのRAIDに追加してlvmの領域を増やし、さらに500GBドライブを引退させる。
  8. 今後買うのは2TB以上のドライブなので、ある段階で1.5TBx2を一度に引退させてRAID5のボリュームあたり容量も増やす。(こう考えると毎回違った容量を買っていく方がドライブの置き換えでアレイの容量が増えるので嬉しい感じ。)

コマンド

ここではターミナルへの入出力をそのまま貼っていくはずだったが、一度Terminal.appを落としてしまって大部分を失ったため、多くは後からの再現である。このため再現できていない部分や省略部があるため、「〜」で示している。また、細部の矛盾もあるはず。

  • 2TBのドライブを普通のドライブとしてフォーマットして/md1の中味を全部移す::
# fdisk /dev/sdd

このディスクのシリンダ数は 311465 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)

コマンド (m でヘルプ): n
〜
コマンド (m でヘルプ): p

Disk /dev/sdd: 2000.3 GB, 2000398934016 bytes
224 heads, 56 sectors/track, 311465 cylinders
Units = シリンダ数 of 12544 * 512 = 6422528 bytes

 デバイス Boot      Start         End      Blocks   Id  System
/dev/sdd1               1        1020     6397412   83  Linux
/dev/sdd2            1021        1340     2007040   82  Linux swap / Solaris
/dev/sdd3            1341      311465  1945104000   83  Linux

コマンド (m でヘルプ): q

# mkfs.ext3 /dev/sdd3
〜
# mount /dev/sdd3 -t ext3 /mnt
# mv /md1/nobu /mnt/
  • /backupの2台のRAIDをもう一度初期化してlvmを入れる。1.35TiBくらいのRAID5+lvmになる。ここに2TBドライブに移しておいたデータを戻す:
# pvcreate /dev/md1
  Physical volume "/dev/md1" successfully created
# vgcreate mddrives /dev/md1
# vgdisplay 
  --- Volume group ---
  VG Name               mddrives
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  5
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               1.35 TiB
  PE Size               4.00 MiB
  Total PE              355208
  Alloc PE / Size       0 / 0
  Free  PE / Size       355208 / 1.35 TiB
  VG UUID               pChh0E-L3gX-y42A-jiyz-wp1e-UaOa-aQtdfs
   
# lvcreate -l 355208 mddrives -n backup
  Logical volume "backup" created
# vgdisplay 
  --- Volume group ---
  VG Name               mddrives
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  5
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               1.35 TiB
  PE Size               4.00 MiB
  Total PE              355208
  Alloc PE / Size       355208 / 1.35 TiB
  Free  PE / Size       0 / 0
  VG UUID               pChh0E-L3gX-y42A-jiyz-wp1e-UaOa-aQtdfs
   
# lvdisplay
  --- Logical volume ---
  LV Name                /dev/mddrives/backup
  VG Name                mddrives
  LV UUID                wKXcnY-d1iC-MTqv-yJxE-EBJx-qpOC-z8Z1U0
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                1.35 TiB
  Current LE             355208
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     512
  Block device           253:0
   
# mkfs.ext4 /dev/mddrives/backup
〜
# mount /dev/mddrives/backup /md1
# mv /mnt/nobu /md1

引っかかったところ:

  • lvmをサポートするカーネルモジュール「デバイスマッパ」がロードされていないとlvmがうまく動かない。そんなときは modprove dm_mod する。
  • 起動時にlvmを認識しないディストリビューションがある。fsckが走る前の段階で以下のコマンドを実行するようにする:
/sbin/vgscan
/sbin/vgchange -ay

これでlvをちゃんと認識して起動する。

  • 空になった2TBのドライブを3台目のディスクとして/backupのRAIDに入れる。これで2.7TiBのRAID5+lvmになる:

Plamo4.2のmdadmはgrowに対応していないため、以前にコンパイルした新しいmdadmを使っている。

メモ。nfs exportしているドライブなどでumountがうまくいかないときはumount -lで遅延umountするとよい。

# umount -l /mnt
# fdisk /dev/sdd
〜
# fdisk -l /dev/sdd

Disk /dev/sdd: 2000.3 GB, 2000398934016 bytes
224 heads, 56 sectors/track, 311465 cylinders
Units = シリンダ数 of 12544 * 512 = 6422528 bytes

 デバイス Boot      Start         End      Blocks   Id  System
/dev/sdd1               1        1020     6397412   83  Linux
/dev/sdd2            1021        1340     2007040   82  Linux swap / Solaris
/dev/sdd3            1341      311465  1945104000   fd  Linux raid 自動検出
# mdadm --manage /dev/md1 --add /dev/sdd3
mdadm: added /dev/sdd3
# /old/sbin/mdadm --grow --raid-device=3 /dev/md1
mdadm: Need to backup 384K of critical section..
mdadm: ... critical section passed.
# cat /proc/mdstat 
Personalities : [raid6] [raid5] [raid4] 
md1 : active raid5 sdd3[2] sdb3[1] sda3[0]
      1454934656 blocks super 0.91 level 5, 64k chunk, algorithm 2 [3/3] [UUU]
      [>....................]  recovery =  0.0% (149248/1454934656) finish=974.4min speed=24874K/sec
      
md0 : active raid5 sdc3[1] hdd3[3] hdc3[2] hda3[0]
      1434427584 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU]
      
unused devices: 
# 

1日後:

# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] 
md1 : active raid5 sdd3[2] sdb3[1] sda3[0]
      2909869312 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
      
md0 : active raid5 sdc3[1] hdd3[3] hdc3[2] hda3[0]
      1434427584 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU]
      
unused devices: 
# fsck.ext4 /md1
〜
# pvresize /dev/md1
〜
# lvextend -l 710000 /dev/mddrives/backup 
〜
# vgdisplay 
  --- Volume group ---
  VG Name               mddrives
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  9
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               2.71 TiB
  PE Size               4.00 MiB
  Total PE              710417
  Alloc PE / Size       710000 / 2.71 TiB
  Free  PE / Size       417 / 1.63 GiB
  VG UUID               pChh0E-L3gX-y42A-jiyz-wp1e-UaOa-aQtdfs
   
# resize2fs /dev/mddrives/backup 
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/mddrives/backup to 〜〜〜〜〜 (4k) blocks.
The filesystem on /dev/mddrives/backup is now 〜〜〜〜〜 blocks long.
# 

引っかかったところ:
resize2fsがsegmentation faultしてresizeできなかった。最新のe2fsprogsコンパイルして使ったら解決。

  • /md0の中味を/md1に移す:
# mkdir /md1/nobu
# ls /md0 /md1
/md0:
backup/  home/  lost+found/  old/

/md1:
backup/  lost+found/  nobu/
# cpdumpfs /md0/backup/ /md1/backup/ > /root/cpdumpfs.log &
[1] 5226
# mv /md0/old /md1

/からのシンボリックリンクを/md0から/md1に移動

# rm /old /backup
# ln -s /md1/backup /backup
# ln -s /md1/old /old

以下予定:

# shutdown now     ← シングルユーザーモードに移行
# mv /home /md1
# rm /home
# ln -s /md1/home /home
# shutdown -r now
  • /md0のRAID5の台数を減らして再構築し、500GBのドライブを2台引退させる。500GBディスクは発熱が大きく、PATAなので置き換えていく。予備を確保する意味もある:

予定:

# mdadm --misc --stop /dev/md0           ← まず停止
# mdadm --create --verbose /dev/md0 --level=5 --raid-devices=2 /dev/hd[ac]3 ← 上から作っちゃう
# pvcreate /dev/md0                       ← lvmのpvにする
  • 再構築したRAIDをlvmにして2.7TiBのlvmと結合し、3.1TiB程度のボリュームグループとする。/backupや/homeの容量が足りなくなったら適宜使う:

予定。/homeを拡張する場合:

# vgextend mddrives /dev/md0           ← mddrivesに組み込む
# fsck.ext4 /home
# lvextend -l ????? /dev/mddrives/home
  • 新しい大きめのディスクを買ってきたら3.1TiBのRAIDに追加してlvmの領域を増やし、さらに500GBドライブを引退させる:

これも予定。現状ではsdcが500GB。これを外すと現状のsddがsdcになるのでsddを追加することになるはず。

まず/dev/sdd3を追加:

# fdisk /dev/sdd
# mdadm --add /dev/md1 /dev/sdd3
# mdadm --grow /dev/md1 --raid-devices=4
# 

最後に/dev/md0を外す:

# pvmove /dev/md0
# vgreduce mddrives /dev/md0

md0をオフにしたらmd1がmd0になって、lvmが困ったりしないのだろうか。ちょっとドキドキ。

  • 今後買うのは2TB以上のドライブなので、ある段階で1.5TBx2を一度に引退させてRAID5のボリュームあたり容量も増やす:

これも予定。1.5TBを引退させるのは新しいディスクとの置き換え。RAIDの中でディスクをやりとりするのでLVMをいじる必要はない。:

# fdisk /dev/sde
# fdisk /dev/sdf
# mdadm --add /dev/md1 /dev/sde3
# mdadm --add /dev/md1 /dev/sdf3
# mdadm /dev/md1 --fail /dev/sda3 --remove /dev/sda3
mdadm: set /dev/sda3 faulty in /dev/md1
mdadm: hot removed /dev/sda3
# 

1日くらいしてリビルドが完了してから

# mdadm /dev/md1 --fail /dev/sdb3 --remove /dev/sdb3
mdadm: set /dev/sdb3 faulty in /dev/md1
mdadm: hot removed /dev/sdb3
# 

これで置き換わる(またリビルドに1日かかる)。
md1のボリュームの増加は:

# mdadm --grow /dev/md1 -z max
# pvresize /dev/md1
# lvextend -l ????? /dev/mddrives/????

とする。

参考

md

lvm

RAID + lvm

その他

とっても便利そうだけどFreeNASも良い。