最近 AWS Marketprice で CentOS 7 の HVM の AMI が使えるようになりましたが、CentOS 6 の HVM の AMI は AWS Marketprice にはまだありません。
CentOS 6 でも t2.micro インスタンスが使いたかったので、ゼロから AMI を作成してみました。
概ね参考記事の手順そのままですが、極力最小の手順にしています。
参考記事
作業用インスタンスとボリュームの作成
Management console で次の手順で作業用のインスタンスと EBS を作成します。
- CentOS 6.5 x64 PV の t1.micro インスタンスを作成する
- AWS Marketprice にあります
- 新規 EBS を作成する
- インスタンスと同じ AZ に作成する
- EBS を インスタンスにアタッチする
作業用インスタンスでディスクイメージの作成
作業用インスタンスに ssh でログインし、アタッチした EBS に CentOS 6.5 x64 のディスクイメージを作成します。
フォーマットとマウント
messages の最後の方にアタッチされた EBS のデバイス名があるので確認します。
tail /var/log/messages
Oct 25 12:11:57 ip-xx-xx-xx-xx kernel: blkfront: xvdj: barriers disabled Oct 25 12:11:57 ip-xx-xx-xx-xx kernel: xvdj: unknown partition table
わからなければ fdisk -l
で調べてください。
パーティションを作成します。parted は使い方を知らないので fdisk を使います。
fdisk /dev/xvdj
フォーマットします。
mkfs.ext4 /dev/xvdj1
パーティションにラベルを付けます。下記の手順では /
というラベルを付けています。
e2label /dev/xvdj1 /
マウントします。
mount /dev/xvdj1 /mnt cd /mnt
CentOS 6.5
ディスクのマウント先である /mnt に yum で CentOS 6.5 をインストールします。
作業用のインスタンスも CentOS 6.5 なので yum の設定ファイルを作る必要はありません(作業用インスタンスの設定がそのまま使えます)。
acpid を入れているのは、入れておかないと Management console から Stop や Reboot したときに正常なシャットダウンやリブートが行なわれないような気がするからです(KVM はそうだった気がする)。
yum -y --installroot=/mnt --releasever=6.5 install @core kernel grub acpid
grub
grub.conf を作成します。console=ttyS0
を追加しておかないと Management console の Get System Log でブートのログが表示されません。
cat <<EOS> boot/grub/grub.conf default=0 timeout=0 hiddenmenu title CentOS 6.5 x86_64 root (hd0,0) kernel /boot/vmlinuz-$(rpm --root=/mnt -q --queryformat "%{version}-%{release}.%{arch}" kernel) ro root=LABEL=/ console=ttyS0 initrd /boot/initramfs-$(rpm --root=/mnt -q --queryformat "%{version}-%{release}.%{arch}" kernel).img EOS
menu.lst のシンボリックリンクを作成します。
ln -s grub.conf boot/grub/menu.lst
grub をインストールします。まずは grub の stage ファイルをコピーします。
cp -a usr/share/grub/x86_64-redhat/* boot/grub/
作業用インスタンスの /dev を /mnt/dev にマウントします。
mount --bind /dev /mnt/dev
/mnt に chroot して grub をインストールします。
cat <<EOS | chroot /mnt grub --batch device (hd0) /dev/xvdj root (hd0,0) setup (hd0) EOS
/mnt/dev をアンマウントします。
umount /mnt/dev
SELinux
SELinux を無効にします。
sed -i '/^SELINUX=/c SELINUX=disabled' etc/selinux/config
IPv6
IPv6 を無効にします。
cat <<EOS>> etc/sysctl.conf # ipv6 disable net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 EOS
fstab
fstab を作成します。
cat <<EOS>> etc/fstab LABEL=/ / ext4 defaults 1 1 devpts /dev/pts devpts gid=5,mode=620 0 0 tmpfs /dev/shm tmpfs defaults 0 0 proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 EOS
いろいろコピー
作業用のインスタンスからいろいろコピーします。
\cp -a /etc/sysconfig/network-scripts/ifcfg-eth0 etc/sysconfig/network-scripts/ifcfg-eth0 \cp -a /etc/sysconfig/network etc/sysconfig/network \cp -a /etc/rc.d/rc.local etc/rc.d/rc.local \cp -a /etc/ssh/sshd_config etc/ssh/sshd_config
アンマウント
ディスクイメージの作成は終わったので /mnt をアンマウントします。
cd umount /mnt
AMI 作成
Management console で次の手順で AMI を作成します。
- EBS ボリュームをインスタンスからデタッチする
- EBS ボリュームからスナップショットを作成する
- スナップショットから AMI を作成する
- 以下の箇所に注意して作成します
- Architecture: x86_64
- Virtualization type: Hardware-assisted virtualization
- Root device name: /dev/sda1
- Kernel ID: Use default
- RAM disk ID : Use default
- 以下の箇所に注意して作成します
AMI からインスタンスを作成
作成した AMI から t2.micro インスタンスを作成し、普通に起動すれば成功です。
なぞ?
AWS で実際に作業する前に、手順の確認のために同じような方法で VirtualBox で既存のゲストにアタッチしたディスクにブート可能な CentOS 6.5 のディスクイメージを作ってみたのですが、なぜか初回起動時に SELinux が自動的に enforcing になりました。
しかも、ssh はもとよりコンソールからもログインできません(ログインすると直後に切断される)。
シングルユーザーモードでブートして /etc/selinux/config を見てみると enforcing になっていました。もちろんディスクイメージの作成時には /etc/selinux/config を disabled に書き換えています。タイムスタンプを見てみると、ブート時の時刻になっています。
ディスクイメージに作成時に selinux-policy と selinux-policy-targeted を削除しておいたり、あるいは、カーネルパラメータで enforcing=0 と指定しておいたりすれば大丈夫ですが、VirtualBox で初回起動時に SELinux が必ず有効になるような機構でもあるのでしょうか。。。?