Як відомо, у хмарі Amazon віртуальні інстанси запускаються на основі образів (так звані
В офіційній документації описано
Про те, як створити свій EBS-backed AMI у хмарі Amazon без проміжних кроків, йтиметься у цій статті.
План дій:
- Підготувати оточення
- Встановити чисту систему, зробити необхідні налаштування
- Зробити snapshot (зліпок) диска
- Зареєструвати AMI
Підготовка оточення
Для наших цілей підійде будь-який інстанс будь-якого шейпа, хоч t1.micro. Запустити його можна через CLI:
aws ec2 run-instances --image-id ami-1624987f --max-count 1 --min-count 1 --key-name mel --instance-type t1.micro
Створимо ebs-volume, куди встановимо пізніше нашу систему:
aws ec2 create-volume --availability-zone us-east-1a --size 10
Ця команда зробить нам диск розміром 10 Gb. Важливо: диск має бути в тій самій зоні, що й інстанс (у нашому випадку це us-east-1a).
Далі диск потрібно прикріпити до інстансу:
aws ec2 attach-volume --instance-id i-2bc0925b --volume-id vol-08ab3079 --device /dev/xvdf
Тепер залогінимось на інстанс по ssh, відформатуємо диск і примонтуємо його до директорії:
mkfs.ext3 /dev/xvdf
mkdir /mnt/centos-image
mount /dev/xvdf /mnt/centos-image
cd !$
Встановлення чистого Centos 5.9
Перед встановленням системи потрібно створити дерево каталогів, примонтувати proc та sysfs, створити мінімальний набір пристроїв:
mkdir centos-image/{boot,tmp,dev,sys,proc,etc,var}
mount -t proc none /mnt/centos-image/proc/
mount -t sysfs none /mnt/centos-image/sys/
for i in console null zero ; do /sbin/MAKEDEV -d /mnt/centos-image/dev -x $i ; done
Встановлювати систему будемо за допомогою yum та наступного конфігураційного файлу:
yum-centos.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-5.9 - Base
mirrorlist=http://mirrorlist.centos.org/?release=5.9&arch=x86_64&repo=os
#baseurl=http://mirror.centos.org/centos/5.9/os/x86_64/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5
[updates]
name=CentOS-5.9 - Updates
mirrorlist=http://mirrorlist.centos.org/?release=5.9&arch=x86_64&repo=updates
#baseurl=http://mirror.centos.org/centos/5.9/updates/x86_64/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5
[extras]
name=CentOS-5.9 - Extras
mirrorlist=http://mirrorlist.centos.org/?release=5.9&arch=x86_64&repo=extras
#baseurl=http://mirror.centos.org/centos/5.9/extras/x86_64/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-5
[centosplus]
name=CentOS-5.9 - Plus
mirrorlist=http://mirrorlist.centos.org/?release=5.9&arch=x86_64&repo=centosplus
#baseurl=http://mirror.centos.org/centos/5.9/centosplus/x86_64/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-5
[contrib]
name=CentOS-5.9 - Contrib
mirrorlist=http://mirrorlist.centos.org/?release=5.9&arch=x86_64&repo=contrib
#baseurl=http://mirror.centos.org/centos/5.9/contrib/x86_64/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-5
yum -c ~/yum-centos.conf --installroot=/mnt/centos-image/ -y groupinstall Base
Після завершення процесу встановлення, таким самим чином, можна встановити будь-які необхідні пакети:
yum -c ~/yum-centos.conf --installroot=/mnt/centos-image/ install $packet_name
Відредагуємо fstab:
vi /mnt/centos-image
/dev/xvda1 / ext3 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
У CentOS 5.9 ще потрібно встановити ядро з підтримкою xen:
yum -c ~/yum-centos.conf --installroot=/mnt/centos-image/ -y install kernel-xen
Встановимо Grub:
chroot /mnt/centos-image/ grub-install /dev/xvdf
і згенеруємо новий initrd:
chroot /mnt/centos-image/
cd boot/
mkinitrd --omit-scsi-modules --with=xennet --with=xenblk --fstab=/etc/fstab --preload=xenblk initrd-2.6.18-348.1.1.el5xen.img 2.6.18-348.1.1.el5xen
При цьому дуже важливо вказати всі ці параметри та новий fstab, інакше система не завантажиться.
Далі потрібно створити файл menu.lst для grub:
default=0
timeout=5
hiddenmenu
title CentOS_5.9_(x86_64)
root (hd0)
kernel /boot/vmlinuz-2.6.18-348.1.1.el5xen ro root=/dev/xvda1
initrd /boot/initrd-2.6.18-348.1.1.el5xen.img
Налаштуємо мережу та sshd:
vi etc/sysconfig/network-scripts/ifcfg-eth0
ONBOOT=yes
DEVICE=eth0
BOOTPROTO=dhcp
TYPE=Ethernet
USERCTL=yes
PEERDNS=yes
IPV6INIT=no
vi etc/sysconfig/network
NETWORKING=yes
chroot /mnt/centos5img/ chkconfig --level 2345 network on
vi /mnt/centos5img/etc/ssh/sshd_config
...
UseDNS no
PermitRootLogin without-password
Таким чином, ми отримаємо мережу, що працює, і можливість логінуватися на інстанс за ключами. Але сам ключ потрібно якось прокинути на інстанс. Це можна зробити за допомогою скрипта, який забиратиме ключ і зберігатиме його на інстансі:
vi /mnt/centos5img/etc/init.d/ec2-get-ssh
ec2-get-ssh#! / бін / баш
# chkconfig: 2345 95 20
# processname: ec2-get-ssh
# description: Capture AWS public key credentials for EC2 user
# Source function library
. /etc/rc.d/init.d/functions
# Source networking configuration
[ -r /etc/sysconfig/network ] &&. /etc/sysconfig/network
# Replace the following environment variables for your system
export PATH=:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
# Check that networking is configured
if [ "${NETWORKING}" = "no"]; then
echo "Networking is not configured."
вихід 1
fi
start () {
if [! -d /root/.ssh]; then
mkdir -p /root/.ssh
chmod 700 /root/.ssh
fi
# Retrieve public key from metadata server using HTTP
curl -f
if [$? -eq 0]; then
echo «EC2: Retrieve public key from metadata server using HTTP.»
cat /tmp/my-public-key >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
rm /tmp/my-public-key
fi
}
СТІЙ() {
echo "Nothing to do here"
}
restart() {
СТОП
старт
}
# See how we were called.
справа "$ 1" в
початок)
старт
;;
Стоп)
СТОП
;;
перезапуск)
перезапуск
;;
*)
echo $«Usage: $0 {start|stop|restart}»
вихід 1
що С
вихід $?
Зробимо його виконуваним та додамо в автозавантаження:
chmod +x /mnt/centos-image/etc/init.d/ec2-get-ssh
/usr/sbin/chroot /mnt/centos-image/ /sbin/chkconfig --level 34 ec2-get-ssh on
Ще бажано відключити Selinux або правильно налаштувати його. Інакше, наприклад, може не зберегтися ключ на інстансі.
На цьому можна налаштування системи припинити. Ми вже маємо чистий CentOS, готовий до запуску у хмарі. Залишилося тільки змонтувати ebs-диск з нашою системою та зареєструвати ami.
umount /mnt/centos-image/proc/
umount /mnt/centos-image/sys/
umount /mnt/centos-image/
Реєстрація AMI
Щоб отримати з ebs-диска ami, потрібно спочатку зробити снапшот диска:
aws ec2 create-snapshot --volume-id vol-0b4bd07a --description centos-snap
А зареєструвати ami найпростіше через AWS Management Console. Для цього потрібно просто в сервісі EC2 перейти в розділ «Snapshots», вибрати потрібний (у нашому випадку це centos-snap), клацнути на нього правою кнопкою та вибрати Create Image from Snapshot
Потім, у вікні, потрібно вибрати приблизно такі параметри:
Який Kernel ID вибрати, можна дізнатися так:
aws ec2 describe-images --owner amazon --region us-east-1 --output text | grep "/pv-grub-hd0.*-x86_64" | awk '{print $7}' | grep aki
aki-88aa75e1
aki-b4aa75dd
На цьому все. Тепер можна запускати інстанси.
У такий спосіб можна зробити образ, швидше за все, з будь-яким Linux-дистрибутивом. Принаймні, точно Debian- (використовуючи debootstrap для встановлення чистої системи) і Rhel-родини.
Джерело: habr.com