アマゾンEC2でchrootなLinuxを動かす
EC2がどうも怖いのは、インスタンスをシャットダウンするとディスクが消えて無くなることです。 そのため、適宜S3にバックアップをしなさいという話になっています。 長らく貧弱な自前サーバを運用してきた身としては、どうも居心地の悪い不安感がつきまといます。 完璧なデータセンターで運用されているはずなので、マシントラブルでコケて落ちることなんて皆無なんでしょうけれどね。
それで、EC2のオプションサービスであるEBS(Elastic Block Store)というディスクにLinuxを構築することにします。 EBS上にLinuxを構築したとしても、そのままでは起動することができません。 そこで、起動の途中で/sbin/initが動いた瞬間に、EBS上のLinuxにすげ替える戦略で行きます。 この戦略は、昔から多くの人々がやっているし、そもそも通常のLinuxを起動するプロセスでもinitrdから本体への移行で使われています。
適当なLinuxのAMIを元にして、自前のAMIを作ります。 /sbin/initは、/sbin/init-origという名前に変更します。 /sbin/initとして、以下のスクリプトを置きます。 ファイルのモードは、0755など実行可能にします。
#!/bin/sh -x DEV=/dev/sdf1 PATH=/usr/sbin:/usr/bin:/sbin:/bin if [ "`e2label $DEV`" != "chroot" ]; then exec /sbin/init-orig fi mount $DEV /mnt cd /mnt pivot_root . mnt cd / if [ -f /sbin/init-orig ]; then exec /sbin/init-orig fi exec < /dev/console > /dev/console 2>&1 umount -a > /dev/null 2>&1 umount /mnt/proc > /dev/null 2>&1 umount /mnt/sys > /dev/null 2>&1 umount /mnt/dev > /dev/null 2>&1 exec /bin/sh -c "umount /mnt; exec /sbin/init"
/dev/sdfにEBSがアタッチされ、/dev/sdf1にext3なファイルシステムがあり、そのボリュームラベルが「chroot」である場合に限り、このファイルシステム上のLinuxを起動します。 いずれかを満たさない場合は、通常通りに起動します。 chroot云々と言っていますが、実際にはchrootは行わず、pivot_rootを行っています。 最初にあったルートファイルシステムをアンマウントするのに、ちょっと苦労をしています。 この部分は、元にしたAMIのLinuxの種類によって調整が必要かも知れません。 上記の例は、Ubuntu 9.04でうまく動作しています。
(2009/5/3 - sgk)
