Dec 162012
 

■2013/02/17追記
CentOSコミュニティで公式AMIを提供しはじめましたのでそちらを使ったほうがよいと思います。

CentOS 6.0 x86_64のAMIベースになるディスクイメージを作成してみました。

CentOS 5.0用を作ったときと違ってcloud-initも最初から入れちゃいます。

  1. 作業用のRed Hat 6系列Linuxを環境を準備(EC2上に用意)
  2. 2GiBのEBSボリュームを用意してCentOS 6.0を最小構成インストール
  3. PV-GRUBでブートできるようにinitrdやgrub.confを構成
  4. 仕上がったEBSボリュームのスナップショットを取得しAMIとして登録

5.0のときと違って、最初から最後までEC2上で作業していきます。

今回参考にした情報は以下です。
From a Loopback – Amazon Elastic Compute Cloud
Enabling Your Own Linux Kernels – Amazon Elastic Compute Cloud

作業用マシン準備
EC2標準のRHEL6(x86_64)を起動します。
EBSボリュームマウント先として/mnt/ec2-fsを作成します。

[root@localhost ~]# mkdir /mnt/ec2-fs

selinux関連パッケージにエラーになるため、作業マシンでは無効化しておきます。

[root@localhost ~]# setenforce 0

EBS準備
2GiBのEBSボリュームを用意して/dev/xvdjにマウントします。xvdjにしているのはRHEL6でデバイスファイルが用意されていたから。

[root@localhost ~]# mkfs.ext4 /dev/xvdj
[root@localhost ~]# mount /dev/xvdj /mnt/ec2-fs

yumインストール用の設定ファイルを作成
6.0素の最小構成しますので、baseリポジトリのみ有効(updatesは無効)にしています。
6.0のリポジトリは既にvaultに移っていますので、baseurlではそちらを指定します。

[root@localhost ~]# vi centos-6-0-x86_64-yum.conf
[root@localhost ~]# cat centos-6-0-x86_64-yum.conf
[main]
cachedir=/var/cache/yum
debuglevel=2
logfile=/var/log/yum.log
exclude=*-debuginfo
gpgcheck=0
obsoletes=1
reposdir=/dev/null

[base]
name=CentOS-6.0 - Base
baseurl=http://vault.centos.org/6.0/os/x86_64/

[updates]
name=CentOS 6.0 - Updates
baseurl=http://vault.centos.org/6.0/updates/x86_64/
enabled=0

必要最低限のパッケージをインストール
パッケージグループCoreをインストールします。
パッケージkerel-xenをインストールします。

[root@localhost ~]# yum -c centos-6-0-x86_64-yum.conf --installroot=/mnt/ec2-fs -y groupinstall Core
:
Install     181 Package(s)

Total download size: 88 M
Installed size: 324 M
:

展開サイズは324Mですので、2GiBのEBSでも十分足ります。

/etc/fstab作成
kernelパッケージのインストール時にinitrdが生成されますが、その際fstabの記述に従ってrootパーティションのマウント指定が決定されますので記述を用意します。
ちなみに作業マシンのRHEL6とほぼ同じになります。

[root@localhost ~]# vi /mnt/ec2-fs/etc/fstab
[root@localhost ~]# cat /mnt/ec2-fs/etc/fstab
LABEL=_/   /         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

fstab指定に合わせてLABELを作成します。

[root@localhost ~]# e2label /dev/xvdj _/
[root@localhost ~]# e2label /dev/xvdj
_/

/etc/modprobe.conf作成
こちらもfstab同様にkernelインストール前に実施しておき、initrdイメージにxen関連のモジュールが含まれるようにします。

[root@localhost ~]# cat >> /mnt/ec2-fs/etc/modprobe.conf << EOF
alias eth0 xennet
alias scsi_hostadapter xenblk
EOF
[root@localhost ~]# tail -2 /mnt/ec2-fs/etc/modprobe.conf
alias eth0 xennet
alias scsi_hostadapter xenblk

パッケージkernelをインストールします。

[root@localhost ~]# yum -c centos-6-0-x86_64-yum.conf --installroot=/mnt/ec2-fs -y install kernel

クリーンアップ

[root@localhost ~]# yum -c centos-6-0-x86_64-yum.conf --installroot=/mnt/ec2-fs clean all

デバイスファイルの作成

[root@localhost ~]# /mnt/ec2-fs/sbin/MAKEDEV -d /mnt/ec2-fs/dev -c /mnt/ec2-fs/etc/makedev.d -x console
[root@localhost ~]# /mnt/ec2-fs/sbin/MAKEDEV -d /mnt/ec2-fs/dev -c /mnt/ec2-fs/etc/makedev.d -x null
[root@localhost ~]# /mnt/ec2-fs/sbin/MAKEDEV -d /mnt/ec2-fs/dev -c /mnt/ec2-fs/etc/makedev.d -x zero

/boot/grub/grub.conf作成
EBS内のkernelで起動できるように用意しておきます。

[root@localhost ~]# vi /mnt/ec2-fs/boot/grub.conf
[root@localhost ~]# cat /mnt/ec2-fs/boot/grub.conf
default=0
timeout=0
hiddenmenu
title CentOS (2.6.32-71.el6)
        root (hd0)
        kernel /boot/vmlinuz-2.6.32-71.el6.x86_64 root=LABEL=_/ ro
        initrd /boot/initramfs-2.6.32-71.el6.x86_64.img
[root@localhost ~]# cd /mnt/ec2-fs/boot
[root@localhost boot]# ln -s grub.conf menu.lst
[root@localhost boot]# cd

/etc/sysconfig/network作成

[root@localhost ~]# vi /mnt/ec2-fs/etc/sysconfig/network
[root@localhost ~]# cat /mnt/ec2-fs/etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no

/etc/sysconfig/network-scripts/ifcfg-eth0作成

[root@localhost ~]# vi /mnt/ec2-fs/etc/sysconfig/network-scripts/ifcfg-eth0
[root@localhost ~]# cat /mnt/ec2-fs/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=on

/etc/resolv.conf作成

[root@localhost ~]# touch /mnt/ec2-fs/etc/resolv.conf

SELinux無効化
/etc/selinux/configのSELINUXをdisabledに変更します。

[root@localhost ~]# vi /mnt/ec2-fs/etc/selinux/config
[root@localhost ~]# grep ^SELINUX= /mnt/ec2-fs/etc/selinux/config
SELINUX=disabled

cloud-initパッケージ導入用にEPELリポジトリ設定をインストールし、AMI構築用のyum設定ファイルに結合します。

[root@localhost ~]# rpm --root=/mnt/ec2-fs -Uvh http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-7.noarch.rpm
[root@localhost ~]# cat /mnt/ec2-fs/etc/yum.repo.d/epel.repo >> centos-6-0-x86_64-yum.conf

cloud-initパッケージをインストールします。

[root@localhost ~]# yum -c centos-6-0-x86_64-yum.conf --installroot=/mnt/ec2-fs -y install cloud-init

EPELリポジトリは通常利用しないよう無効化しておきます。

[root@localhost ~]# vi /mnt/ec2-fs/etc/yum.repos.d/epel.repo
[root@localhost ~]# grep ^enabled /mnt/ec2-fs/etc/yum.repos.d/epel.repo 
enabled=0
enabled=0
enabled=0

ec2-user作成
cloud-initのデフォルト構成で初回ログインユーザーになるec2-userを作成します。

[root@localhost ~]# chroot /mnt/ec2-fs /usr/sbin/useradd ec2-user
[root@localhost ~]#

EBSボリュームのアンマウント

[root@localhost ~]# umount /mnt/ec2-fs

アンマウントしたEBSボリュームのスナップショットを取得し、AMI登録すれば完了なはず。

Sorry, the comment form is closed at this time.