概要
自宅のサーバには単純な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はそれなりに小さくなる。
手順
- 2TBのドライブを普通のドライブとしてフォーマットして/md1の中味を全部移す。
- /backupの2台のRAIDをもう一度初期化してlvmを入れる。1.35TiBくらいのRAID5+lvmになる。ここに2TBドライブに移しておいたデータを戻す。
- 空になった2TBのドライブを3台目のディスクとして/backupのRAIDに入れる。これで2.7TiBのRAID5+lvmになる。
- /md0の中味を/md1に移す。このとき/homeと/backupは別論理ボリュームとする。非常時に移しやすくするため。
- /md0のRAID5の台数を減らして再構築し、500GBのドライブを2台引退させる。500GBディスクは発熱が大きく、PATAなので置き換えていく。予備を確保する意味もある。
- 再構築したRAIDをlvmにして2.7TiBのlvmと結合し、3.1TiB程度のボリュームグループとする。/backupや/homeの容量が足りなくなったら適宜使う。
- 新しい大きめのディスクを買ってきたら3.1TiBのRAIDに追加してlvmの領域を増やし、さらに500GBドライブを引退させる。
- 今後買うのは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
- 総合: Linux Raid Wiki
- mdadm最新版のダウンロード: http://www.kernel.org/pub/linux/utils/raid/mdadm/
- オンラインリサイズ。最初に見た方:HANZUBON.jp » Linux Software RAID (md)の onlie resize
- オンラインリサイズ。少し詳しい方: つねおの怠惰な非日常: Linux Software RAIDのオンライン容量拡張の検証
lvm
- 総合: LVM HOWTO
- さまざまな操作: Common Tasks
- ディスクを外す操作(入れ換え時など): Removing an Old Disk
- LVM2最新版のダウンロード: ftp://sources.redhat.com/pub/lvm2/
- 起動時にlvを認識しない問題:らっしーうぃき - サーバ構築/LVM/領域作成と切替
- LVMの構造とトラブルとの付き合い方: あ : LVM の復旧方法:
- e2fsadmを使うとLVMのオンラインリサイズが簡単らしい:Linux Logical Volume Manager (LVM) on Software RAID(でもこの記事は2002年のだし、うちにはe2fsadmは入ってない。lvm1の時代のツール?)
RAID + lvm
- 総合。too many metadata areas for pvresizeの対処なども: LVM-on-RAID - The Linux Documentation Project
その他
とっても便利そうだけどFreeNASも良い。