2009年5月4日月曜日

Linuxサーバーのシステム部分だけRAID1する その2

前の続きです。http://amzn1.blogspot.com/2009/05/linuxraid1.html

sdbから起動できるはずが、途中で止ってしまいました。エラーを見てみると、grubのmenu.listに書いてあるHDDのUUIDが違うと言っているようでした。たぶん、起動ディスクとして認識されているのがsdaだけで、sdbは起動ディスクとして認識されていないようでした。

と言うわけで解決法ですが、/dev/md*をマウントした/mntのgrubのmenu.listを書き換えるのが正しい方法のようです。まず、シングルモードでログインして、

# cd /mnt/boot/grub
# cp -a menu.list
# vi menu.lst

title Ubuntu 8.04.2, kernel 2.6.24-23-server
root (hd0,0)
kernel /vmlinuz-2.6.24-23-server root=/dev/md1 ro quiet splash
initrd /initrd.img-2.6.24-23-server
quiet

title Ubuntu 8.04.2, kernel 2.6.24-23-server (recovery mode)
root (hd0,0)
kernel /vmlinuz-2.6.24-23-server root=/dev/md1 ro single
initrd /initrd.img-2.6.24-23-server

赤字の所を/boot/grub/menu.lstと同様にして書き換え。途中でkernelのアップデートがあったので、2.6.19→2.6.23になっています。
この様に書き換えてから再起動すると、sdbから起動できます。シングルモードではなく、普通にログインできます。


sdbから立ち上がっているか確認
$ mount | grep md
/dev/md1 on / type ext3 (rw,relatime,errors=remount-ro)
/dev/md0 on /boot type ext3 (rw,relatime)
/dev/md2 on /home type ext3 (rw,relatime)
sdaをRAIDに参加させるために、パーティションタイプを変更

sudo fdisk /dev/sda

パーティションタイプのコマンドはfd。最終的には下のようになる。
Device Boot Start End Blocks Id System
/dev/sda1 1 24 192748+ fd Linux raid autodetect
/dev/sda2 25 146 979965 82 Linux swap / Solaris
/dev/sda3 * 147 2578 19535040 fd Linux raid autodetect
/dev/sda4 2579 3738 9317700 5 Extended
/dev/sda5 2579 3738 9317668+ fd Linux raid autodetect

sdaをRAIDに参加させる。

sudo mdadm /dev/md0 -a /dev/sda1
sudo mdadm /dev/md1 -a /dev/sd3
sudo mdadm /dev/md1 -a /dev/sda3
sudo mdadm /dev/md2 -a /dev/sda5
RAIDに参加させられると、自動的にファイルがコピーされていく。
cat /proc/mdstatで状況を確認できる。

sdbにgrubをインストール。
# grub-install --no-floppy /dev/sdb
# grub
grub> root (hd0,0)
grub> setup(hd0)
grub> root(hd1,0)
grub> setup(hd1)
grub> quit


/boot/grub/menu.lstを書き換え。
vi grub/menu.lst
# kopt=root=/dev/md1 ro
mdadm.confに今の状況を書き加えておく。以前のARRAY *を削除した後、
mdadm --detail-scan >> /etc/mdadm/mdadm.conf
mdadm --detail --scan >> /etc/mdadm/mdadm.conf

こうしてシステム部分だけRAIDで動くサーバーが完成しました。


今、メインRAIDがsdbで、あまり嬉しくないので、メインをsdaに変更します。
まず、sdbを外して(物理的な意味で)sdaだけで起動します。その後、一度電源を落とし、sdbを繋いで起動します。そうすると、mdデバイスからsdbが外されてしまうので、

# mdadm /dev/md1 -a /dev/sdb1


でRAIDに参加させなおすと
# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sda5[0] sdb5[1]
9245312 blocks [2/2] [UU]

md1 : active raid1 sda3[0] sdb2[1]
19534976 blocks [2/2] [UU]

md0 : active raid1 sda1[0] sdb1[1]
192640 blocks [2/2] [UU]

unused devices:
となって、メインがsdaになります。

Linuxサーバーのシステム部分だけRAID1する

共有ファイルサーバーのシステム部分だけRAID1にして、起動だけは確実に出来るような設定にする。本当はデータ部分もRAIDにした方が良いのだろうけど、ハードディスクがないのでまた今度。

今手元にあるのは、30GB(sda)と320GB(sdb)のハードディスクです。sdaがプライマリーマスター、sdbがプライマリースレーブとなっています。
まず、sdaにUbuntu8.04LTSをインストール。これは普通に行います。パーティションは下のようにしました。

sda1 /boot 200MB
sda2 swap 1.5GB
sda3 / 20GB
sda5 /home 9GB
/bootを先頭に持ってくるのがポイントだったりするらしい。最も、今のマザーボードではそれほど気にしなくても良いらしいが。
参考http://www.miloweb.net/partition.html

このときに、OSインストール時にsdbのパーティションも切っておきます。

sdb1 raid 200MB /bootとRAID1
sdb2 raid 20GB /(ルート)とRAID1
sdb3 /home/samba 290GB sambaにmount
sdb5 raid 9GB /homeとRAID1

OSインストールが終わったら、以下の手順でRAID1を構築します。
  1. sdbのみ参加させる形のRAID1構築
  2. sdaのデータをsdbにコピー
  3. sdbで起動してsdaをRAID1に参加
  4. sdb外して起動させてみる

1. sdbのみ参加させる形のRAID1構築
まず、mdデバイスを作成しておきます。コマンドはmknod
sudo mknod /dev/md0 b 9 0
sudo mknod /dev/md1 b 9 1
sudo mknod /dev/md2 b 9 2
デバイスドライバ番号は9。マイナー番号はmdの番号に相当するものを付ける。


先に切っておいたパーティションをRAID1に参加させます。使うコマンドはmdadm
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 missing /dev/sdb1 /bootパーティション
sudo mdadm --create /dev/md1 --level=1 --raid-devices=2 missing /dev/sdb2 / パーティション
sudo mdadm --create /dev/md2 --level=1 --raid-devices=2 missing /dev/sdb5 /homeパーティション

mdデバイスとsdbの番号の対応が悪いので、きちんと覚えておかなければ。
最初に1台だけ参加させて、後でもう1台追加するときは、missingと書けば良い。

ファイルシステムの構築
# mkfs.ext3 -f /dev/md0
# mkfs.ext3 -f /dev/md1
# mkfs.ext3 -f /dev/md2

ここまでの設定を/etc/mdadm/mdadm.confに記入しておきます。

echo 'DEVICE /dev/sda* /dev/sdb*' >> /etc/mdadm/mdadm.conf
mdadm --detail --scan >> /etc/mdadm/mdadm.conf

2.sdaのデータをsdbにコピー
マシンを再起動してシングルユーザーモードでログインします。立ち上がった瞬間にESCキー。
ログインしたら、mdデバイスをマウントします。今回は/mnt以下にマウントします。

# cd /mnt/
# mkdir ./boot
# mkdir ./home
# mount /dev/md1 /mnt
# mount /dev/md0 /mnt/boot/
# mount /dev/md2 /mnt/home/

sdaのデータを対応する場所へコピーします。procとsysは除きました。

# cp -a bin/ etc/ lib/ opt/ srv/ var/ vmlinuz cdrom initrd media root/ tmp/ dev/ initrd.img sbin/ usr/ ./mnt/ &
# cp -a /home/ ./mnt/home/ &
# cp -a /boot/ ./mnt/boot/ &

# mkdir proc
# mkdir sys


3.sdbで起動してsdaをRAID1に参加
sdaのgrubを修正して、sdbから起動します。

# cd /boot/
# mv initrd.img-2.6.24-19-server initrd.img-2.6.24-19-server-raid-pre
# mkinitramfs -r /dev/md1 -o initrd.img-2.6.24-19-server
cd ./grub/
cp -a menu.lst menu.lst20090503
vi menu.lst

menu.listに追記します。(赤字の部分)

title Ubuntu 8.04.2, kernel 2.6.24-19-server(raid)
root (hd1,0)
kernel /vmlinuz-2.6.24-19-server root=/dev/md1 ro quite splash
initrd /initrd.img-2.6.24-19-server
quiet

title Ubuntu 8.04.2, kernel 2.6.24-19-server
root (hd0,0)
kernel /vmlinuz-2.6.24-19-server root=UUID=b5724689-ee45-46a2-adf9-6790c032efd7 ro quiet splash
initrd /initrd.img-2.6.24-19-server
quiet

…省略

このままだと電源を落としたときにsdbがアンマウントされてしまうので、/etc/fstabに追記します。(赤字の部分)

$ cat /etc/fstab
# /etc/fstab: static file system information.
#
#
proc /proc proc defaults 0 0
/dev/sda3 / ext3 relatime,errors=remount-ro 0 1
/dev/sda1 /boot ext3 relatime 0 2
/dev/sda5 /home ext3 relatime 0 2
/dev/sdb3 /home/samba ext3 relatime 0 2
/dev/sda2 none swap sw 0 0
/dev/scd0 /media/cdrom0 udf,iso9660 user,noauto,exec,utf8 0 0

/dev/md1 /mnt ext3 relatime,errors=remount-ro 0 2
/dev/md0 /mnt/boot ext3 relatime 0 2
/dev/md2 /mnt/home ext3 relatime 0 2

/mnt/etc/fstabにも追記します。
/mnt/etc$ cat fstab
# /etc/fstab: static file system information.
#
#
proc /proc proc defaults 0 0
/dev/md1 / ext3 relatime,errors=remount-ro 0 1
/dev/md0 /boot ext3 relatime 0 2
/dev/md2 /home ext3 relatime 0 2
/dev/sdb3 /home/samba ext3 relatime 0 2
/dev/sda2 none swap sw 0 0
/dev/scd0 /media/cdrom0 udf,iso9660 user,noauto,exec,utf8 0 0

これで再起動すればシングルユーザーモードで起動するはずなのですが、起動しませんでした。原因は明日調べます。

参考 このサイトの流れに沿って設定しました。
http://qos.mine.nu/2008/11/raid1-on-etch.html
http://nabe.blog.abk.nu/0301