Создание дисковых шаблонов XEN c ОС Linux Debian для VDSmanager

Время идет, вышла ОС Linux Debian v7.XX, а обновлений дисковых шаблонов под XEN для панели VDSmanager v4.XX нет, и, судя по настроениям на профильном форуме, ждать их от разработчиков в ближайшее время не стоит. А тем временем удовлетворять потребности клиентов в рамках Debian v6.XX становится тяжело: все чаще они требуют PHP v5.4.XX и СУБД MySQL v5.5.XX, которых в стандартном репозитории пакетов нет. Потому возникла производственная необходимость создать шаблон с ОС Linux Debian v7.XX самостоятельно.
Найти исчерпывающую документацию с описанием этого процесса не удалось. Информация по крупицам собиралась из обрывков справки VDSmanager: ISPWiki. И путем анализа фирменных шаблонов Debian v6.XX. Работа выполнялась по заказу немецкого хостинг-провайдера SIM-Networks, что отразилось в имени шаблона и используемых сетевых зеркалах Debian. Вам следует скорректировать их в соответствии со своей спецификой.
Дальнейшее повествование будет вестись на примере архитектуры i386, однако, для amd64 все действия аналогичны, необходимо лишь вносить соответствующие корректировки в параметры командной строки и опции настройки. Дисковый шаблон XEN – это архив tgz, содержащий преднастроенный образ ОС, плюс набор скриптов для его первоначального конфигурирования или перенастройки при разворачивании VDS. Работа по его созданию выполняется в другой, можно сказать материнской, VDS с использованием инструментария chroot.
Создадим эту самую материнскую VDS в VDSmanager, используя в качестве шаблона диска Debian-6-amd64-minimal/Debian-6-i386-minimal. Я присвоил ей имя "templates-debian.i386", вы можете назвать по своему вкусу. Начинаю с того, делаю работу в системе комфортной для себя: устанавливаю недостающие инструменты и вношу изменения в настройки по умолчанию. Впрочем, назвать эти шаги необходимыми нельзя. В первую очередь, настроим источники репозиториев для менеджера пакетов apt. Вот как выглядит мой "/etc/apt/sources.list" для Debian v6.XX:

deb http://ftp2.de.debian.org/debian/ squeeze main contrib non-free
deb-src http://ftp2.de.debian.org/debian/ squeeze main contrib non-free

deb http://ftp2.de.debian.org/debian/ squeeze-updates main contrib non-free
deb-src http://ftp2.de.debian.org/debian/ squeeze-updates main contrib non-free

deb http://security.debian.org/ squeeze/updates main contrib non-free
deb-src http://security.debian.org/ squeeze/updates main contrib non-free

deb http://ftp.hosteurope.de/mirror/ftp.debian.org/debian-backports/ squeeze-backports main contrib non-free
deb-src http://ftp.hosteurope.de/mirror/ftp.debian.org/debian-backports/ squeeze-backports main contrib non-free

deb http://ftp.hosteurope.de/mirror/ftp.debian.org/debian-backports/ squeeze-backports-sloppy main contrib non-free
deb-src http://ftp.hosteurope.de/mirror/ftp.debian.org/debian-backports/ squeeze-backports-sloppy main contrib non-free

deb http://ftp.hosteurope.de/mirror/packages.dotdeb.org/ squeeze all
deb-src http://ftp.hosteurope.de/mirror/packages.dotdeb.org/ squeeze all
deb http://ftp.hosteurope.de/mirror/packages.dotdeb.org/ squeeze-php54 all
deb-src http://ftp.hosteurope.de/mirror/packages.dotdeb.org/ squeeze-php54 all

Для того, что бы не было проблем в использовании столь обширного списка, также необходимо установить в системе публичные ключи для проверки цифровых подписей:

wget http://www.dotdeb.org/dotdeb.gpg
apt-key add dotdeb.gpg

apt-get -y update
apt-get -y install debian-keyring debian-archive-keyring

Обновим ОС и установленные в ней пакеты:

apt-get -y update
apt-get -y upgrade

Установим недостающие пакеты:

apt-get -y install screen less mc locales

Немного настроим ОС под свои предпочтения:

dpkg-reconfigure locales
dpkg-reconfigure tzdata
update-alternatives --config editor

Для локализации я предпочитаю кодировку en_US.UTF-8, а в качестве текстового редактора – mcedit.
До сих пор все это было подготовительным этапом. Теперь переходим собственно к самой процедуре создания дискового шаблона Debian v7.XX. Необходимо выбрать каталог, в котором мы будем разворачивать образ данной ОС, в моем случае это будет "/mnt/Debian-7-i386-minimal-SIM-Networks". Устанавливаем в материнскую VDS утилиту debootstrap, и с ее помощью производим инсталляцию Debian v7.XX в указанную директорию.

apt-get -y install debootstrap

/usr/sbin/debootstrap --arch i386 wheezy /mnt/Debian-7-i386-minimal-SIM-Networks http://ftp2.de.debian.org/debian

В конце выполнения этой процедуры вы получите в /mnt/Debian-7-i386-minimal-SIM-Networks минимальную инсталляцию Debian v7.XX. Можно даже сказать, что это будет не рабочая ОС, а шаблон без ядра, каких-либо настроек сети, файловых систем, в ней отсутствует даже пакет OpenSSH. Начнем доводку этого шаблона под наши задачи. С помощью chroot войдем в эту систему:

mount -t proc /proc /mnt/Debian-7-i386-minimal-SIM-Networks/proc
LANG=C chroot /mnt/Debian-7-i386-minimal-SIM-Networks /bin/bash

Начнем опять же с настройки репозиториев для менеджера пакетов apt. Правим файл "/etc/apt/sources.list":

deb http://ftp2.de.debian.org/debian/ wheezy main contrib non-free
deb-src http://ftp2.de.debian.org/debian/ wheezy main contrib non-free

deb http://ftp2.de.debian.org/debian/ wheezy-updates main contrib non-free
deb-src http://ftp2.de.debian.org/debian/ wheezy-updates main contrib non-free

deb http://ftp2.de.debian.org/debian/ wheezy-backports main contrib non-free
deb-src http://ftp2.de.debian.org/debian/ wheezy-backports main contrib non-free

deb http://security.debian.org/ wheezy/updates main contrib non-free
deb-src http://security.debian.org/ wheezy/updates main contrib non-free

deb http://ftp.hosteurope.de/mirror/packages.dotdeb.org/ wheezy all
deb-src http://ftp.hosteurope.de/mirror/packages.dotdeb.org/ wheezy all

Устанавливаем публичные ключи:

wget http://www.dotdeb.org/dotdeb.gpg
apt-key add dotdeb.gpg

Обновляем ОС и установленные в ней пакеты:

apt-get -y update
apt-get -y upgrade

Устанавливаем в системе недостающие пакеты. Вы можете скорректировать этот список на свое усмотрение:

apt-get -y install screen less mc locales udev openssh-server bridge-utils busybox firmware-linux-free initramfs-tools makedev module-init-tools perl python python-minimal ssh xen-hypervisor-4.1-i386 python-support unrar-free htop dnsutils tcpdump telnet iotop lftp sysstat dstat atop bzip2 zip ntpdate rsync wget curl smartmontools iftop iptraf mtr xen-linux-system-3.2.0-4-686-pae

Для архитектуры amd64 пакеты "xen-hypervisor-4.1-i386" и "xen-linux-system-3.2.0-4-686-pae" следует заменить на "xen-hypervisor-4.1-amd64" и "xen-linux-system-3.2.0-4-amd64" соответственно. По окончании этой процедуры рекомендую почистить кэш apt в каталоге "/mnt/Debian-7-i386-minimal-SIM-Networks/var/cache/apt/archives". Это позволит сэкономить место.

apt-get clean

По аналогии с материнской VDS сделаем работу в будущем дисковом шаблоне комфортной для себя:

dpkg-reconfigure locales
dpkg-reconfigure tzdata
update-alternatives --config editor

Возможно, вы обратили внимание на изобилие утилит для контроля утилизации ресурсов ОС, которые были установлены среди прочих пакетов. Все они весьма упрощают диагностику, когда клиенты начинают жаловаться на проблему в работе своих VDS. Чаще всего причиной этого являются дефицит ОЗУ или нехватка производительности CPU. Потому одно из первых действий в настройке будущего шаблона – разрешить сбор статистики утилитой sysstat. Для этого в файле "/mnt/Debian-7-i386-minimal-SIM-Networks/etc/default/sysstat" меняем значение опции ENABLED с "false" на "true".
Конфигурирование сетевых интерфейсов производит скрипт инициализации VDS, потому соответствующий файл настроек обнуляем:

truncate -s 0 /mnt/Debian-7-i386-minimal-SIM-Networks/etc/network/interfaces

Перейдем к настройке файловых систем. Файл "/etc/fstab" был изначально заимствован мною из шаблона Debian-6-amd64-minimal/Debian-6-i386-minimal и приведен к следующему виду:

/dev/xvda         /             ext4    defaults,barrier=0                 0    1
proc             /proc         proc    defaults                 0    0

Обратите внимание, что в отличие от Debian-6-amd64-minimal/Debian-6-i386-minimal в создаваемом шаблоне мы переходим с ext3 на ext4.
Для обеспечения взаимодействия панели управления VDSmanager и самой VDS необходимо выполнить ряд мероприятий. Во-первых, создать специальную системную консоль. Для чего следует добавить в файл "/mnt/Debian-7-i386-minimal-SIM-Networks/etc/inittab" следующую строку:

x0:2345:respawn:/sbin/getty -n -L 115200 -l /bin/bash -i hvc0 vt100

А во-вторых, в шаблоне должна присутствовать специальная утилита xenclient-linux-i386/xenclient-linux-amd64:

wget http://download.ispsystem.com/xenclient/xenclient-linux-i386
mv xenclient-linux-i386 xenclient
cp xenclient /mnt/Debian-7-i386-minimal-SIM-Networks/usr/
chmod 644 /mnt/Debian-7-i386-minimal-SIM-Networks/usr/xenclient
mv xenclient /mnt/Debian-7-i386-minimal-SIM-Networks/bin/
chmod 755 /mnt/Debian-7-i386-minimal-SIM-Networks/bin/xenclient

Впрочем, несмотря на все эти мероприятия, связь между VDSmanager и самими VDS носит какой-то неустойчивый характер: если сразу после создания новой системы будет присутствовать статус "Есть связь", то достаточно скоро он сменится на "Сервер не отвечает". В причинах этого явления я не разбирался, поскольку оно характерно не только для вновь создаваемых шаблонов, но и для родных Debian-6-amd64-minimal/Debian-6-i386-minimal.
Имя хоста будет задаваться скриптом инициализации VDS, потому соответствующий файл настроек тоже обнуляем:

truncate -s 0 /mnt/Debian-7-i386-minimal-SIM-Networks/etc/hostname

Проводим аудит и удаляем лишнее из "/mnt/Debian-7-i386-minimal-SIM-Networks/etc/hosts".
Чистим историю интерпретатора командной оболочки BASH и выходим из окружения chroot создаваемого шаблона:

history -c && history -w && rm ~/.bash_history
exit

На этом этапе структура каталогов для будущего шаблона с ОС Linux Debian v7.XX готова, перейдем к созданию скриптов и файлов настройки необходимых для развертывания VDS из VDSmanager. Создадим каталог "/templates/Debian-7-i386-minimal-SIM-Networks", в который необходимо скопировать следующий набор файлов из Debian-6-amd64-minimal/Debian-6-i386-minimal:

config
dropip
getfile
getused
move
setfile
setip
setname
setpass
setup
VERSION

Файл "config" – это шаблон домена XEN, он задает системные параметры VDS. В нем необходимо исправить значения двух опций: kernel и ramdisk.

kernel = "__TEMPL__/vmlinuz-3.2.0-4-686-pae"
ramdisk = "__TEMPL__/initrd.img-3.2.0-4-686-pae"
acpi = 1
apic = 1
name = "__NAME__"
root = "/dev/xvda ro"
vif = [ 'ip=__IP__' ]
disk = [ '__TYPE__:__DISK__,xvda,w' ]
vfb = ['type=vnc, vncunused=0, vncdisplay=__ID__, vncpasswd=__PASSWD__']
on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'
serial='pty'
extra='xencons=hvc0'

Файлы ядра и загрузочного диска RAM необходимо скопировать в каталог "/templates/Debian-7-i386-minimal-SIM-Networks":

cp /mnt/Debian-7-i386-minimal-SIM-Networks/boot/vmlinuz-3.2.0-4-686-pae /templates/Debian-7-i386-minimal-SIM-Networks/
cp /mnt/Debian-7-i386-minimal-SIM-Networks/boot/initrd.img-3.2.0-4-686-pae /templates/Debian-7-i386-minimal-SIM-Networks/

"setup" – это скрипт BASH для первичного конфигурирования VDS. В нем необходимо произвести две правки: заменить вызов mkfs.ext3 на mkfs.ext4, и обеспечить заполнение файл "/etc/hosts".

#!/bin/sh -x

PASS=`cat | sbin/crypt`
FILE=${1#*:}
/sbin/mkfs.ext4 -F $FILE || exit 1
TMP=`mktemp -d tmp/vdssetup-XXXXXX`

if [ $? -ne 0 ]; then exit 1; fi
trap "rm -rf $TMP" EXIT

mount -o loop $FILE $TMP || exit 1
trap "umount $TMP && rm -rf $TMP" EXIT

tar -x -z -p -C $TMP -f ${0%/*}/image || exit 1
cp /etc/resolv.conf $TMP/etc/

echo "# The loopback network interface" >> $TMP/etc/network/interfaces
echo "auto lo" >> $TMP/etc/network/interfaces
echo "iface lo inet loopback" >> $TMP/etc/network/interfaces
echo >> $TMP/etc/network/interfaces

echo "# The primary network interface" >> $TMP/etc/network/interfaces
echo "allow-hotplug eth0" >> $TMP/etc/network/interfaces
echo "iface eth0 inet static" >> $TMP/etc/network/interfaces

echo "  address $2" >> $TMP/etc/network/interfaces
echo "  network $3" >> $TMP/etc/network/interfaces
echo "  netmask $4" >> $TMP/etc/network/interfaces
echo "  broadcast $5" >> $TMP/etc/network/interfaces
echo "  gateway $6" >> $TMP/etc/network/interfaces
echo $7 > $TMP/etc/hostname
echo "$2        $7" >> $TMP/etc/hosts

ssh-keygen -t rsa -N '' -f $TMP/etc/ssh/ssh_host_rsa_key
ssh-keygen -t dsa -N '' -f $TMP/etc/ssh/ssh_host_dsa_key

( /usr/sbin/chroot $TMP /usr/sbin/usermod -p $PASS root ) || exit 1

Правка "move" сводится только к замене вызова mkfs.ext3 на mkfs.ext4. Это скрипт используется при переносе образа диска из одного файла в другой, например, в случае увеличения его размера.

#!/bin/sh -x

FROM=${2#*:}
TO=${3#*:}
/sbin/mkfs.ext4 -F $TO || exit 1
TMP=`mktemp -d tmp/vdssetup-XXXXXX`
if [ $? -ne 0 ]; then exit 1; fi
trap "rm -rf $TMP" EXIT

mount -o loop $TO $TMP || exit 1
trap "umount $TMP && rm -rf $TMP" EXIT

SRC=`mktemp -d tmp/vdssetup-XXXXXX`
if [ $? -ne 0 ]; then exit 1; fi
trap "umount $TMP && rm -rf $TMP $SRC" EXIT

mount -o loop $FROM $SRC || exit 1
trap "umount $TMP $SRC && rm -rf $TMP $SRC" EXIT

tar -c -f- -C $SRC . | tar -x -f- -p -C $TMP

Остальные скрипты и файлы настроек остаются неизменными.
Теперь необходимо создать архив со структурой каталогов для будущего шаблона с ОС Linux Debian v7.XX:

cd /mnt/Debian-7-i386-minimal-SIM-Networks/
umount /mnt/Debian-7-i386-minimal-SIM-Networks/proc
tar czvf image ./ --exclude=image

Перемещаем файл "image"в каталог "/templates/Debian-7-i386-minimal-SIM-Networks" и создаем архив с дисковым шаблоном ОС Linux Debian v7.XX:

mv /mnt/Debian-7-i386-minimal-SIM-Networks/image /templates/Debian-7-i386-minimal-SIM-Networks/
cd /templates/Debian-7-i386-minimal-SIM-Networks/
tar czvf Debian-7-i386-minimal-SIM-Networks.tgz ./ --exclude=Debian-7-i386-minimal-SIM-Networks.tgz

Теперь архив "Debian-7-i386-minimal-SIM-Networks.tgz" содержит дисковый шаблон. Отправляемся в интерфейс Web панели управления VDSmanager: Настройки -> Шаблоны диска. Добавляем новый шаблон, взяв за основу Debian-6-amd64-minimal/Debian-6-i386-minimal, но в качестве локального имени присваиваем Debian-7-amd64-minimal-SIM-Networks/Debian-7-i386-minimal-SIM-Networks.

Новый дисковый шаблон

Отключаем для вновь созданного шаблона автоматическое обновление. Замещаем содержимое каталога "/xen/template/Debian-7-i386-minimal-SIM-Networks" на сервере с VDSmanager содержимым архива "Debian-7-i386-minimal-SIM-Networks.tgz". Теперь шаблон полностью готов для эксплуатации.

Поделиться ссылкой:

  1. Спасибо тебе, добрый человек! Не знаю чтобы я делал без твоей статьи. Инфы по этому продукту вообще кот наплакал, а ты меня просто спас 🙂

    Хотел бы и свою лепту внести с небольшой поправкой)

    Всё это (очень много лишних и непонятных действий):

    wget http://download.ispsystem.com/xenclient/xenclient-linux-i386
    mv xenclient-linux-i386 xenclient
    cp xenclient /mnt/Debian-7-i386-minimal-SIM-Networks/usr/
    chmod 644 /mnt/Debian-7-i386-minimal-SIM-Networks/usr/xenclient
    mv xenclient /mnt/Debian-7-i386-minimal-SIM-Networks/bin/
    chmod 755 /mnt/Debian-7-i386-minimal-SIM-Networks/bin/xenclient

    Можно сократить в два раза:

    cd /bin; wget http://download.ispsystem.com/xenclient/xenclient-linux-i386
    mv xenclient-linux-i386 xenclient
    chmod 755 xenclient

    Всего доброго вам 🙂

    • Спасибо. Полагаю, что наличия "xenclient" только в папке "/bin" будет вполне достаточно. В родном шаблоне Debian-6-amd64-minimal/Debian-6-i386-minimal копия "xenclient" лежит также в "/usr". Зачем, не знаю. Но на всякий случай тоже скопировал в своем шаблоне 🙂 В целом, не судите строго, но в статье полно таких несуразностей, например, нет смысла использовать ядро с поддержкой PAE на архитектуре i386, пакет с гипервизором XEN излишен. Как вы верно заметили, информации очень мало, приходилось выуживать ее по крупицам, поэтому что-то сделано не оптимально, а некоторые действия избыточны. Доводка шаблона – процесс бесконечный. Тратить время на это и на переписывание статьи, не могу.

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


Примечание - Вы можете использовать эти HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>