XEN - pvgrub

По мотивам умной статьи

PVGrub - вариант загрузчика grub, собираемый из исходных кодов оригинального grub для загрузки на архитектуре Xen-PV. Никаких BIOS, UEFI и тому подобного - только PV, только хардкор. Не хотел бы я быть на месте этого загрузчика: какого это, очнуться и понять, что ты существуешь где-то, но у этого где-то нет никаких привычных свойств, формы, цвета, направлений…


Земля же бе невидима и неустроена, и тма верху бeздны, и дух бжій ношaшеся верху воды. (Бытие 1:2)
«и Дух Божий носился…» В объяснении этих слов толковники довольно сильно расходятся между собою: одни видят здесь простое указание на обыкновенный ветер, ниспосланный Богом для осушения земли (Тертуллиан, Ефрем Сирин, Феодорит, Абен-Езра, Розенмюллер), другие — на Ангела, или особую умную силу, назначенную для той же цели (Златоуст, Кайзетан и др.), третьи, наконец, — на Ипостасного Духа Божия (Василий Великий, Афанасий, Иероним и большинство прочих экзегетов). Последнее толкование предпочтительнее прочих: оно указывает на участие в деле творения и третьего лица Святой Троицы, Духа Божия, являющего Собой ту зиждительно-промыслительную силу, которая, по обще-библейскому воззрению, обусловливает происхождение и существование всего мира, не исключая и человека (Быт.2:7; Пс.32:6; Иов.27:3; Ис.34:16; Деян.17:29 и др.). Самое действие Святого Духа на хаос уподобляется здесь действию птицы, сидящей в гнезде на яйцах и согревающей их своей теплотой для пробуждения в них жизни (Втор.32:11).


Тот факт, что особая умная силаpvgrub выполняется внутри гостя, гарантирует большее соблюдение стандартов безопасности, особенно по сравнению с pygrub, который мало того, что написан на python, так ещё и выполняется в dom0 и, соответственно, полностью подчинён админу или зловредам.

Несколько фактов о pvgrub:

Однако, есть и «особенность». К примеру, в centos пакет grub собран без поддержки архитектуры xen, так что собрать загрузчик под архитектуру xen не представляется возможным.

Памятуя про проблему изменившегося формата конфига между версиями 2.02 и 2.04 отключаем формирование нового типа конфига в centos 8:

Теперь собираем pvgrub. Как всегда, на помощь приходит gentoo ) :

GRUB_PLATFORMS=«pc xen» emerge -av1 =sys-boot/grub-2.04-r1
grub-mkimage -O x86_64-xen -c /root/grub.cfg -o grub-2.04-x86_64-xen.bin /usr/lib/grub/x86_64-xen/*.mod -p /usr

Всё, мы готовы к любым ударам судьбы! Теперь немного подробностей.

pvgrub позволяет вкомпилить в себя default-конфиг (/root/grub.cfg), который, естественно, имеет низший приоритет и используется только тогда, когда нет никаких других вводных. Вводные задаются в «командной строке» вызова загрузчика, т.е. в нашем случае чере опцию «extra» конфига xen-гостя. В конфиг я записал

normal (xen/xvda,msdos1)/boot/grub2/grub.cfg

…что означает «загрузи в качестве конфига файл /boot/grub2/grub.cfg с файловой системы, расположенной на первом разделе ms-dos разметки блочного устройства xvda». По счастливой случайности на наших centos-гостях разметка разделов именно такая, так что грузиться оные будут без проблем даже без дополнительной конфигурации.

Так как мы собираем загрузчик исходя из требований универсальности, то включаем в него все доступные модули (поддержка ФС, накопителей и т.п.) - *.mod это как раз про это.

Префикс /usr мы указываем, чтобы уточнить местонахождение файлов установленного grub, по образу которых мы и собираем нашего «узкого специалиста». Чтож, если используется не gentoo, то геморрой с ручной компиляцией нужного grub в «папочку» не баг, а фича ) Кстати, по ссылке в начале статьи описан именно он - желающие могут причаститься (если кратко, то «./configure –target=amd64 –with-platform=xen»).

Что же далее?

Берём сферический конфиг виртуалки в вакууме. Ну, к примеру, вот такой:

name = 'vm0'
cpu_weight=192

bootloader = «/usr/lib/xen/bin/pygrub»

memory = 4096
maxmem = 4096
vcpus = 2
vif = ['mac=00:00:00:00:00:00, bridge=br001']

disk = ['phy:/dev/vg0/vm0.0,xvda,w',
'phy:/dev/vg0/vm0.1,xvdb,w',
'phy:/dev/vg0/vm0.2,xvdc,w',
'phy:/dev/vg0/vm0.3,xvdd,w']

on_poweroff = 'destroy'
on_reboot = 'restart'
on_crash = 'restart'

… и вместо строки bootloader… пишем:

kernel = «/etc/xen/grub-2.04-x86_64-xen.bin»

и, если вдруг захочется, дополнительные параметры:

normal (xen/xvda,msdos1)/boot/grub2/grub.cfg

Voila! Теперь при старте гостевой виртуальной машины внутрь загружается «ядро»-pvgrub, который, используя встроенный конфиг, лезет в xvda1, читает там grub.cfg и отображает привычное нам grub-меню, ну и далее по тексту («…и отделил Бог свет от тьмы…»). Всё работает, можно начинать хейтить pygrub.