Это старая версия документа!
XEN - pvgrub
По мотивам умной статьи
PVGrub - вариант загрузчика grub, собираемый из исходных кодов оригинального grub для загрузки на архитектуре Xen. Никаких BIOS, UEFI и тому подобного - только PV, только хардкор. Не хотел бы я быть на месте этого загрузчика - каково это, очнуться и понять, что ты существуешь где-то, но у этого где-то нет никаких привычных свойств…
Тот факт, что pvgrub выполняется внутри гостя, гарантирует большее соблюдение стандартов безопасности, особенно по сравнению с pygrub, который мало того, что написан на python, но ещё и выполняется в dom0 и, соответственно, полностью подчинён админу или зловредам.
Несколько фактов о pvgrub:
- пакет, называющийся как-то типа xen-pvgrub есть в gentoo, но нет в centos
- пакет этот даже в генте абсолютно лишён смысля, так как поставляет пресобранный grub-0.97, сегодня мало кому нужный
- лучший способ получить нужный pvgrub - собрать его с помощью команды grub-mkimage (или grub2-mkimage, в зависимости от дистрибутива)
- так как pvgrub - плоть от плоти полноценного grub, то наследует все его свойства и нововведения. Следовательно, чтобы pvgrub начал поддерживать изменившийся формат конфигов grub версии 2.04, достаточно собрать pvgrub с помощью grub2-mkimage из grub версии 2.04. И всё )
Однако, есть и «особенность». К примеру, в centos пакет grub не содержит архитектуру xen, так что собрать загрузчик под арзитектуру xen не представляется возможным.
Как всегда, на помощь приходит gentoo )
Памятуя про проблему изменившегося формата конфига между версиями 2.02 и 2.04 ставим сначала версию 2.02, собираем pvgrub, затем ставим 2.04 и собираем ещё один pvgrub:
GRUB_PLATFORMS=«pc xen» emerge -av1 =sys-boot/grub-2.02-r4
grub-mkimage -O x86_64-xen -c /root/grub.cfg -o grub-2.02-x86_64-xen.bin /usr/lib/grub/x86_64-xen/*.mod -p /usr
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 в «папочку» не баг, а фича )
Что жу происходит далее?
Берём сферический конфиг виртуалки в вакууме. Ну, к примеру, вот такой:
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.02-x86_64-xen.bin»
и, если вдруг захочется, дополнительные параметры:
normal (xen/xvda,msdos1)/boot/grub2/grub.cfg
Voila! Теперь при старте гостевой виртуальной машины внутрь загружается «ядро»-pvgrub, который, используя встроенный конфиг, лезет в xvda1, читает там grub.cfg и отображает привычное нам grub-меню и далее по тексту. Всё работает, можно начинать хейтить pygrub.