Запуск AltLinux как domU в Xen

При помощи утилиты xen-create-image можно легко создавать виртуальные машины с любой операционной системой, поддержка которой присутствует в каталоге /usr/share/xen-tools/. Заинтересовал вопрос, как же можно создать виртуальную машину не из списка поддерживаемых? В качестве предмета для экспериментов я выбрал AltLinux. Статья делится на две части: подготовка образа для многократного дальнейшего использования и создание из этого образа одной виртуальной машины.

Сразу предупреждаю, что тут я в хвост и в гриву пользуюсь LVM. Во-первых, это удобно. Во-вторых, ну не зря же я мучился? У кого нет LVM, выпутывайтесь сами ;-P

1. Подготовка образа для последующего использования

Скачиваем один из образов из каталога http://ftp.altlinux.org/pub/distributions/ALTLinux/p7/images/starterkits/

Например, я взял altlinux-p7-vm-net-20160312-x86_64.img.xz:

$ cd /home/stupin
$ wget http://ftp.altlinux.org/pub/distributions/ALTLinux/p7/images/starterkits/altlinux-p7-vm-net-20160312-x86_64.img.xz

Распакуем его:

$ cd /home/stupin
$ 7z x altlinux-p7-vm-net-20160312-x86_64.img.xz

Получится файл с именем altlinux-p7-vm-net-20160312-x86_64.img размером 504 мегабайт.

Посмотрим при помощи утилиты file, что представляет собой этот файл:

# file /home/stupin/altlinux-p7-vm-net-20160312-x86_64.img
/home/stupin/altlinux-p7-vm-net-20160312-x86_64.img: DOS/MBR boot sector, LInux i386 boot LOader; partition 1 : ID=0x83, start-CHS (0x0,32,33), end-CHS (0x40,63,63), startsector 2048, 1030144 sectors

Это образ диска с таблицей разделов в стиле DOS.

Создадим логический том такого же размера, что и образ и скопируем в него этот файл посекторно:

# lvcreate -n image -L 528482304b stupin
# cd /home/stupin
# dd if=altlinux-p7-vm-net-20160312-x86_64.img of=/dev/mapper/stupin-image

Если при помощи fdisk посмотреть таблицу разделов в образе, то можно ещё раз убедиться в том, что в образе имеется таблица разделов DOS:

# fdisk -l /dev/mapper/stupin-image

Disk /dev/mapper/stupin-image: 504 MiB, 528482304 bytes, 1032192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0xd6c97625

Device                    Boot Start     End Sectors  Size Id Type
/dev/mapper/stupin-image1       2048 1032191 1030144  503M 83 Linux

Смонтируем файловую систему из первого раздела в каталог /mnt/root:

# partprobe
# mount /dev/mapper/stupin-image1 /mnt/root

Исправим файл etc/inittab, убрав оттуда две консоли и создав вместо них консоль, которая будет доступна из dom0:

1:2345:respawn:/sbin/mingetty hvc0
#1:2345:respawn:/sbin/mingetty --noclear tty1
#2:2345:respawn:/sbin/mingetty tty2

Также я отредактировал файл etc/fstab, прописав монтирование корневой файловой системы по имени устройства вместо монтирования по идентификатору:

/dev/xvda     /                       ext4    relatime                        1 1
#UUID=5b7c2d58-0afa-4bf4-9a42-542935636a05 / ext4 relatime 1 1

Чтобы в дальнейшем меньше пришлось вписывать в файл конфигурации виртуальной машины, создадим файл конфигурации для загрузчика pygrub. Для этого создадим каталог boot/grub:

# cd /mnt/root/boot
# mkdir grub

Внутри каталога создадим файл menu.lst со следующим содержимым:

default         0
timeout         2

title           AltLinux p7 x86_64
root            (hd0,0)
kernel          /boot/vmlinuz root=/dev/xvda ipv6.disable=1 ro
initrd          /boot/initrd.img

title           AltLinux p7 x86_64 (Single-User)
root            (hd0,0)
kernel          /boot/vmlinuz root=/dev/xvda ipv6.disable=1 ro single
initrd          /boot/initrd.img

Поменяем пароль по умолчанию у пользователя root:

# chroot /mnt/root
# passwd
# exit

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

# cd /mnt/root
# tar cjvf /home/stupin/altlinux-p7-vm-net-20160312-x86_64.tbz *

Наконец, раздел можно отмонтировать и уничтожить:

# umount /mnt/root
# dd if=/dev/zero of=/dev/mapper/stupin-image
# partprobe
# lvremove /dev/mapper/stupin-image

2. Создание виртуальной машины

Создадим LVM-раздел для размещения корневого раздела будущей виртуальной машины:

# lvcreate -n inet-root -L 20G stupin

Создадим файловую систему:

# mkfs.ext4 /dev/stupin/inet-root

Смонтируем файловую систему:

# mount /dev/stupin/inet-root /mnt/inet/

И распакуем в неё подготовленный архив с системой:

# cd /mnt/inet/
# tar xjvf /home/stupin/altlinux-p7-vm-net-20160312-x86_64.tbz

Размонтируем корневую файловую систему будущей виртуальной машины:

# cd /
# umount /mnt/inet

Теперь создадим файл конфигурации виртуальной машины /etc/xen/inet.cfg:

bootloader = '/usr/lib/xen-4.4/bin/pygrub'
#kernel = '/boot/vmlinuz'
#ramdisk = '/boot/initrd.img'

name = 'inet'

vcpus = 1
memory = 1024

#root = '/dev/xvda ro'
disk = ['phy:/dev/stupin/inet-root,ioemu:xvda,w']
vif = ['script=vif-bridge,bridge=xenbr0']

on_poweroff = 'destroy'
on_reboot = 'restart'
on_crash = 'restart'
on_xend_start = 'ignore'
on_xend_stop = 'ignore'

Параметры kernel, ramdisk и root закомментированы, потому что внутри образа имеется файл /boot/grub/menu.lst, в котором прописано, в каком файле лежит образ ядра и образ минимального корневого диска, а также прописаны все параметры, передаваемые загрузчиком ядру. В том числе прописан параметр, настраивающий имя устройства, содержащей корневую файловую систему.

Написать автору