wiki:EC2ChrootLinux

アマゾン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)