Amazon Linux AMIのrootパーティションをRAID1にしてみた

ふと思いついて、Amazon Linux AMIのrootパーティションをRAID1にしてみました。

準備

作業用インスタンスを起動(ami-e47acbe5 amzn-ami-pv-2012.03.1.x86_64-ebsをベースにしました)。

$ ec2-run-instances -g SecurityGroupName -k KeypairName -b /dev/sdb=ephemeral0 -b /dev/sdc=ephemeral1 -b /dev/sdd=ephemeral2 -b /dev/sde=ephemeral3 -b /dev/sda2=:10:true -b /dev/sda3=:10:true -b /dev/sdf=snap-54601b39 -b /dev/sdg=:1:true -t m1.large ami-e47acbe5

block deviceは下記のようになる

  • /dev/sda1 root volume
  • /dev/sda2,3*1 raid1用10GB*2
  • /dev/sdb-e ephemeral0-3
  • /dev/sdf root volumeと同じsnapshotから作成
  • /dev/sdg /boot用1GB

インスタンスが起動したらsshでログインして、sudo su - でrootになっておく。

$ sudo su -
# df /
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/xvdf              8362320   1060392   7218064  13% /
tmpfs                  3817396         0   3817396   0% /dev/shm
/dev/xvdb            433455904    203012 411234588   1% /media/ephemeral0

/dev/sda1は使われず、/dev/sdfの方から起動しているようです。

RAID1作成

/dev/sda2と/dev/sda3で、RAID1ボリュームを作成し、/dev/sda1からRAIDボリュームにddでイメージをコピーします。

# mdadm --create /dev/md127 --level=raid1 --raid-devices=2 /dev/sda2 /dev/sda3 --metadata=0.90
mdadm: array /dev/md127 started.
# time dd if=/dev/sda1 of=/dev/md127
16777216+0 records in
16777216+0 records out
8589934592 bytes (8.6 GB) copied, 1355.38 s, 6.3 MB/s

real    22m35.385s
user    0m1.457s
sys     2m4.536s

m1.largeでもしばらく時間がかかるので、ターミナルはそのままで先に次のステップに行っても良い。

/boot用パーティション作成

# mkfs /dev/sdg
mke2fs 1.42 (29-Nov-2011)
(略)
# mount /dev/sdg /mnt/
# cp -a /boot/ /mnt/
# vi /mnt/boot/grub/grub.conf
# diff /boot/grub/grub.conf /mnt/boot/grub/grub.conf
9c9
< kernel /boot/vmlinuz-3.2.12-3.2.4.amzn1.x86_64 root=LABEL=/ console=hvc0
---
> kernel /boot/vmlinuz-3.2.12-3.2.4.amzn1.x86_64 root=/dev/md127 console=hvc0
# umount /mnt

RAIDボリューム調整

以下のようにRAID ボリューム内を調整して、シャットダウンし、stop状態とする。

# mount /dev/md127 /mnt
# cd /mnt
# rm -rf boot
# mkdir .boot
# ln -s .boot/boot .
# vi etc/fstab
< LABEL=/     /           ext4    defaults,noatime  1   1
---
> /dev/md127  /           ext4    defaults,noatime  1   1
> /dev/sda1   /.boot      ext4    defaults,noatime  1   1
# cd 
# umount /mnt
# e2fsck -f /dev/md127
e2fsck 1.42 (29-Nov-2011)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/: 30207/524288 files (0.3% non-contiguous), 254146/2097152 blocks
# resize2fs /dev/md127
resize2fs 1.42 (29-Nov-2011)
Resizing the filesystem on /dev/md127 to 2621424 (4k) blocks.
The filesystem on /dev/md127 is now 2621424 blocks long.
# mdadm --misc --stop /dev/md127
mdadm: stopped /dev/md127
# shutdown -h now

やっていることは、

  • RAIDボリュームのマウント
  • /boot -> /.boot/boot となるようにsymlinkを張っておく(yumコマンドなどでカーネルのupdateが行えるようにするため)
  • fstabの書き換え (rootは/dev/md127、/boot用パーティション(/dev/sda1)を/.bootにマウント)
  • アンマウント
  • リサイズ
  • RAIDのstop
  • インスタンスシャットダウン

AMIの作成

EBSボリュームが

  • /dev/sda1 /boot用1GB
  • /dev/sda2 raid1用10GB
  • /dev/sda3 raid1用10GB

となるように、元々ついていたsda1,sdf,sdgのボリュームをデタッチ、sdgについていたボリュームをsda1にアタッチする(Volume IDを間違えないように)。
入れ替えが終わったら、停止したままでCreateImageを行います。
作業例)

$ ec2-describe-instances i-cfdf4dcf | grep ^BLOCK
BLOCKDEVICE     /dev/sda1       vol-882942e6    2012-04-23T19:42:07.000Z        true
BLOCKDEVICE     /dev/sda2       vol-942942fa    2012-04-23T19:42:07.000Z        true
BLOCKDEVICE     /dev/sda3       vol-bc2942d2    2012-04-23T19:42:07.000Z        true
BLOCKDEVICE     /dev/sdf        vol-c42942aa    2012-04-23T19:42:07.000Z        true
BLOCKDEVICE     /dev/sdg        vol-d02942be    2012-04-23T19:42:07.000Z        true
$ ec2-detach-volume vol-d02942be
$ ec2-detach-volume vol-882942e6
$ ec2-detach-volume vol-c42942aa
$ ec2-attach-volume vol-d02942be -i i-cfdf4dcf -d /dev/sda1
$ ec2-describe-instances i-cfdf4dcf | grep ^BLOCK
BLOCKDEVICE     /dev/sda2       vol-942942fa    2012-04-23T19:42:07.000Z        true
BLOCKDEVICE     /dev/sda3       vol-bc2942d2    2012-04-23T19:42:07.000Z        true
BLOCKDEVICE     /dev/sda1       vol-d02942be    2012-04-23T19:44:36.000Z        false
$ ec2-create-image i-cfdf4dcf -n RAID
IMAGE   ami-86c17187

インスタンス起動

AMIがpendingからavailableに変わったら、インスタンスを起動してみます。

$ ec2-run-instances -g SecurityGroupName -k KeypairName -t m1.large ami-86c17187
$ ssh ec2-user@xxx.xxx.xxx.xxx
$ df /
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/md127            10457484   1081548   9271108  11% /

ちゃんと/dev/md127から起動してますね。

最後に

片方のvolumeをforce detachしてもちゃんと動いてましたが、rebootしたら起動しなくなりましたw どこまで効果的かは未知数です。
もし何か問題が発生したとしても、すべて自己責任でお願いします!

*1: 本当は/dev/sda2や/dev/sda3を使うのはあまり良くないのだが(m1.small, c1.mediumでswapとかぶるので)

*2:元が8GBなので、それよりも大きい任意のサイズを指定する