Преобразование HVM-домена Xen в паравиртуальный
Материал из Xgu.ru
- Короткий URL: xen/hvm2pv
Здесь описывается каким образом можно преобразовать HVM-машину в паравиртуальную. Такое преобразование возможно только в том случае, если для гостевой операционной системы существует ядро, способное работать в паравиртуальном домене Xen. За некоторыми исключениями, это означает, что в настоящий момент преобразование HVM-домена в паравиртуальный возможно только для ОС Linux.
Содержание |
[править] Способы подготовки к паравиртуализации
Самый простой способ: загрузиться непосредственно в реальной машине и подготовить её к паравиртуализации. Однако, этот способ не всегда доступен. Например, исходной машины уже может не быть или она может быть занята и недоступна для экспериментов, а образ её есть. Можно загрузить этот образ в HVM-домене или эмуляторе, однако быстрее будет непосредственно обратиться к образу и подготовить его к запуску в паравиртуальном режиме.
[править] Подготовка к паравиртуализации запущенной системы
- Оригинал: Паравіртуалізация RHEL5, Олександр Юдін (укр.)
Устанавливаем RHEL5 в HVM-домен, для того чтобы потом паравиртуализировать его. Код инсталляции берём у наших заокеанских товарищей на странице: http://cyclops.iastate.edu/pub/RHEL5-README.txt Нас интересует сервер, поэтому вводим: a41b-566a-a41f-1d56 (спасибо тебе, Америка).
В ходе инсталляции нам понадобятся навыки работы с консолью VNC, касающиеся замены ISO-образов дистрибутива в виртуальном CDROM.
"В VNC-окне нажать ctr-alt-2, что переключит вас на консоль qemu. Дальше использовать eject и прочие команды для смены диска. После того как образ заменён, нажать ctrl-alt-1 (не F1! не путайте!) для возврата в консоль (графическую) гостевой операционной системы. По умолчанию в новых версиях Xen эта возможность отключена. Для того чтобы её включить, нужно указать в конфигурационном файле домена monitor=1"
(qemu) eject hdc (qemu) change hdc /root/xenimages/rhel-5-server-i386-disc2.iso
После того как у нас "завёлся" RHEL5 в HVM-домене, устанавливаем в него паравиртуальное ядро. Пакет с ядром находится на первом диске дистрибутива RHEL5.
rpm -i kernel-xen-2.6.18-8.el5.i686.rpm
Обновим initrd, добавив в него необходимые драйверы. В дальнейшем для загрузки PV-домена будем использовать его.
mkinitrd /boot/initrd-2.6.18-8.el5xenU.img 2.6.18-8.el5xen --fstab /mnt/etc/fstab --with xenblk --with xennet --preload xenblk --preload xennet
Для того, чтобы не переносить паравиртуальное ядро и initrd в dom0, используем pygrub. Конфигурационный файл домена будет выглядеть так:
bootloader='/usr/lib/xen-3.2-1/bin/pygrub' memory = 512 name = "bifit" vcpus=1 vif = [ 'bridge=xenbr4,mac=00:16:3e:01:12:c1' ] disk = ['phy:/dev/drbd/bifit,hda,w'] on_poweroff = 'destroy' on_reboot = 'restart' on_crash = 'restart'
Конфигурационный файл GRUB внутри домена DomU выглядит следующим образом:
default=0 timeout=5 title Red Hat Enterprise Linux Server (2.6.18-8.el5xen) root (hd0,0) kernel /boot/vmlinuz-2.6.18-8.el5xen ro root=/dev/hda1 initrd /boot/initrd-2.6.18-8.el5xenU.img
[править] Паравиртуализация системы без её запуска
[править] Доступ к файловой системе виртуальной машины
Машина должна быть выключена. Иначе можно повредить файловые системы.
С помощью losetup нужно подключить диск виртуальной машины к блочному устройству.
%$ losetup /dev/loop0 virtual-disk
После этого посмотреть информацию о диске с помощью fdisk:
%$ fdisk -l -u /dev/loop0 Disk /dev/loop0: 8388 MB, 8388608000 bytes 255 heads, 63 sectors/track, 1019 cylinders, total 16384000 sectors Units = sectors of 1 * 512 = 512 bytes Device Boot Start End Blocks Id System /dev/loop0p1 * 63 208844 104391 83 Linux /dev/loop0p2 208845 16370234 8080695 8e Linux LVM
Здесь есть какой-то маленький раздел (вероятно /boot) и LVM.
Снова вызовите losetup, и подключите уже отдельный раздел к другому блочному устройству.
Например, для раздела /boot:
%$ losetup -o $((512*63)) /dev/loop1 /dev/loop0 %$ mount /dev/loop1 /mnt
Ключ -o указывает отступ, который нужно сделать от начала файла при подключении образа к loop-файлу.
Если мы хотим подмонтировать файловые системы, которые находятся внутри LVM, то нужно сделать так.
Во-первых, подключить второй раздел к блочному устройству.
%$ losetup -o $$(208845*512) /dev/loop2 /dev/loop0
Во-вторых, сказать LVM-системе, что loop-устройства тоже могут содержать тома LVM, и что сканировать и их.
Для этого нужно отредактировать файл /etc/lvm/lvm.conf и найти строку types. Скорее всего она будет закомментирована, а в комментариях будут указаны значения по умолчанию.
# types = [ “fd”, 16]
Измените её на строку:
types = [ “fd”, 16, “loop”, 1]
и выполните сканирование:
$ vgscan ACTIVE '/dev/system/root' [14.62 GB] inherit ACTIVE '/dev/system/home' [97.66 GB] inherit ACTIVE '/dev/system/tmp' [512.00 MB] inherit ACTIVE '/dev/system/swap' [4.00 GB] inherit inactive '/dev/VolGroup00/LogVol00' [5.75 GB] inherit inactive '/dev/VolGroup00/LogVol01' [1.94 GB] inherit
Мы сможем работать с группой томов LogVol00, которая находится на подключенном образе.
$ vgchange -a y 4 logical volume(s) in volume group "system" now active 2 logical volume(s) in volume group "VolGroup00" now active $ mount /dev/VolGroup00/LogVol01 /mnt/
[править] Изменение гостевой системы
Теперь вы можете скопировать необходимые файлы внутрь виртуальной машины. В частности, нужно скопировать модули виртуального ядра:
%# cp -a /lib/modules/`uname -r` /mnt/lib/modules
(если мы будем запускать паравиртуальный домен не с тем ядром, которое используем сейчас, то нужно заменить `uname -r` на версию нужного ядра).
Установите libc6-xen или другим способом отключите использование TLS-библиотек.
mv /mnt/lib/tls /mnt/lib/tls.disabled
Вы можете стереть записи udev, касающиеся сетевого интерфейса, поскольку MAC-адрес виртуального сетевого адаптера будет отличаться от реального, который использовался раньше, и который был запомнен udev. Если этого не делать, нужно отредактировать настройки сети (/etc/network/interfaces для Debian GNU/Linux) и указать новое название интерфейсов. Иначе при старте домена сеть настроена не будет.
Если у вас в конвертируемой машине раньше загружались какие-то специфичные (предполагающие наличие определённого оборудования) модули ядра, их загрузку тоже лучше отключить.
[править] Приведение хост-системы в исходное состояние
После того как все операции по подготовке машины в паравиртуальном режиме завершены, нужно размонтировать все разделы и отключить их от loop-устройств.
$ umount /mnt $ vgchange –activate n VolGroup00 $ losetup -d /dev/loop2 $ losetup -d /dev/loop1 $ losetup -d /dev/loop0
Можно также привести файл /etc/lvm/lvm.conf в исходное состояние.
[править] Важные замечания
- LVM имена должны быть уникальными в пределах системы! Поэтому имена в виртуальной и реальной машинах не должны повторяться!
- Если нужно изменить UUID для виртуального диска, почитайте как это сделать в файле uuidgen.py из дистрибутива Xen
- Для решения описанной выше задачи можно использовать не losetup, а kpartx (подробнее: LVM)
[править] Дополнительная информация
- LVM в том месте, где рассказываается про kpartx (альтернативный способ)
- How to manipulate the files stored inside a Xen virtual machine (англ.)
- Creating a customized master image for a Xen virtual server manually (англ.)
|
---|