Далее будут описаны детали того, что можно будет сделать с ansible скриптами. Файлы rescue системы для запуска с pxe создавались отдельно.
Для установки в libvirt на gentoo нам понадобятся следующие настройки в package.use
:
app-emulation/libvirt virt-network
net-dns/dnsmasq script tftp
Создание машин для libvirt:
cd ansible
ansible-playbook -e repo_domain=myhost.com playbooks/vm.yml
Для virtualbox:
cd ansible
ansible-playbook -e repo_domain=myhost.com -e vm_type=vbox playbooks/vm.yml
Для удаления машин используем vm-destroy.yml
playbook.
Для того, чтобы мы могли настроить виртуальные машины, на них должна быть запущена какая-нибудь rescue система (systemrescuecd, gentoo minimal install и т.д.), должна быть настроена сеть (желательно, чтобы виртуальной машине был присвоен именно тот ip адрес, который им будет использоваться далее - так будет проще с ansible), а также надо, чтобы был настроен доступ к этой виртуальной машине.
В качестве rescue системы выберем gentoo minimal - будет проще его модифицировать под наши нужды. Тут также есть два варианта загрузки.
По стандарту gentoo minimal запускается без запущенного sshd и с случайным паролем на root. В такой конфигурации мы не сможем автоматически войти в систему - это требует ручного вмешательства (запуск sshd и изменение пароля на root). Поэтому мы сделаем модификацию iso.
Все операции будем делать из-под root. Для начала примонтируем iso файл:
mkdir iso-mount
mount -o loop gentoo-minimal-install.iso iso-mount
Далее скопируем все файлы в новый каталог, чтобы их можно было модифицировать (так как cp запускается из-под root'а, то копирование будет с сохранением всех аттрибутов):
mkdir iso-new
cp -r iso-mount/* iso-new/
Не забываем убрать mount:
umount iso-mount
rm -rf iso-mount
Для того, чтобы запустить sshd и выставить пароль (плюс ещё уберём интерактивный запрос на выставление keymap'а
для не en языка) нам достаточно прописать параметры запуска ядра (параметры поддерживаются самой iso):
dosshd nokeymap passwd=1
. Пароль при этом будет выставлен в единицу.
Параметры прописываются в файле grub/grub.cfg
и isolinux/isolinux.cfg
.
После этого можно пересобрать iso файл (для этого нам нужен будет установленный пакет cdrtools
):
mkisofs -J -R -l -V "Gentoo Linux - AMD64" \
-o gentoo-minimal-install-insecure.iso \
-b boot/grub/i386-pc/eltorito.img \
-no-emul-boot \
-boot-load-size 4 \
-boot-info-table \
-eltorito-alt-boot \
-b efi.img \
-c boot.catalog \
-no-emul-boot \
-z \
iso-new/
После старта системы к ней можно будет достучаться по ssh с логином root и паролем '1'.
Модификация iso достаточно простая, но у неё есть один нюанс - доступ по паролю и не secure rescue образ, который может куда-нибудь случайно попасть. Также мы не можем динамически генерировать параметры под локальную систему. Загрузка через PXE может решить этот вопрос.
Для libvirt нам надо будет следующее:
- dnsmasq должен быть скомпилирован с поддержкой tftp
- надо настроить tftp и bootp параметры для сети, с которой будем запускаться в libvirt: https://lathama.net/PXE_boot_with_Libvirt - в качестве boot'а будем использовать pxelinux.0 из syslinux
- в параметрах запуска в самой виртуальной машине нам надо будет разрешить запуск с сетевой карты и поставить его вторым после запуска с drive'а.
Для virtualbox:
Подготовим теперь папку, в которой лежат файлы для tftp. Скопируем необходимый минимум из пакета syslinux:
cp /usr/share/syslinux/{pxelinux.0,ldlinux.c32} tftp/
Создадим конфигурацию запуска в tftp/pxelinux.cfg/default
:
DEFAULT gentoo
LABEL gentoo
kernel boot/gentoo root=/dev/ram0 init=/linuxrc loop=boot/image.squashfs looptype=squashfs cdroot=1 real_root=/ dosshd nokeymap
append initrd=boot/gentoo.igz
MENU LABEL gentoo
Для virtualbox надо создавать конфигурацию отдельно для каждого хоста (так как у него нету в dhcp привязки ip к mac адресу).
Конфигурация будет в tftp/pxelinux.cfg/01-XX-XX-XX-XX-XX-XX
, где XX - это mac адрес. Также в строку kernel
надо добавить
параметры настройки сетевых карт после запуска pxe образа и отключить dhcp после запуска:
nodhcp net.conf=if=52:54:00:12:34:56,ip=10.118.10.20/24,if=52:54:00:12:33:56,dhcp dns=1.1.1.1
И последнее: для virtualbox для каждого хоста надо создать symlink'и на pxelinux.0
вида tftp/vmname.pxe
.
Ядро скопируем из распакованного ранее iso: cp boot/gentoo tftp/boot/gentoo
.
Предварительно надо создать сам каталог - mkdir tftp/boot
.
А вот с initrd и образом squashfs всё чуть сложнее. Для того, чтобы нам не надо было поднимать дополнительно nfs и подобные ему, нам понадобится сам образ внести в initrd.
Распаковываем старый initrd:
mkdir initrd
cd initrd
xz -dc ../gentoo.igz | cpio -id
Модифицируем init
файл с помощью initrd.patch. Данный патч добавляет несколько возможностей:
sshkey
- ssh ключ для root пользователя, должен быть закодирован в base64 форматеnet.conf
- конфигурация сетевых карт (надо для virtualbox где не так просто настроить отдельный нормальный dhcp сервер по mac адресу карты)dns
- конфигурирование nameserver'ов через kernel параметры
net.conf
имеет вид: if=<name|mac>,dhcp,if=<name|mac>,ip=<static_ip>,gw=<gateway_ip>
В опции в tftp/pxelinut.cdf/default
добавляем sshkey=XXX
, где xxx получается следующим образом:
cat ~/.ssh/id_ed25519.pub | base64
Переупаковывем initrd:
cd initrd
find . -print | cpio -o -H newc | gzip -9 -c - > ../gentoo.igz
Для автоматической настройк нам не хватает только правильного IP адреса у загруженной в rescue системы
Воспользуемся гайдом: https://www.cyberciti.biz/faq/linux-kvm-libvirt-dnsmasq-dhcp-static-ip-address-configuration-for-guest-os/
В секцию dhcp в настройках сети для этого достаточно заранее прописать ip адреса, связанные с mac адресами сетевых карт виртуальных машин. Имя машины указывать не обязательно:
<dhcp>
...
<host mac='52:54:00:1b:bb:5f' ip='192.168.122.4'/>
...
</dhcp>
Конфигурирование адресов было описано в секции про PXE.