2011年7月29日金曜日

"SUZ-LAB謹製 CentOS AMI 6.0.0"の作り方

スズキです。

下記の通り、久しぶりに「0」からAMIを作成したので、
SUZ-LAB謹製 CentOS AMI (6.0.0 32bit ap-northeast-1)
作り方をメモしておきます。

EC2の起動とAMI作成イメージ用EBSの作成&アタッチ

まずは作業をするEC2を起動しますが、
いろいろと参考になる下記のRHEL-6.0で起動しておきます。


そして"CentOS 6.0"のイメージとなるEBSを下記のように作成してアタッチします。



ここでは、"/dev/sdb1"でアタッチしてますが、
RHEL-6.0では"/dev/xvdb1"となっているので注意が必要です。


EBS(/dev/xvdb1)にファイルシステム(ext4)を作成

アタッチしたEBS(/dev/xvdb1)を下記のように
"mkfs.ext4"を使ってファイルシステムを作成します。

# ls /dev/xvdb1 
/dev/xvdb1

# mkfs.ext4 /dev/xvdb1 
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
393216 inodes, 1572864 blocks
78643 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1610612736
48 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

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

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


EBS(/dev/xvdb1)をマウントしてデバイスファイルを作成

上記のEBS(/dev/xvdb1)を適当なディレクトリにマウントして、
その中に下記のようにデバイスファイルを作成します。

# mkdir /mnt/ami

# mount -t ext4 /dev/xvdb1 /mnt/ami/

# /sbin/MAKEDEV -d /mnt/ami/dev -x console
MAKEDEV: mkdir: File exists
MAKEDEV: mkdir: File exists

# /sbin/MAKEDEV -d /mnt/ami/dev -x null

# /sbin/MAKEDEV -d /mnt/ami/dev -x zero

# ls /mnt/ami/dev/
console  null  tty  zero


"/etc/fstab"を作成して"proc"ファイルシステムをマウント

下記のように"/mnt/ami/etc/fstab"を作成し、
"/mnt/ami/proc"に"proc"ファイルシステムをマウントします。

# mkdir /mnt/ami/etc

# cat /mnt/ami/etc/fstab
/dev/xvda1  /         ext4    defaults        1 1
none        /proc     proc    defaults        0 0
none        /sys      sysfs   defaults        0 0
none        /dev/pts  devpts  gid=5,mode=620  0 0
none        /dev/shm  tmpfs   defaults        0 0

# mkdir /mnt/ami/proc

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


"yum"で"CentOS 6.0"のパッケージ(Core)とカーネルをインストール

"CentOS 6.0"用の"yum.conf"を作成して、"yum"でCoreパッケージをインストールします。
また、"User Provided Kernel"で利用するカーネルもインストールしておきます。

# mv /etc/yum.repos.d /etc/yum.repos.d.bak

# yum clean all
Loaded plugins: amazon-id, security
Cleaning up Everything

# cat /mnt/yum.conf
[base]
name=CentOS-6 - Base
baseurl=http://mirror.centos.org/centos/6/os/i386/
[updates]
name=CentOS-6 - Updates
baseurl=http://mirror.centos.org/centos/6/updates/i386/

# yum -c /mnt/yum.conf --installroot=/mnt/ami/ -y groupinstall Core

# cp /mnt/ami/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 /etc/pki/rpm-gpg/

# yum --installroot=/mnt/ami/ -y install kernel


"User Provided Kernel"の設定(/boot/grub/menu.lst)

上記のカーネルを利用するように"/mnt/ami/boot/grub/menu.lst"を
下記のように記述します。

下記のカーネルイメージ(AKI)を利用すると"/boot/grub/menu.lst"に記載された、
ユーザーが提供するカーネルが利用されます。
pv-grub-hd0_1.02-i386.gz.manifest.xml
# cat /mnt/ami/boot/grub/menu.lst
default=0
timeout=0
hiddenmenu
title SUZ-LAB CentOS 6
root (hd0)
kernel /boot/vmlinuz-2.6.32-71.29.1.el6.i686 ro root=/dev/xvda1
initrd /boot/initramfs-2.6.32-71.29.1.el6.i686.img


ネットワークの設定

ネットワークの設定は、下記のようにDHCPを利用するようにし、IPv6は無効にします。

# cat /mnt/ami/etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=localhost.localdomain

# cat /mnt/ami/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=on

# cat /mnt/ami/etc/hosts
127.0.0.1   localhost localhost.localdomain


SELinuxの設定

SELinuxは下記のように無効にしておきます。

# cat /mnt/ami/etc/sysconfig/selinux
SELINUX=disabled
SELINUXTYPE=targeted


SSHの設定

起動時にAWSから公開鍵を取得し、事前に作成した秘密鍵でログインできるようにします。
"sshd"の設定も秘密鍵でしかログインできないようにしておきます。

cat /mnt/ami/etc/rc.local
...
# For AWS
PUB_KEY_URI=http://169.254.169.254/1.0/meta-data/public-keys/0/openssh-key
PUB_KEY_FROM_HTTP=/tmp/openssh_id.pub
ROOT_AUTHORIZED_KEYS=/root/.ssh/authorized_keys
curl --retry 3 --retry-delay 0 --silent --fail -o $PUB_KEY_FROM_HTTP $PUB_KEY_URI
if [ $? -eq 0 -a -e $PUB_KEY_FROM_HTTP ] ; then
    if ! grep -q -f $PUB_KEY_FROM_HTTP $ROOT_AUTHORIZED_KEYS
    then
        cat $PUB_KEY_FROM_HTTP >> $ROOT_AUTHORIZED_KEYS
        echo "New key added to authrozied keys file from parameters" | logger -t "aws"
        dd if=/dev/urandom count=50 | md5sum | passwd --stdin root
        echo "The root password randomized" | logger -t "aws"
    fi
    chmod 600 $ROOT_AUTHORIZED_KEYS
    rm -f $PUB_KEY_FROM_HTTP
fi

# cp -r /root/.ssh /mnt/ami/root/

# cat /mnt/ami/root/.ssh/authorized_keys 

# cat /mnt/ami/etc/ssh/sshd_config
...
PermitRootLogin without-password
PasswordAuthentication no
UseDNS no
...


アンマウントとスナップショットの取得

上記で作成したEBSをAMI作成用のスナップショット取得のため下記のようにアンマウントし、
EBSをEC2からデタッチして、スナップショットを取得します。
(デタッチとスナップショットは"AWS Management Console"で実施しました)

# umount /mnt/ami/proc

# umount /mnt/ami


AMIの作成(登録)

上記で作成したスナップショット(snap-951eb8fe)を指定して、
下記PHPスクリプトにてAMIを作成(登録)します。

require_once("/opt/aws/php/sdk.class.php");

define("AWS_KEY"       , "AAAAAAAA");
define("AWS_SECRET_KEY", "XXXXXXXX");

$ec2 = new AmazonEC2();
$ec2->set_region(AmazonEC2::REGION_APAC_NE1);

$response = $ec2->register_image(array(
    "Name"               => "suz-lab_ebs_centos-core-i386-6.0.0",
    "Architecture"       => "i386",
    "KernelId"           => "aki-ec5df7ed",
    "RootDeviceName"     => "/dev/sda1",
    "BlockDeviceMapping" => array(
        array(
            "DeviceName" => "/dev/sda1",
            "Ebs"        => array(
                "SnapshotId" => "snap-951eb8fe"
            )
        )
    )
));

var_dump($response);

カーネルID(AKI)も上記で紹介した"pv-grub-hd0_1.02-i386.gz.manifest.xml"
(aki-ec5df7ed)を指定します。

上記のカーネル(AKI)はリージョン、プラットフォームごとにIDが違うので、
下記にまとめておきました。
"User Provided Kernel"で使う"pv-grub-hd0/00"が1.02になってた
下記のように"AWS Management Console"で確認できれば成功です。


同じ手順で"x86_64"版も作らないと...
--------
http://www.suz-lab.com

0 コメント: