Amazon EC2でCentOS 6.4のAMIを自前で作る方法

 2013/03/18
このエントリーをはてなブックマークに追加

既にCentOSはCentOSが提供する公式のAMIがあるのだが、自前でも作ってみた。(本当はやりたいことはもっと先にあるのですが、あまりに長いのでこれだけで1エントリにしときますw)

  • 2013/3/19追記。rpmのインストールのところで最低限必要そうなコンパイラ系のツールなどをインストールするように変更。iptablesをデフォルトで無効に修正

準備

まず作業をおこなうためのインスタンスを1つ用意する。OSはCentOSにする。細かいバージョンはあんまり関係ないがメジャーバージョンは合わせておいたほうが無難なので、適当にCentOS6のamiを使って作成する。インスタンスは、AMIを作成するリージョンに作成すること。なお後でEBSボリュームを作成するので、作ったインスタンスのアベイラビリティゾーンは調べておく。 また、作業中にwgetとec2-ami-toolsを使うので、もし導入済みでなければ ``` yum install wget ``` としておく。

AMIの元となるEBSボリュームを作成する

左メニューのVolumesを選択し、EBSボリュームを作成する。 この時前述の通りアベイラビリティゾーンは、作業用のインスタンスと同じにする。ディスクのサイズはとりあえず10Gにしておいた。

作ったボリュームをインスタンスにアタッチする

上記で作成したEBSボリュームを作業用のインスタンスにアタッチする。

アタッチが終わったら作業用のインスタンスにログインして、ディスクが追加されているか調べる。

cat /proc/partitions

とすると

major minor  #blocks  name
 202      144   10485760 xvdj
 202       64    8388608 xvde

のように表示されるはずだ。

ファイルシステムの作成

上記で確認したデバイスにファイルシステムを作成する。

mkfs.ext4 /dev/xvdj

とする。以下のように表示されるはずだ。

mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2684354560
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
     32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Writing inode tables: done                           
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 30 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

作業用インスタンスへのマウントとデバイスファイルの作成

これからこのディスクにOSをインストールしていくので、作業用インスタンスにマウントする。

mkdir -p /mnt/ami
mount  /dev/xvdj /mnt/ami

さらに、デバイスファイルを作る。

/sbin/MAKEDEV -d /mnt/ami/dev -x console
/sbin/MAKEDEV -d /mnt/ami/dev -x null
/sbin/MAKEDEV -d /mnt/ami/dev -x zero

またprocも作成してマウントする

mkdir /mnt/ami/proc
mount -t proc none /mnt/ami/proc

fstabの作成

mkdir /mnt/ami/etc
vi /mnt/ami/etc/fstab

として、以下を記述する。

/dev/xvde1   /         ext4    defaults       1 1
none       /dev/pts  devpts  gid=5,mode=620  0 0
none       /dev/shm  tmpfs   defaults        0 0
none       /proc     proc    defaults        0 0
none       /sys      sysfs   defaults        0 0

rpmパッケージの導入

まず、GPG-KEYを入手する。このファイル自体はAMIファイルに含める必要はない。

cd /mnt/ami
wget -O ../RPM-GPG-KEY-CentOS-6 http://ftp.riken.jp/Linux/centos/RPM-GPG-KEY-CentOS-6

として、AMIの元となるディスクの一階層上に保存する。 次にyumを動かすための設定ファイルを作成する。名前はなんでも良いがここではrepos.confとした。

cd /mnt/ami
vi ../repos.conf

内容は以下の通りだ。

[ami-base]
name=CentOS-6 - Base
mirrorlist=http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os
gpgcheck=1
gpgkey=file:///mnt/RPM-GPG-KEY-CentOS-6
[ami-updates]
name=CentOS-6 - Updates
mirrorlist=http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=updates
gpgcheck=1
gpgkey=file:///mnt/RPM-GPG-KEY-CentOS-6

ここまでできたらyumコマンドでインストールをおこなう。

パッケージのインストール

インストールは以下のコマンドでおこなう。なお併せてec2-ami-toolsもインストールしておく。

cd /mnt/ami/
setarch x86_64 yum -y -c ../repos.conf --installroot=/mnt/ami --disablerepo=* --enablerepo=ami-base,ami-updates groupinstall Core
setarch x86_64 yum -y -c ../repos.conf --installroot=/mnt/ami --disablerepo=* --enablerepo=ami-base,ami-updates install kernel
setarch x86_64 yum -y -c ../repos.conf --installroot=/mnt/ami --disablerepo=* --enablerepo=ami-base,ami-updates install wget gcc automake autoconf make patch zlib-devel openssh-clients
setarch x86_64 yum -y -c ../repos.conf --installroot=/mnt/ami --disablerepo=* --enablerepo=ami-base,ami-updates install ruby rsync
rpm -Uvh --root=/mnt/ami http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.noarch.rpm
wget -O usr/bin/ec2-metadata http://s3.amazonaws.com/ec2metadata/ec2-metadata
chmod +x usr/bin/ec2-metadata

起動時のiptablesの設定を無効にする

rm /mnt/ami/etc/rc{2,3,4,5}.d/S08iptables

として起動時にiptablesが起動しないようにする。

インスタンスを起動する際のカーネルの設定

引き続きインスタンス起動時のカーネルの設定をおこなう。

vi /mnt/ami/boot/grub/menu.lst

とする。新規にファイルが作成されるので、以下を記入する。 なお、カーネルのバージョンは、/mnt/ami/boot にあるファイルのバージョンとあわせること。

default=0
timeout=0
hiddenmenu
title CentOS6
        root (hd0)
        kernel /boot/vmlinuz-2.6.32-358.2.1.el6.x86_64 ro root=/dev/xvde1
        initrd /boot/initramfs-2.6.32-358.2.1.el6.x86_64.img

ネットワークの設定

ネットワークの設定をおこなう。編集するファイルは3つだ。

vi /mnt/ami/etc/sysconfig/network

とする。内容は以下にする。

NETWORKING=yes 

さらに

vi /mnt/ami/etc/sysconfig/network-scripts/ifcfg-eth0

として、内容は以下を記入する。

DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
TYPE=Ethernet
USERCTL=yes
PEERDNS=yes
IPV6INIT=no

また

vi /mnt/ami/etc/hosts

とする。これは既存でファイルが存在するので、2行目の::1の行を削除する。

selinuxの無効化

vi /mnt/ami/etc/sysconfig/selinux 

とし、

SELINUX=enforcing

の箇所を

SELINUX=disabled

として無効化する。

sshの設定

vi /mnt/ami/etc/ssh/sshd_config

とし、以下のPermitRootLoginとUseDNSの2行を以下のように変更する。

PermitRootLogin without-password 
UseDNS no

さらに、インスタンス起動時に公開鍵を取得してログインできるようにするために以下の設定をおこなう。

vi /mnt/ami/etc/rc.local

既にファイルが存在しているので、以下をまるごと追記する。なお、追記せず作業を行なっているインスタンスの/etc/rc.localをコピーしても大丈夫なはずだ。以下を追記しよう(2013/3/23修正)

if [ ! -d /root/.ssh ]; then
  mkdir -m 0700 -p /root/.ssh
  restorecon /root/.ssh
fi
# Get the root ssh key setup
ReTry=0
while [ ! -f /root/.ssh/authorized_keys ] && [ $ReTry -lt 5 ]; do
  sleep 2
  curl -f http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key > /root/.ssh/authorized_keys
  ReTry=$[Retry+1]
done
chmod 600 /root/.ssh/authorized_keys && restorecon /root/.ssh/authorized_keys

不要ファイルの削除

yumコマンドを上記で使っているので不要ファイルを削除する。

cd /mnt/ami
setarch x86_64 yum -y -c ../repos.conf --installroot=/mnt/ami --disablerepo=* --enablerepo=ami-base,ami-updates clean all 

仕上げ作業

ここまでできたらあとはAMIを作成する作業だ。 まずは、umountする。

cd /mnt
umount /mnt/ami/proc
umount /mnt/ami

次に、作業用のインスタンスに割り当てているボリュームをデタッチする。

デタッチしたボリュームをもとにSnapshotを作成する。

このスナップショットからAMIを作成する。

適宜内容を記入する。 Nameには分かりやすい名前を。ArchitectureはX86_64を、Kernel IDにはaki-44992845を設定する。

以上で完了だ。

AMIからインスタンスを作成して確認

AMIが完成したらインスタンスを作成して確認しよう。 ログインして、

cat /etc/redhat-release

として以下のように表示されればOKだ。

CentOS release 6.4 (Final)

なお、インスタンスが正常に起動しない場合は、インスタンス名の上で右クリックすると起動ログが表示できるのでそこから原因を探ること。

 2013/03/18
このエントリーをはてなブックマークに追加