2011-08-25

Linux (Ubuntu 11.04)で2TB超のHDをソフトウェアRAID化する (3)

(承前)

sdbにRAID 1を構成

ソフトウェアRAIDの構築はmdadmコマンドを用いて行う。ログインしてからターミナルを開いてmdadmをインストールする。

$ sudo apt-get update
$ sudo apt-get install mdadm

依存関係によりpostfixがインストールされて何か質問されるので適当に答えておく。

RAID 1というのは2つのHDのうち1つが壊れても大丈夫というものだ。では実際に壊れたときにはどうすればいいのか?新しいHDを挿した状態でmdadmを実行できればいいのだ。このmdadmの実行をDVDでのレスキュー起動で行ってもよいが、1個のHDが壊れた状態でも起動できるようにすればもっと楽である。デフォルトでは壊れた状態では起動できなくなっている(これは壊れて起動した状態でもう1個が壊れると悲惨な状況になるからである)のでこれを修正する。

$ sudo vi /etc/initramfs-tools/conf.d/mdadm
BOOT_DEGRADED=true
$ sudo reboot

再起動後、sdbをsdaと全く同じようにパーティション分けする。

$ sudo parted /dev/sdb
(parted) mktable gpt
(parted) mkpart _ 1mib 2mib
(parted) toggle 1 bios_grub
(parted) mkpart _ 2mib 1gib
(parted) mkpart _ 1gib 3gib
(parted) mkpart _ 32gib 48gib

RAIDにするためにはパーティションのraidフラグを立てる必要がある。

(parted) toggle 2 raid
(parted) toggle 3 raid
(parted) toggle 4 raid
(parted) quit

いよいよRAID 1の作成だ。

$ sudo mdadm --create /dev/md0 --level=1 -n 2 --metadata=0.9 missing /dev/sdb2
$ sudo mdadm --create /dev/md1 --level=1 -n 2 --metadata=0.9 missing /dev/sdb3
$ sudo mdadm --create /dev/md2 --level=1 -n 2 --metadata=0.9 missing /dev/sdb4

ここで--metadataによってメタデータのフォーマットを0.9にしている点に注意してほしい。--metadataを省略すると1.2になるのだが、これでは後々問題が起こる。先回りして言うと、1.2でもほぼ問題なく最終段階まで設定が成功するのだが、apt-get upgradeでカーネルのアップデートが起こるとそれが失敗してしまうと言う致命的な問題が起こる。これはカーネルアップデートの際に実行されるupdate-grubが1.2フォーマットのメタデータを読めないために生じる問題である。ここでメタデータのフォーマットとして0.9を指定しなければならないというのを発見するのにはかなり苦労した。世のページでのソフトウェアRAIDの説明では古いバージョンのmdadmが使われており、その場合メタデータのフォーマット0.9がデフォルトとなるのでうまくいっていたのだ。

ソフトウェアRAIDの状況を確認しておく。

$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sdb4[1]
      16777152 blocks [2/1] [_U]
      
md1 : active raid1 sdb3[1]
      2097088 blocks [2/1] [_U]
      
md0 : active raid1 sdb2[1]
      1046464 blocks [2/1] [_U]
      
unused devices:

パーティションをフォーマットする。

$ sudo mkfs -t ext4 /dev/md0
$ sudo mkfs -t ext4 /dev/md2
$ sudo mkswap /dev/md1

ソフトウェアRAIDの設定を保存する。

$ sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
ARRAY /dev/md0 metadata=0.90 UUID=5f156622:2c294f4b:21de336c:78d7ee00
ARRAY /dev/md1 metadata=0.90 UUID=4e48e1ac:30d9556c:21de336c:78d7ee00
ARRAY /dev/md2 metadata=0.90 UUID=c9e99e19:4bd9a5d8:21de336c:78d7ee00

最近のLinuxでは、このまま再起動すると/dev/md0などの名前が変わってしまうので、初期ラムディスクの作り直しが必要である。

$ sudo update-initramfs -u
$ sudo reboot

再起動して/dev/md0などが存在することを確認する。

/dev/md0からブートできるように設定

fstabを編集して/dev/md?を用いてファイルシステムを組織するように設定する。blkidによって取得したUUIDを用いて/etc/fstabを書き換える。

$ sudo blkid /dev/md[012] | tee /tmp/uuid
/dev/md0: UUID="f45a96a8-8bcf-4a51-9cbe-76c2583ddd5d" TYPE="ext4"
/dev/md1: UUID="1e6eb27a-18d7-4735-9d78-f12c22be17eb" TYPE="swap"
/dev/md2: UUID="a0965d65-1de0-4876-8108-63ef9fe8e568" TYPE="ext4"
$ sudo vi /etc/fstab
UUID=a0965d65-1de0-4876-8108-63ef9fe8e568 /               ext4    noatime,user_xattr,errors=remount-ro  0  1
UUID=f45a96a8-8bcf-4a51-9cbe-76c2583ddd5d /boot           ext4    noatime,user_xattr  0   2
UUID=1e6eb27a-18d7-4735-9d78-f12c22be17eb none            swap    sw              0       0

次に/dev/md0からブートするようにgrubを設定する。

$ cd /etc/grub.d
$ sudo cp 40_custom 09_raid
$ sudo vi 09_raid
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
menuentry 'Ubuntu, with Linux 2.6.38-8-generic' --class ubuntu --class gnu-linux --class gnu --class os {
    recordfail
    insmod part_gpt
    insmod raid
    insmod mdraid09
    insmod ext2
    set root='(md0)'
    linux   /vmlinuz-2.6.38-8-generic root=UUID=a0965d65-1de0-4876-8108-63ef9fe8e568 ro   quiet splash vt.handoff=7
    initrd  /initrd.img-2.6.38-8-generic
}
$ sudo update-grub

09_raidファイルの内容は、/boot/grub/grub.cfgからコピーしてきたmenuentryをペーストして変更するとよいだろう。linux行のUUIDにはもちろん先ほどblkidで取得したrootパーティション/dev/md2のものを設定する。

ここの設定も正しいものを探り出すのに大変苦労した。まず、世のページではinsmod mdraidになっているものが多いが、メタデータのフォーマットによってmdraid1xmdraid09を使い分けなければならない。次に大苦労したのが(md0)という表現である。世のページでは(md/0)というのまで出てきて誤植かとも思ったのだが、実はメタデータが1.xのとき(md/0)で、0.9のとき(md0)を使うのだ!そんなことどこに書いてあるんだ!!

初期ラムディスクの再生成を忘れないように。

$ sudo update-initramfs -u

sdaからsdbへのコピー

rsyncの-xオプション(ファイルシステムの境界を越えない指定)を用いてコピーする。

$ sudo mkdir /mnt/md0 /mnt/md2
$ sudo mount /dev/md0 /mnt/md0
$ sudo mount /dev/md2 /mnt/md2
$ sudo rsync -ax / /mnt/md2
$ sudo rsync -ax /boot/ /mnt/md0

5行目の/boot/の終わりのスラッシュを忘れないように。

最後にgrubをインストールして再起動する。片方のHDが壊れてももう片方のHDで起動できるように両方のHDにgrubをインストールする必要がある。

$ sudo grub-install /dev/sda
$ sudo grub-install /dev/sdb
$ sudo reboot

あと一息。

(つづく)

0 件のコメント:

コメントを投稿