Давным-давно я писал статьи про то, как поставить 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, ставим его:
В Debian 8 и выше:
Ну и теперь самое вкусное — запускаем установку машинки:
Расскажу, что я тут понаписал:
-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 минут до… мхм… часа, наверное). Когда машинка установится — она выключится. После этого делаем:
И ловим машинку в сети.
Этот способ меня устроил более чем, за тем исключением, что он достаточно медленный ( в смысле, машинка долго ставится). Но установка машинок из tar.gz-шников (как в openvz) требует слишком много ручных действий в том случае, если внутри образа нужно что-то поменять. Из preseed’a же можно хоть слона сделать.
Ещё был вариант завязаться на LVM-снапшоты или копирование «эталонной машинки» dd-ой, но это медленно.
Ну и в описанном способе на новой машинке я всегда получаю свежие пакеты.
зато попробуй пресидом разбить диск чуть более интересно и захочешь повеситься :) если это не нужно, то конечно круто. и по-моему в поле с паролькой можно вставлять хеш от пароля, такой как в shadow прописывается потом.
сделай скрипт вокруг дебутстрапа, немного более геморный скрипт, зато все бысто ставится, 3 минуты и новая машина у тебя налилась, если тебе надо дебианоподобное что-то.
> зато попробуй пресидом разбить диск чуть более интересно и захочешь повеситься :)
В виртуалках особенно хитрые конфигурации диска не нужны. А просто разбить диск там достаточно легко.
> сделай скрипт вокруг дебутстрапа, немного более геморный скрипт, зато все бысто ставится, 3 минуты и новая машина у тебя налилась, если тебе надо дебианоподобное что-то.
Ага, это второй способ. Только статью никак не напишу.
Ещё там всякие virt-builder’ы есть и прочее.
кат же.
Я принципиально в RSS отдаю полную версию. На морде автокат начиная со второй статьи.
>Ещё был вариант завязаться на LVM-снапшоты или копирование «эталонной машинки» dd-ой, но это медленно.
whatthefuuuuuck?!?!??
не легче тупо virt-clone юзать, не?
> не легче тупо virt-clone юзать, не?
Тоже вариант. Тоже бестолковый.
почему бестолковый то? если тебе пачку одинаковых виртуалок надо — самое-то.
@Taz а persistent-net удалять кто будет) ?
А маки менять?
Геморрой, в общем.