Створення свого образу з чистим CentOS 5.9 у хмарі Amazon

Як відомо, у хмарі Amazon віртуальні інстанси запускаються на основі образів (так звані AMI). Amazon надає велику кількість, також можна використовувати публічні образи, підготовлені сторонніми організаціями, за які хмарний провайдер, природно, ніякої відповідальності не несе. Але іноді потрібний образ чистої системи з потрібними параметрами, якого немає у списку образів. Тоді єдиний вихід – зробити свій AMI.

В офіційній документації описано спосіб створення "instance store-backed AMI". Мінус такого підходу полягає в тому, що готовий образ потрібно буде ще й сконвертувати в EBS-backed AMI

Про те, як створити свій 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 169.254.169.254/latest/meta-data/public-keys/0/openssh-key > /tmp/my-public-key
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
Потім, у вікні, потрібно вибрати приблизно такі параметри:

Створення свого образу з чистим CentOS 5.9 у хмарі Amazon

Який 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

Додати коментар або відгук