Debian.pro

Блог для пользователей и администраторов Debian


Автоустановка debian-виртуалок в KVM — один из способов.

Давным-давно я писал статьи про то, как поставить KVM на debian. С тех времен у меня слегка изменились масштабы бедствия и виртуалок мне по разным причинам приходится заводить по 2-3 в день (точнее, переналивать их, но не суть).

Поэтому я начал искать способ установки виртуалок, при котором соблюдались бы 2 условия:
1) установка происходит полностью без моего вмешательства (1 команда — 1 виртуалка)
2) опции для наливки я могу задать перед установкой — настройки сети, пароли, дополнительные пакеты, etc.

Таким способом оказалось использование preseed’a, с которым я был знаком давно и надолго. Печально, правда, что я встретил множество подводных камней, пока пытался им наливать машинки. Вам я предлагаю не натыкаться на всё это самим, а просто почитать, что я понапишу)

Основная идея заключается в следующем — пишем pressed-файл, подсовываем его инсталлятору внутри виртуалки. Сам d-i берем по сети с http-зеркала. Как-то так.

Для начала разберем пример preseed-файла. Он максимально приближен к установке «по умолчанию»:

# настройки языка и локали в устанавливаемой системе. Используем американскую локаль, но указываем, что наш сервер находится в России.
d-i debian-installer/language string en
d-i debian-installer/country string RU
d-i debian-installer/locale string en_US.UTF-8
d-i localechooser/supported-locales multiselect en_US.UTF8, ru_RU.UTF8


# Настройки клавиатуры. Опять же - американская раскладка.
d-i console-keymaps-at/keymap select us
d-i keyboard-configuration/variant select American English


# Выбираем интерфейс сети, через который будет происходить установка. Для KVM-виртуалок в 99% случаев (если сами не ломали) это eth0. Если сомневаемся - ставим auto.
d-i netcfg/choose_interface select eth0

# Настройки сети. Я привожу пример для ipv6, для v4 вам просто нужно будет поменять адреса.
# важный момент - если настраиваете здесь ipv6 сеть, то обязательно используйте ipv6 nameservers.
# Иначе netmask ffff:ffff:ffff:ffff:: внутри debian-installer'a превратится в 255.255.255.0 (или что-то такое) и вам придется лезть в консоль, чтобы перевбивать настройки лапками.
# если вам нужен ipv4 - то просто замените ipaddress, netmask, gateway, nameservers на корректные v4-адреса. Ничего дополнительно указывать не нужно.
d-i netcfg/dhcp_timeout string 2
d-i netcfg/disable_dhcp boolean true
d-i netcfg/get_ipaddress string 2a01:111:111:111::110
d-i netcfg/get_netmask string ffff:ffff:ffff:ffff::
d-i netcfg/get_gateway string 2a01:111:111:111::2
d-i netcfg/get_nameservers string 2a01:111:111:111::2
d-i netcfg/confirm_static boolean true


# hostname и domain для наливаемой машинки.
# fqdn машины в данном случае будет temporary.debian.pro - если хотите, чтобы на сервере нормально работала отправка почты, то такой же fqdn должен быть прописан в PTR записи "основного" адреса машинки.
d-i netcfg/get_hostname string temporary
d-i netcfg/get_domain string debian.pro


# можно включить ssh-сервер внутри установщика, чтобы продолжить установку по ssh. Но нам это не нужно - просто оставлю для примера.
#d-i anna/choose_modules string network-console
#d-i network-console/password password 1234
#d-i network-console/password-again password 1234

# настройки зеркала apt. Вручную указываем mirror.yandex.ru, а не выбираем какое-то из списка.
# кроме mirror.yandex.ru/mirror6.yandex.ru я пока не встретил работающих v6-зеркал =)
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

# Настройки часового пояса - наш сервер будет жить по часикам в Москве.
# дополнительно, при установке синхронизируем время с ntp.ubuntu.com
d-i clock-setup/utc boolean true
d-i time/zone string Europe/Moscow
d-i clock-setup/ntp boolean true
d-i clock-setup/ntp-server string ntp.ubuntu.com


# Настройка HDD. Внутри виртуалок нам подойдет разметка auto regular atomic (последний раздел - swap = 2xRAM, первый раздел - /, занимающий всё, что осталось после swap'a).
# Саму систему ставим на /dev/vda.
d-i partman-auto/disk string /dev/vda
d-i partman-auto/method string regular
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


# устанавливаем рутовый пароль.
# после установки его, само собой, лучше менять (preseed могут спереть).
d-i passwd/root-password password 1234
d-i passwd/root-password-again password 1234

# не создаём дополнительных пользователей, кроме рута.
d-i passwd/make-user boolean false

# остальные настройки apt'a - включаем contrib и non-free репозитории.
d-i apt-setup/non-free boolean true
d-i apt-setup/contrib boolean true

# в sources.list добавляем так же и backport-ы (в данном случае - для wheezy).
d-i apt-setup/local0/repository string deb http://mirror.yandex.ru/debian wheezy-backports main contrib non-free

# не отправляем данные об установленных пакетах.
popularity-contest popularity-contest/participate boolean false

# ставим только ssh-сервер - никаких гномов/web-серверов и так далее.
tasksel tasksel/first multiselect ssh-server
# указываем, что нам нужны дополнительные пакеты - openssh-server (дада, я видел его строчкой выше, но хочу быть уверенным), htop и dstat.
d-i pkgsel/include string openssh-server htop dstat

# ставим загрузчик, вырубаем виртуалку.
d-i grub-installer/only_debian boolean true
d-i finish-install/reboot_in_progress note
d-i debian-installer/exit/poweroff boolean true


Само собой, часть опций вам придется поменять =) Хотя бы настройки сети.

Файл, который мы понаписали называем preseed.cfg (это важно) и кидаем в любой каталог. Хотя бы даже в /root.

Если у вас не установлен virt-install, ставим его:

root@server:~# apt-get install virt-install

Ну и теперь самое вкусное — запускаем установку машинки:

root@server:~# virt-install -n temporary -r 2000 --disk path=/dev/vg00/temporary-root --location=http://mirror.yandex.ru/debian/dists/stable/main/installer\-amd64 --initrd-inject=/root/preseed.cfg --extra-args="auto keyboard-configuration/xkb-keymap=en" --vnc --noautoconsole --os-type linux --os-variant debianWheezy --accelerate --network=bridge:br0 --hvm

Расскажу, что я тут понаписал:

  • -n temporary — название виртуалки внутри kvm и libvirt
  • -r 2000 — выделяем машинке 2000 мб RAM
  • --disk path=/dev/vg00/temporary-root — машина будет жить на LVM-томе temporary-root внутри vg00. Подробнее.
  • --location=http://mirror.yandex.ru/debian/dists/stable/main/installer\-amd64 — отсюда virt-install скачает установщик debian-a. В данном случае — wheezy, amd64. Не забываем экранировать дефисы.
  • --initrd-inject=/root/preseed.cfg — отсюда мы инжектим preseed.cfg в initrd установщика. Название файла важно, так как он с этим названием и запакуется внутрь initrd.
  • --extra-args="auto keyboard-configuration/xkb-keymap=en" — опции, которые мы передаём установщику. Тут всего 2 опции, они обязательно нужны для автоустановки. Собственно, auto говорит ядру использовать preseed.cfg, а keyboard-configuration сообщает установщику, какую раскладку использовать (иначе он задаст этот вопрос перед началом установки и придется лезть в машинку по VNC)
  • --vnc — у машинки будет VNC, висящий на локальном порту dom0 машины для доступа в консоль. Тут (со слов «выполняем на своём лаптопе») про то, как потом подключиться по VNC. Можно использовать virt-manager ещё
  • --noautoconsole — не пытаемся подключиться к машинке по vnc или через virsh console на время установки. На удаленном сервере vnc таким образом не заработает, а virsh console всё равно настраивать нужно.
  • --os-type linux --os-variant debianWheezy --accelerate --hvm — выставляем оптимальные настройки внутри конфига машинки для запуска нужной нам системы.
  • --network=bridge:br0 — указываем тип сети, который будет использоваться внутри вируталки. В данном случае, виртуалка будет попадать в сеть через бридж на dom0 машине с именем br0. Подробнее.
  • После этого ждем некоторое время (в зависимости от быстродействия dom0-машины и, в особенности, дисковой подсистемы — от 10 минут до… мхм… часа, наверное). Когда машинка установится — она выключится. После этого делаем:

    root@server:~# virsh start temporary

    И ловим машинку в сети.

    Этот способ меня устроил более чем, за тем исключением, что он достаточно медленный ( в смысле, машинка долго ставится). Но установка машинок из tar.gz-шников (как в openvz) требует слишком много ручных действий в том случае, если внутри образа нужно что-то поменять. Из preseed’a же можно хоть слона сделать.
    Ещё был вариант завязаться на LVM-снапшоты или копирование «эталонной машинки» dd-ой, но это медленно.
    Ну и в описанном способе на новой машинке я всегда получаю свежие пакеты.


    Комментарии (8):

    1. ermolenkot :

      зато попробуй пресидом разбить диск чуть более интересно и захочешь повеситься :) если это не нужно, то конечно круто. и по-моему в поле с паролькой можно вставлять хеш от пароля, такой как в shadow прописывается потом.
      сделай скрипт вокруг дебутстрапа, немного более геморный скрипт, зато все бысто ставится, 3 минуты и новая машина у тебя налилась, если тебе надо дебианоподобное что-то.

    2. > зато попробуй пресидом разбить диск чуть более интересно и захочешь повеситься :)
      В виртуалках особенно хитрые конфигурации диска не нужны. А просто разбить диск там достаточно легко.

      > сделай скрипт вокруг дебутстрапа, немного более геморный скрипт, зато все бысто ставится, 3 минуты и новая машина у тебя налилась, если тебе надо дебианоподобное что-то.
      Ага, это второй способ. Только статью никак не напишу.

      Ещё там всякие virt-builder’ы есть и прочее.

    3. yukra :

      кат же.

    4. Я принципиально в RSS отдаю полную версию. На морде автокат начиная со второй статьи.

    5. Taz :

      >Ещё был вариант завязаться на LVM-снапшоты или копирование «эталонной машинки» dd-ой, но это медленно.
      whatthefuuuuuck?!?!??

      не легче тупо virt-clone юзать, не?

    6. > не легче тупо virt-clone юзать, не?
      Тоже вариант. Тоже бестолковый.

    7. Taz :

      почему бестолковый то? если тебе пачку одинаковых виртуалок надо — самое-то.

    8. @Taz а persistent-net удалять кто будет) ?
      А маки менять?

      Геморрой, в общем.

    Написать комментарий