§ KVM Direct Kernel Boot и почему это вкусно.

Обычно работа с KVM строится по простой и привычной схеме. Создаем файл (raw\qcow2) или LVM раздел, который монтируем как диск в виртуалку, после чего делаем необходимую разметку диска внутри (обычно так же создаем разделы lvm, ибо неизвестно понадобиться ли нам в будущем увеличить диск или нет), ставим систему, загрузчик и работаем. Но есть как минимум два НО во всей этой схеме:

1. Скорость. Есть достаточно обоснованные подозрения что LVM внутри раздела LVM или файла (raw\qcow2) не сильно производительное решение.

2. Простота. Существует ряд проблем в сучае необходимости смонтировать такое блочное устройство, что бы например поправить конфиг, или скопировать файлы, или ещё какой rm -rf / запустить. Не сказать что трудности непреодолимые, тем не менее хлопот это доставляет.

Вот тут то и приходит на помощь direct kernel boot. При помощи этой фичи мы можем указать KVM'у файл ядра линукса и initrd файл с которых будем загружать виртуалку. Такой подход позволяет во-первых иметь всего одно ядро для большого количества виртуалок, и обновив это ядро - обновить ядро для всех виртуалок сразу. Во-вторых позволяет использовать LVM раздел не как дисковое блочное устройство, а как обычный раздел, скажем ext4, который так же просто проверить на ошибки, монтировать и вообще делать с ним много всего.

Основное приемущество такого подхода - это легкое и почти прозрачное увеличение раздела. Для этого нам нужно только увличить раздел, и запустить resize2fs. Я думаю что подобный подход можно применить и при уменьшении раздела, но тут очень много нюансов, так что без бекапа не обойтись. Из явных минусов такого подхода - это то, что swap придется делать отдельным диском, но при этом и управлять этим разделом можно точно так же изменяя его размер в любую сторону.

Итак, приступаем к реализации:

Создаем виртуалку:

dd if=/dev/zero of=/home/user/kvm/root.raw bs=1G count=4

dd if=/dev/zero of=/home/user/kvm/swap.raw bs=1M count=512

mkfs.ext4 /home/user/kvm/root.raw

mkswap /home/user/kvm/swap.raw

virt-install --name test --ram 512 --disk /home/user/kvm/root.raw --disk /home/user/kvm/swap.raw --network bridge=virbr0

Я ставил debian, ибо его инсталлятор мне знаком и привычен. Я ставил его в режиме эксперта, и вместо разбиения диска, переключился в консоль, где выполнил:

mkdir /target

mount /dev/vda /target

Сразу оговорюсь, что если вы создаете обазы qcow2, который выигрывает у raw по скорости и возможностям (например создание снапшотов), то во-первых создание файловой системы (mkfs) и создание swap (mkswap) нужно делать непосредственно из виртуалки. Во-вторых если вы выбрали qcow2 то зачем вам вообще вся эта волокита, используйте стандартные средства работы с qcow.

Дальше я запустил установку базовой системы, а после установил необходимые пакеты. После установки файл /etc/fstab у меня оказался пустой. Но я думаю что это правильно, ибо необходимые параметры передаются ядру непосредственно, и настраивать этот файл имеет смысл только если у вас не только root и swap разделы.

Итак мы имеем два файла swap.raw и root.raw, а так же имеем xml файл /etc/libvirt/qemu/test.xml.

Изменить его можно либо вручную, доведя секцию OS до следующего состояния

<os>
  <type arch='x86_64' machine='pc-1.1'>hvm</type>
  <kernel>/boot/vmlinuz-3.10-2-amd64</kernel>
  <initrd>/boot/initrd.img-3.10-2-amd64</initrd>
  <cmdline>root=/dev/vda</cmdline>
  <boot dev='hd'/>
</os>

либо через virt-manager в настройках Boot Options указать в секции Direct kernel boot путь к ядру и initrd, а так же указать Kernel argument: root=/dev/vda

Все, можно запускать. Система у меня завелась с полтычка. Скорость работы впечатлила. Если swap раздел не подключился автоматически - то стоит прописать его в /etc/fstab в остальном, система абсолютно рабочая.

Образ

Теперь я хочу создать образ данной системы, что бы реплицировать ее. Я выключаю виртуалку и приступаю

mount /home/user/kvm/root.raw /mnt/

tar -cvzpf /home/user/kvm/debian7.tar.gz --one-file-system --numeric-owner /mnt

Весь образ весит чуть меньше 200 метров. Очень круто, если учесть что он никак не привязан к размеру диска, и содержит только необходимое.

Развернуть данный образ так же просто вот как это делается на файла RAW:

dd if=/dev/zero of=/home/user/kvm/new_image.raw bs=1G count=8

mkfs.ext4 /home/user/kvm/new_image.raw

mount /home/user/kvm/new_image.raw /mnt

tar -xvzpf /home/user/kvm/debian7.tar.gz --numeric-owner -C /

umount /mnt

В случае с LVM все ещё проще

lvcreate vg -nnew_image -L8g

mkfs.ext4 /dev/vg/new_image

mount /dev/vg/new_image /mnt

tar -xvzpf /home/user/kvm/debian7.tar.gz --numeric-owner -C /

umount /mnt

Все, новый раздел готов для загрузки c KVM. :D

 


comments powered by Disqus