Автоматическая установка с гостевой ОС Debian в xen c помощью списка ответов.

Настроим автоматическое(с минимальным участием администратора) разворачивание виртуальной машины c os linux debian 8 на гипервизоре xen. В Debian есть возможность автоматически установить операционную систему используя заранее заготовленный файл ответов, с ним я и буду работать.

Вкратце расскажу об окружении гипервизор xen 4.4.1, хостовая ос debian 8.6, веб-сервер nginx 1.11.5, гостевая ос debian 8.6

Создаем папку в домашней директории пользователя ~/xen/debian-8/iso, и скачиваем туда свежий дистрибутив debian

mkdir -p ~/xen/debian-8/iso
cd ~/xen/debian-8/iso
wget http://cdimage.debian.org/debian-cd/8.6.0/amd64/iso-cd/debian-8.6.0-amd64-netinst.iso

Отлично, далее устанавливаем nginx и настраиваем виртуальный хост, который будет отдавать нам файл ответов.

apt install nginx
vim /etc/nginx/sites-available/deb_auto.conf
server {
    listen       80;
    server_name  default;
 
    access_log  /var/log/nginx/deb_install_nginx.log  main;
 
    location / {
        root   /var/www/html;
        index  index.html index.htm;
    }
 
    error_page  404              /404.html;
 
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
 
}
cd /etc/nginx/sites-enabled/
ln -s ../sites-available/deb_auto.conf
nginx -t
nginx -s reload

Веб сервер настроен, теперь создадим файл ответов, полную его версию можно найти по ссылке https://www.debian.org/releases/jessie/example-preseed.txt , здесь же я приведу строчки интересовавшие меня.

vim /var/www/html/deb_install.cfg
d-i debian-installer/language string en
d-i debian-installer/country string RU
d-i debian-installer/locale string en_US
d-i localechooser/supported-locales multiselect en_US.UTF8, ru_RU.UTF8
 
d-i keyboard-configuration/xkb-keymap select us
d-i console-keymaps-at/keymap select us
d-i keyboard-configuration/variant select American English
 
d-i mirror/country string manual
d-i mirror/http/hostname string mirror.yandex.ru
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string
 
d-i passwd/root-login boolean true
d-i passwd/make-user boolean false
 
d-i passwd/root-password password r00tme
d-i passwd/root-password-again password r00tme
 
d-i clock-setup/utc boolean true
 
d-i time/zone string Europe/Moscow
 
d-i clock-setup/ntp boolean true
 
d-i partman-auto/method string lvm
 
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
 
d-i partman-auto/choose_recipe select atomic
 
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
 
d-i partman-md/confirm boolean true
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
 
d-i base-installer/install-recommends boolean true
 
tasksel tasksel/first multiselect standard, ssh-server
 
d-i pkgsel/include string openssh-server vim mc tcpdump
popularity-contest popularity-contest/participate boolean false
 
d-i grub-installer/only_debian boolean true
 
d-i grub-installer/with_other_os boolean true
 
d-i grub-installer/bootdev  string default
 
d-i finish-install/reboot_in_progress note
 
d-i debian-installer/exit/poweroff boolean true
chown nginx:nginx /var/www/html/deb_install.cfg

Думаю из названия директив понятно, какая за что отвечает, комментировать и расписывать не стану.
Имя хоста и домена здесь не заданы, т.к. они почему-то не подхватываются, не мог найти этому объяснения, возможно они задаются раньше, чем конфигурируется сеть, и файл ответов еще не доступен. Поэтому передаем их в качестве параметра ядра.

Почти закончил, осталось написать скрипт, который, собственно, это все и объединяет.

> ~/xen/debian-8/mkvm
chmod u+x ~/xen/debian-8/mkvm
vim ~/xen/debian-8/mkvm
#!/bin/bash
 
hostname=test      	#имя хоста
domainname=local   	#имя домена
 
memory=1024		#выделенная память
cpu=1			#количество ядер
 
vg=vmstore		#имя lv на котором будет располагаться файловая система
sizelv=6		#размер диска в Gb
 
ip=192.168.1.1		#ip гипервизора
 
iso=/root/xen/debian-8/iso/debian-8.6.0-amd64-netinst.iso 	#путь до дистрибутива
xenauto=/etc/xen/auto/						#путь до папки с конфигами вм для автозапуска
 
#создаем lv 
 
name=${hostname}.${domainname}
lv=${name}
 
lvcreate -L${sizelv}Gb -n${lv} ${vg}
 
#создаем конфиг для установки вм
 
cat <<EOF > ./install-${name}
name = "${name}"
memory = ${memory}
vcpus = ${cpu}
 
disk = [ 
        'file:${iso},xvdd:cdrom,r', 
        'phy:/dev/${vg}/${lv},xvda,w'
        ]
 
bootloader = "pygrub"
 
bootloader_args = [
         '--kernel=/install.amd/xen/vmlinuz',
         '--ramdisk=/install.amd/xen/initrd.gz'
        ]
 
extra = 'auto=true url=http://${ip}/deb_install.cfg hostname=${hostname} domain=${domainname}'
 
vif = [ 'bridge=xenbr1' ]
 
EOF
 
#создаем конфиг для запуска вм, помещаем в папку для автозапуска вм
 
cat <<EOF > ${xenauto}$name
name = "${name}"
memory = ${memory}
vcpus = ${cpu}
disk = [ 
        'phy:/dev/${vg}/${lv},xvda,w'
        ]
 
bootloader = "pygrub"
vif = [ 'bridge=xenbr1' ]
 
on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'
 
EOF
 
#запускаем установке вм
 
xl create ./install-${name} -c
 
#удаляем файл установки вм
 
rm ./install-${name}
 
#запускаем установленную vm
xl create ${xenauto}$name -c

Теперь все, запускаем скрипт и смотрим на автоматическую установку(либо занимаемся чем то более полезным в это время).

Единственное, что у меня не получилось реализовать, это настройка статического ip, приходится довольствоваться динамическим, при необходимости потом сменить. Если кто то знает как это реализовать отпишитесь в комментариях.