この記事は約3分で読めます。
この記事は1年以上前に書かれたものです。
内容が古い可能性がありますのでご注意ください。
こんにちは!サーバーワークスでインフラを担当しています、柳瀬です。 先日CentOS4系のインスタンスをAWS上で動かしたいとう依頼を受けてEC2のインスタンスを作成した事がありました。 基本的な手順はCentOS5系の場合と同じですが、今回のエントリではその作成手順を記載したいと思います。 AmazonEC2のシンガポールリージョンにEC2インスタンスを起動し、CentOS4系のAMIを作成しました。 CentOS4系のインスタンスには以下のソフトウェアをインストールしておいて下さい。
- ec2-api-tools
- ec2-ami-tools
- ec2-metadata
大まかな作業手順は以下の通りです。
- 作業環境の準備、CentOS4イメージ作成
- EBSの準備、CentOS4イメージの流し込み
- SnapShotからAMIの作成
- インスタンスのテスト起動
作業環境での準備、CentOS4系イメージ作成
AMI作成の作業ディレクトリを作成します
$ sudo mkdir /mnt/work
$ cd /mnt/work
CentOS4をインストールするディスクイメージを作成
$ sudo df -h
Filesystem サイズ 使用 残り 使用% マウント位置
/dev/sda1 30G 1.5G 27G 6% /
/dev/sdc 147G 188M 140G 1% /mnt
none 851M 0 851M 0% /dev/shm
$ sudo dd if=/dev/zero of=centos4.img bs=1M count=10240
10240+0 records in
10240+0 records out
10737418240 bytes (11 GB) copied, 298.681 seconds, 35.9 MB/s
$ ls -alh
合計 11G
drwxr-xr-x 2 root root 4.0K 8月 2 16:57 .
drwxr-xr-x 4 root root 4.0K 8月 2 16:55 ..
-rw-r--r-- 1 root root 10G 8月 2 17:02 centos4.img
# df -h
Filesystem サイズ 使用 残り 使用% マウント位置
/dev/sda1 30G 1.5G 27G 6% /
/dev/sdc 147G 11G 130G 8% /mnt
none 851M 0 851M 0% /dev/shm
作成したディスクイメージにファイルシステムを作成
$ sudo /sbin/mke2fs -F -j centos4.img
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
1310720 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
16384 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 25 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
CentOSをインストールする準備をします
$ sudo mkdir /mnt/ec2-fs
$ sudo /bin/mount -o loop centos4.img /mnt/ec2-fs
$ df -h
Filesystem サイズ 使用 残り 使用% マウント位置
/dev/sda1 30G 1.5G 27G 6% /
/dev/sdc 147G 11G 130G 8% /mnt
none 851M 0 851M 0% /dev/shm
/mnt/work/centos4.img
9.9G 151M 9.2G 2% /mnt/ec2-fs
$ sudo /bin/mkdir /mnt/ec2-fs/dev
$ for i in console null zero ; do sudo /sbin/MAKEDEV -d /mnt/ec2-fs/dev -x $i; done
$ sudo mkdir /mnt/ec2-fs/etc/
$ sudo vi /mnt/ec2-fs/etc/fstab
1 /dev/sda1 / ext3 defaults 1 1
2 none /dev/pts devpts gid=5,mode=620 0 0
3 none /dev/shm tmpfs defaults 0 0
4 none /proc proc defaults 0 0
5 none /sys sysfs defaults 0 0
$ sudo vi yum-xen.conf
1 [main]
2 cachedir=/var/cache/yum
3 debuglevel=2
4 logfile=/var/log/yum.log
5 exclude=*-debuginfo
6 gpgcheck=0
7 obsoletes=1
8 reposdir=/dev/null
9
10 [base]
11 name=CentOS-4.8 - Base
12 mirrorlist=http://mirrorlist.centos.org/?release=4.8&arch=i386&repo=os
13 enabled=1
14
15 [updates-released]
16 name=CentOS-$releasever - Updates
17 mirrorlist=http://mirrorlist.centos.org/?release=4.8&arch=i386&repo=updates
18 enabled=1
$ sudo mkdir /mnt/ec2-fs/proc
$ sudo mount -t proc none /mnt/ec2-fs/proc
$ df -h
Filesystem サイズ 使用 残り 使用% マウント位置
/dev/sda1 30G 1.5G 27G 6% /
/dev/sdc 147G 11G 130G 8% /mnt
none 851M 0 851M 0% /dev/shm
/mnt/work/centos4.img
9.9G 151M 9.2G 2% /mnt/ec2-fs
CentOS4をインストールします
$ sudo yum -c yum-xen.conf --installroot=/mnt/ec2-fs -y groupinstall Core
$ sudo yum -c yum-xen.conf --installroot=/mnt/ec2-fs -y groupinstall Base
$ sudo yum -c yum-xen.conf --installroot=/mnt/ec2-fs -y clean all
$ sudo yum -c yum-xen.conf --installroot=/mnt/ec2-fs -y install curl ruby
各種設定をします
$ sudo vi /mnt/ec2-fs/etc/sysconfig/network-scripts/ifcfg-eth0
1 DEVICE=eth0
2 BOOTPROTO=dhcp
3 ONBOOT=yes
4 TYPE=Ethernet
5 USERCTL=yes
6 PEERDNS=yes
7 IPV6INIT=no
$ sudo vi /mnt/ec2-fs/etc/sysconfig/network
1 NETWORKING=yes
$ sudo vi /mnt/ec2-fs/etc/fstab
1 /dev/sda1 / ext3 defaults 1 1
2 /dev/sda2 /mnt ext3 defaults 0 0
3 /dev/sda3 swap swap defaults 0 0
4 none /dev/pts devpts gid=5,mode=620 0 0
5 none /dev/shm tmpfs defaults 0 0
6 none /proc proc defaults 0 0
7 none /sys sysfs defaults 0 0
EC2上でインスタンスを起動する際に実行させるスクリプトを配置します。 ここがCentOS4系で作成する場合のポイントとなります。CentOS4系のcurlはバージョンが7.12.1です。 EC2のインスタンスは起動時にAmazonが提供しているssh公開鍵を設置するスクリプトを実行する必要があります。 しかし、スクリプト内で使用されているcurlのオプションが7.12.1で使用できません。 今回は使用出来なかった"retry"と、"retry-delay"オプションを削除して以下のように修正しています。
$ sudo vi /mnt/ec2-fs/usr/local/sbin/get-credentials.sh
1 #!/bin/bash
2
3 # Retreive the credentials from relevant sources.
4
5 # Fetch any credentials presented at launch time and add them to
6 # root's public keys
7
8 PUB_KEY_URI=http://169.254.169.254/1.0/meta-data/public-keys/0/openssh-key
9 PUB_KEY_FROM_HTTP=/tmp/openssh_id.pub
10 PUB_KEY_FROM_EPHEMERAL=/mnt/openssh_id.pub
11 ROOT_AUTHORIZED_KEYS=/root/.ssh/authorized_keys
12
13 # We need somewhere to put the keys.
14 if [ ! -d /root/.ssh ] ; then
15 mkdir -p /root/.ssh
16 chmod 700 /root/.ssh
17 fi
18
19 # Fetch credentials...
20
21 # First try http
22 curl --silent --fail -o $PUB_KEY_FROM_HTTP $PUB_KEY_URI
23 if [ $? -eq 0 -a -e $PUB_KEY_FROM_HTTP ] ; then
24 if ! grep -q -f $PUB_KEY_FROM_HTTP $ROOT_AUTHORIZED_KEYS
25 then
26 cat $PUB_KEY_FROM_HTTP >> $ROOT_AUTHORIZED_KEYS
27 echo "New key added to authrozied keys file from parameters"|logger -t "ec2"
28 fi
29 chmod 600 $ROOT_AUTHORIZED_KEYS
30 rm -f $PUB_KEY_FROM_HTTP
31
32 elif [ -e $PUB_KEY_FROM_EPHEMERAL ] ; then
33 # Try back to ephemeral store if http failed.
34 # NOTE: This usage is deprecated and will be removed in the future
35 if ! grep -q -f $PUB_KEY_FROM_EPHEMERAL $ROOT_AUTHORIZED_KEYS
36 then
37 cat $PUB_KEY_FROM_EPHEMERAL >> $ROOT_AUTHORIZED_KEYS
38 echo "New key added to authrozied keys file from ephemeral store"|logger -t "ec2"
39
40 fi
41 chmod 600 $ROOT_AUTHORIZED_KEYS
42 chmod 600 $PUB_KEY_FROM_EPHEMERAL
43
44 fi
45
46 if [ -e /mnt/openssh_id.pub ] ; then
47 if ! grep -q -f /mnt/openssh_id.pub /root/.ssh/authorized_keys
48 then
49 cat /mnt/openssh_id.pub >> /root/.ssh/authorized_keys
50 echo "New key added to authrozied keys file from ephemeral store"|logger -t "ec2"
51
52 fi
53 chmod 600 /root/.ssh/authorized_keys
54 fi
$ sudo chmod +x /mnt/ec2-fs/usr/local/sbin/get-credentials.sh
$ sudo vi /mnt/ec2-fs/etc/rc.d/rc.local
1 #!/bin/sh
2 #
3 # This script will be executed *after* all the other init scripts.
4 # You can put your own initialization stuff in here if you don't
5 # want to do the full Sys V style init stuff.
6
7 touch /var/lock/subsys/local
8 /usr/local/sbin/get-credentials.sh
作業環境をアンマウントします
$ cd
$ sudo umount /mnt/ec2-fs/proc
$ sudo umount -d /mnt/ec2-fs
$ cd /mnt/work/
$ sudo ls
centos4.img yum-xen.conf
作業環境のゾーンを取得する
$ sudo ec2-metadata -z
placement: ap-southeast-1a
作業環境のEC2インスタンスIDを取得する
$ sudo ec2-metadata -i
instance-id: i-5a8fbe08
EBSの準備、CentOS4イメージの流し込み
ブートイメージ格納用のEBSボリュームを作成する
$ sudo ec2-create-volume --size 10 --availability-zone ap-southeast-1a
VOLUME vol-64f5ca0c 10 ap-southeast-1a creating 2010-09-16T06:43:39+0000
EBSボリュームをアタッチする
$ sudo ec2-attach-volume vol-64f5ca0c --instance i-5a8fbe08 --device /dev/sdh
ATTACHMENT vol-64f5ca0c i-5a8fbe08 /dev/sdh attaching 2010-09-16T06:50:33+0000
ddコマンドを使ってイメージをEBSボリュームに戻す
$ sudo dd if=/mnt/work/centos4.img of=/dev/sdh
20971520+0 records in
20971520+0 records out
10737418240 bytes (11 GB) copied, 1384.4 seconds, 7.8 MB/s
$ sudo mkdir -p /mnt/ebs
$ sudo mount /dev/sdh /mnt/ebs
$ sudo mv /mnt/ebs/etc/fstab /mnt/ebs/etc/fstab.bak
$ sudo cat /mnt/ebs/etc/fstab.bak | grep -v mnt > /mnt/ebs/etc/fstab
$ sudo cat /mnt/ebs/etc/fstab
/dev/sda1 / ext3 defaults 1 1
/dev/sda3 swap swap defaults 0 0
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
EBSボリュームをデタッチする
$ sudo umount /mnt/ebs
$ sudo ec2-detach-volume vol-64f5ca0c
SnapShotからAMIの作成
SnapShotを作成
# ec2-create-snapshot vol-64f5ca0c --description CentOS4.8-BaseImage
SNAPSHOT snap-cc74f8a4 vol-64f5ca0c pending 2010-09-16T07:47:12+0000 91451529646410 CentOS4.8-BaseImage
AMIの登録
# ec2-register --snapshot snap-cc74f8a4 --description="yanase, 20100916" --name="CentOS4.8-i386-20100916" --architecture i386 --root-device-name /d sda1
IMAGE ami-02245a50
インスタンスのテスト起動
スタンス起動
# ec2-run-instances ami-02245a50 --block-device-mapping /dev/sdc=ephemeral0 --availability-zone ap-southeast-1a --group cg-yanase --instance-initia - shutdown-behavior stop --key cg-yanase -t m1.small
RESERVATION r-3c9bad6e 914515296464 cg-yanase
INSTANCE i-846050d6 ami-02245a50 pending cg-yanase 0 m1.small 2010-09-16T08:01:07+000 ap-southeast-1a monitoring-disabled ebs pai r t ual
おまけ:起動後の初期設定
ローカルストレージのマウント
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 9.9G 1.1G 8.3G 12% /
none 851M 0 851M 0% /dev/shm
# fdisk -l
Disk /dev/sdc: 160.1 GB, 160104972288 bytes
255 heads, 63 sectors/track, 19464 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdc doesn't contain a valid partition table
# mount /dev/sdc /mnt
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 9.9G 1.1G 8.3G 12% /
none 851M 0 851M 0% /dev/shm
/dev/sdc 147G 188M 140G 1% /mnt
/dev/sdcのマウントをfstabに記述
# vi /etc/fstab
1 /dev/sda1 / ext3 defaults 1 1
2 /dev/sda3 swap swap defaults 0 0
3 /dev/sdc /mnt ext3 defaults 0 0
4 none /dev/pts devpts gid=5,mode=620 0 0
5 none /dev/shm tmpfs defaults 0 0
6 none /proc proc defaults 0 0
7 none /sys sysfs defaults 0 0
アップデート
# yum update -y
# reboot
時刻を日本に変更
# rm /etc/localtime
# ln -s /usr/share/zoneinfo/Japan /etc/localtime
cronによる時刻同期
# crontab -e
1 MAILTO=""
2
3 ## adjust clock
4 */5 * * * * /usr/sbin/ntpdate ntp.jst.mfeed.ad.jp
言語サポート
# vi /etc/sysconfig/i18n
1 LANG="C"
2 SUPPORTED="ja_JP.UTF-8:ja_JP:ja"
3 SYSFONT="latarcyrheb-sun16"
hostsファイルの変更
# vi /etc/hosts
# chmod 644 /etc/hosts
ちなみにec2-ami-toolsはtarの1.5を必要とするのでCentOS4系標準の状態ではインストールできません。
# wget http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.noarch.rpm
# rpm -ivh ec2-ami-tools.noarch.rpm
error: Failed dependencies:
tar >= 1.15 is needed by ec2-ami-tools-1.3-57676.noarch
# tar --version
tar (GNU tar) 1.14
※今回の手順は弊社が行ったテストした方法となり、AmazonEC2上での動作を保証するものではありません