EC2 で CentOS 6 の HVM の AMI をゼロから作る

最近 AWS Marketprice で CentOS 7 の HVM の AMI が使えるようになりましたが、CentOS 6 の HVM の AMI は AWS Marketprice にはまだありません。

CentOS 6 でも t2.micro インスタンスが使いたかったので、ゼロから AMI を作成してみました。

概ね参考記事の手順そのままですが、極力最小の手順にしています。

参考記事

作業用インスタンスとボリュームの作成

Management console で次の手順で作業用のインスタンスと 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 に yumCentOS 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 が必ず有効になるような機構でもあるのでしょうか。。。?