Страницы

Сохранить статью у себя в соцсети:

пятница, 29 июня 2012 г.

§ Gentoo Linux EC2 from the Scratch.

Собираем Gentoo Linux в Amazon EC2.

Описывается способ как создать Instance-store образ, а затем и EBS AMI, содержащий собственный образ операционной системы в Amazon EC2. Машины запущенные на EBS (Elastic block storage) имеют преимущества перед машинами запущенными с Instance-store. Устанавливать будем Gentoo Linux x86_64. Вообще приличных Gentoo-образов в хранилище Amazon я не нашел, поэтому возникло желание создать свой образ. Начинать придется с Instance-store, затем уже и на EBS перейти несложно.  
Для начала понадобится установить в системе пакеты app-admin/ec2-ami-tools и app-admin/ec2-api-tools. Это довольно легковесные скрипты которые тянут за собой dev-lang/ruby, dev-java/icedtea-bin и еще кучу всего, при всем при этом пакеты не очень охотно поддерживаются разработчиками, поэтому местами придется шаманить.

Предварительные доделки в AMI Tools.
Новая версия SSL имеет некоторые новшества из-за которых сборщик AMI делает свою работу не очень хорошо. Поэтому нужно внести некоторые изменения в bundle.rb. Меняем одну строку на другую.
# vi /opt/ec2-ami-tools-1.3.34544/lib/ec2/amitools/bundle.rb
- digest = pipeline.execute.chomp
+ digest = pipeline.execute.chomp.sub(/.*\b([0-9a-f]{40})\b.*/i, '\1')

Итак начинаем.
Качаем свежий образ stage3 и дерево portage.
Создаем файл-образ диска для будущей виртуальной машины, размер 5Gb
# dd if=/dev/zero of=image.fs bs=1M count=5000 

Создаем loop-устройство. 
# losetup -f image.fs
# losetup -a
/dev/loop0: [fd00]:203428 (/var/db/paludis/sqfs/gentoo.sqfs)
/dev/loop1: [fe11]:13 (/mnt/vdb/image.fs)

Устройство /dev/loop1. Теперь это наше блочное устройство. Создавать разделов внутри НЕ нужно. Форматируем устройство. На данный момент поддерживаются ext2/3/4, reiserfs, xfs, brtfs (экспериментально). Если в томе планируется использовать LVM, то раздел где будет лежать ядро, нужно вынести за пределы LVM (мне пока не удалось установить root-раздел на LVM, инфы никакой по этому вопросу нет и поддержка молчит)
# mke2fs -j -L root /dev/loop1
# mount -o loop /dev/loop1 /mnt/gentoo

Далее все как по хэндбуку. Распаковываем stage3 и дерево portage
# tar xvjf stage.bz2 -C /mnt/gentoo
# tar xvjpf portage-latest.tar.bz2 -C /mnt/gentoo/usr

Монтируем /dev /dev/pts /proc
# mount -o bind /dev /mnt/gentoo/dev
# mount -o bind /dev/pts /mnt/gentoo/dev/pts
# mount -t proc none /mnt/gentoo/proc

Делаем chroot.
# chroot /mnt/gentoo /bin/bash
# env-update
# source /etc/profile

Правим по необходимости конфиги make.conf, locale.gen, и т.д. профиль можно использовать 10.0. Правим /etc/fstab
# nano /etc/fstab
LABEL=root     /          ext3       noatime         0 1
LABEL=swap     none       swap       sw              0 0
none           /dev/pts   devpts     gid=5,mode=620  0 0
none           /proc      proc       defaults        0 0
none           /sys       sysfs      defaults        0 0
shm            /dev/shm   tmpfs      nodev,nosuid,noexec     0 0

Настраиваем сеть и добавляем net.eth0 в автозагрузку. Использовать будем DHCP.
# echo 'nameserver 8.8.8.8' > /etc/resolv.conf
# emerge dhcpcd
# echo 'config_eth0="dhcp"' > /etc/conf.d/net
# cd /etc/init.d/ 
# ln -s net.lo net.eth0
# rc-update add net.eth0 default

Определяем пароль root, при необходимости добавляем ключи в authorized_keys
# passwd root

Устанавливаем необходимый софт. Обновляем все конфиги (dispatch-conf). Добавляем sshd в автозагрузку.
# rc-update add sshd default

Теперь можно положить свое собранное ядро. Ядро 3.0.6 можно найти здесь. Скачиваем его (git clone) собираем обычным способом. Можно просто скачать оттуда конфиг и отталкиваясь от него собрать свою версию ядра. Вобщем собрать ядро вариантов масса, и перечислять их можно бесконечно. Итак допустим что ядро уже готово, осталось скопировать его в /boot и настроить menu.lst (устанавливать сам sys-boot/grub не нужно)
# mkdir /boot/grub
# nano /boot/grub/menu.lst
default 0
timeout 3
title EC2
root (hd0)
kernel /boot/kernel root=/dev/xvda1

Удаляем временные файлы, distfiles и все то что позволит сэкономить место и забиваем все место нулями. Это необходимо для эффективной сборки, передачи и хранения образа в Amazon
# dd if=/dev/zero of=file.tmp bs=1M count=5000 ; rm file.tmp

Выходим из окружения, демонтируем все что смонтировано в /mnt/gentoo
Создаем образ EC2. Здесь нам понадобятся сертификаты аккаунта ЕС2, которые скачиваются со странички Security Credentials в личном кабинете ЕС2 - вкладка "Х.509 Certificates", если там пусто то надо создать связку.
# mkdir out
# export EC2_HOME=/opt/ec2-ami-tools-1.3.34544
# export EC2_PRIVATE_KEY=/home/daevy/GDI/EC2/pk.pem
# export EC2_CERT=/home/daevy/GDI/EC2/cert.pem
# ec2-bundle-image --image image.fs --prefix gentoo-x86_64 --user 1111-2222-3333 --destination out/ --arch x86_64
Bundling image file...
Splitting out/gentoo-x86_64.tar.gz.enc...
Created gentoo-x86_64.part.00
...
Created gentoo-x86_64.part.23
Generating digests for each part...
Digests generated.
Creating bundle manifest...
ec2-bundle-image complete.

Загружаем образ (предварительно создаем корзину (bucket) в хранилище AmazonS3). 
При загрузке используем параметр --url, т.к. при дефолтном использовании https, curl может выкинуть ошибку "ERROR: Error talking to S3: Curl.Error(60): Peer certificate cannot be authenticated with given CA certificates". Также нам понадобятся пара ключей которые представляют собой текстовые строки и которые также можно найти на странице Security Credentials в личном кабинете ЕС2.
Также стоит отметить что образ заливается в тот bucket где он создан (US, EU) поэтому надо быть внимательным, чтобы не получилось такого что хотим запускать инстансы в Европе, а образы загрузили в корзину которая принадлежит датацентру в США. Регион определяется при создании корзины.
# ec2-upload-bundle --url http://s3.amazonaws.com --manifest out/gentoo-x86_64.manifest.xml --bucket my-s3bucket --access-key ACCESSKEY --secret-key SECRETKEY
Uploading bundled image parts to the S3 bucket my-s3bucket ...
Uploaded gentoo-x86_64.part.00
...
Uploaded gentoo-x86_64.part.23
Uploading manifest ...
Uploaded manifest.
Bundle upload completed.

Если загрузка прервалась по причине некачественной связи, то используя ключ --part можно продолжить загрузку с того куска на котором произошел обрыв.
Загруженные файлы ни в коем случае нельзя удалять иначе будущий Instance-store AMI будет неработоспособным.
Регистрируем образ. Меняем переменную EC2_HOME чтобы заработала ec2-register (Вот о чем я говорил выше, маинтайнер собирал пакет на коленке)
# EC2_HOME="/opt/ec2-api-tools-1.3.36506" ec2-register --region eu-west-1 my-s3bucket/gentoo-x86_64.manifest.xml
IMAGE   ami-ad6064d9

Теперь у нас есть Instance-store AMI. Но учитывая что EBS предпочтительнее instance-store. Приступаем к созданию EBS из нашего Instance-store.
Запускаем виртуальную машину на основе нашего Instance-store. При создании важно указать используемое ядро aki-4feec43b
После запуска создаем том предпочтительного размера и подключаем его к нашей VM. Далее подключаемся к нашей VM (я использовал ssh и ElasticIP).
Далее форматируем том, монтируем и переносим на него нашу систему. Создавать разделы внутри тома НЕ нужно.
# mke2fs -j -L root /dev/xvdf
# mount /dev/xvdf /mnt/gentoo/
# rsync -avx -f "- mnt/*" -f "- dev/*" -f "- proc/*" / /mnt/gentoo/
# umount /mnt/gentoo/

Теперь создаем снимок (snapshot) на основе этого тома, после чего из снапшота формируем AMI. В диалоговом окне в качестве ядра выбираем aki-62695816 или aki-4feec43b. Полученый EBS AMI готов к работе, можно запускать виртуальные машины на его основе.

На главную "Virtualizing Linux"

Комментариев нет:

Отправить комментарий

Популярные сообщения

Профиль в Google+ Яндекс цитирования Яндекс.Метрика