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
やっていることは、
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 どこまで効果的かは未知数です。
もし何か問題が発生したとしても、すべて自己責任でお願いします!