Про виртуализацию на основе kvm

В этом вопросе ничего сложного нет, но опять же когда сталкиваешься в первый раз приходится тратить время на освоение теории.

Здесь будет рассмотрен клиент-серверный вариант виртуализации KVM. Под этой незатейлевой фразой понимается что существует некая машина, на которой пусть будет запущена ubunta и она будет являться сервером виртуализации, т. к. на ней будут запущены виртуальные машины. Также будет существовать другая машина (ПК), которая будет клиентом и сможет подключаться к серверу.

На сервере и клиенте нужно установить:

sudo apt-get install python-virtinst kvm libvirt-bin bridge-utils

и добавить пользователя:

sudo adduser $USER libvirtd

А также графические утилиты virt-manager и Vinagre.
virt-manager — графическая утилита для управления виртуальными машинами на сервере виртуальных машин.
Vinagre — графическая утилита для подключения к серверу виртуальных машин. Может запускаться как на сервере так и на удаленном клиенте. Также для этой цели может использоваться утилита - remmina

 

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

Перед созданием виртуальной машины нужно на сервере создать бридж br0 и включить в его состав тот сетевой интерфейс через который виртуальная машина будет общаться с миром.

Само создание виртуальной машины это всего лишь одна строка:

sudo virt-install -n vuserv -r 384 -f vuserv.img -s 10 -c ubuntu-14.04.2-server-powerpc.iso --accelerate --os-type=linux --os-variant=generic26 -v --vnc -w bridge:br0

Если установлен virt-viewer то откроется окно в котором будет процесс установки ubuntu. Установку можно завершить прямо в этом окне либо подключившись клиентом (процесс подключения описан ниже).
Чтобы себя проверить можно выполнить:

virsh list —all

либо:

virsh -c qemu:///system list —all

По этой команде будет список виртуальных машин и их текущее состояние. Так же можно открыть графический менеджер (virt-manager) виртуальных машин.

Подключаемся клиентом.

Локальное подключение т.е. запуск клиента на сервере виртуальных машин:

Запускаем программу Vinagre. Протокол — vnc. Узел — localhost:5900. Нажимаем «Подключиться». Всё, на экране должна появиться виртуальная машина.

Другой способ через консоль. Проверяем что есть доступ через консоль:

$ virsh ttyconsole vuserv
/dev/pts/3

Подключаемся так:

sudo virsh console vuserv 
Выполнено подключение к домену tstVM1 
Escape character is ^] 
Ubuntu 14.04.2 LTS ubserv ttyS0 
ubserv login: 

либо так:

$ sudo socat - /dev/pts/3 
Ubuntu 14.04.2 LTS ubserv ttyS0 
ubserv login: 

Удаленное подключение, т.е. подключение к серверу виртуальных машин по сети.

На клиенте нужно настроить ssh туннель. Делается это как-то так:

ssh -f -N -L 59000:localhost:5900 user1@192.168.1.99

user1@192.168.1.99 — адрес сервера виртуальных машин и имя пользователя на этом сервере.
localhost:5900 — это тот же localhost:5900 что и при локальном подключении.
59000 — это произвольный номер порта.

Теперь запускаем программу Vinagre. Протокол — vnc. Узел — localhost:59000. Нажимаем «Подключиться». Всё, на экране должна появиться виртуальная машина.

Далее просто список полезных команд:

Запуск виртуальной машины: virsh start vuserv

Остановка виртуальной машины: virsh destroy vuserv

Удаление виртуальной машины: virsh undefine vuserv

Получение xml описания виртуальной машины: virsh dumpxml vuserv > vuserv.xml

Правка xml описания виртуальной машины: virsh edit DevVM-01

 

Еще немного про виртуализацию kvm.

Виртуализация kvm основана на запуске qemu-system-xxx, т.е. если выполнить к примеру вот такую команду:

qemu-system-ppc -enable-kvm -m 512 -nographic -M ppce500 -kernel /home/user/uImage -initrd /home/user/rootfs.ext2.gz -append "root=/dev/ram rw console=ttyS0,115200" -serial tcp::4444,server,telnet
(qemu)QEMU waiting for connection on: telnet::0.0.0.0:4444,server

То будет создана виртуальная машина, и она запуститься сразу как только произойдет соединение через telnet. (на сервере виртуальных машин запускаем qemu-system-ppc, а на клиенте запускаем: telnet 192.168.1.234 4444 и увидим стандартуную консоль.В данном случае консоль виртуальной машины перенаправляется в телнет соединение.)

Поместим всю эту длинную команду в файл, но при этом заменим вывод отладочной инфорации не в telnet, а в pty:

$ cat kvm1.args
/usr/bin/qemu-system-ppc -m 256 -nographic -M ppce500 -kernel /boot/uImage -initrd /home/root/my.rootfs.ext2.gz -append "root=/dev/ram rw console=ttyS0,115200" -serial pty -enable-kvm -name kvm1

Теперь на основании этого файла, мы можем сгенерировать xml файл виртуальной машины. Делается это так:

virsh domxml-from-native qemu-argv kvm1.args  > kvm1.xml
$ cat kvm1.xml
<domain type='kvm'>
  <name>kvm1</name>
  <uuid>f5b7cf86-41eb-eb78-4284-16501ff9f0e1</uuid>
  <memory unit='KiB'>262144</memory>
  <currentMemory unit='KiB'>262144</currentMemory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='ppc' machine='ppce500'>hvm</type>
    <kernel>/boot/uImage</kernel>
    <initrd>/home/root/rootfs.ext2.gz</initrd>
    <cmdline>root=/dev/ram rw console=ttyS0,115200</cmdline>
  </os>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/bin/qemu-system-ppc</emulator>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <memballoon model='virtio'/>
  </devices>
</domain>

Дальше всё просто:

1. Создаём виртуальную машину на основе xml файла:

# virsh define kvm1.xml
Domain kvm1 defined from kvm1.xml
# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     kvm1                           shut off

2. Запускаем виртуальную машину:

# virsh start kvm1
Domain kvm1 started

# virsh list
 Id    Name                           State
----------------------------------------------------
 3     kvm1                           running

3. Подключаемся к виртуальной машине (должны при этом увидеть туже отладочную консоль что и в примере с телнетом):

# virsh console kvm1
Connected to domain kvm1
Escape character is ^]

Еще немного простых примеров для тестирования qemu:

1. Запуск из командной строки qemu-system-ppc64, qemu-system-x86_64 и пр. должен приводить к открытию нового окна в котором будет осуществлен запуск bios.

2. Простейшая загрузка системы. Имеем ядро и фс в образе ext2. Выполняем данный скрипт и в новом открывшемся окне увидим как ядро прогружается, запускается фс и работает командная строка. (ядро и фс получены с помощью buildroot)

#! /bin/sh 

LOCATION="buildroot_x86/output/images" 
KERNEL="bzImage" 
DISK="rootfs_my.ext2" 

qemu-system-i386 -kernel $LOCATION/$KERNEL \ 
-hda $LOCATION/$DISK \ 
-boot c \ 
-m 128 \ 
-append "root=/dev/sda rw" \ 
-localtime \ 
-no-reboot \ 
-name rtlinux 

Скрипт для создания ext2 образа фс
#!/bin/sh 

rm -f /tmp/ext2img.img 

RDSIZE=30000 
BLKSIZE=1024 

dd if=/dev/zero of=/tmp/ext2img.img bs=$BLKSIZE count=$RDSIZE 

mke2fs -F -m 0 -b $BLKSIZE /tmp/ext2img.img $RDSIZE 

sudo mount /tmp/ext2img.img /mnt/ext2img -t ext2 -o loop 

sudo cp -R ./rootfs/* /mnt/ext2img 

sudo umount /mnt/ext2img 
cp /tmp/ext2img.img ./rootfs_my.ext2 
 

Монтирование qemu virtio образа в ubuntu.

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

-drive file=guest_disk_image,cache=none,if=virtio

и после загрузки системы виден как /dev/vda (/dev/vda1).

Для устройства /dev/vda доступны все стандартные минипуляции с дисковыми устройствами, такие как fdisk, mkfs и пр.

Так образом монтирование данного образа в ubuntu осуществляется так:

sudo modprobe nbd 
sudo qemu-nbd -c /dev/nbd0 ./guest_disk_image 
mount /dev/nbd0p1 ./mnt 

для отмонтирования:

umount ./mnt 
sudo qemu-nbd -d /dev/nbd0 

Данный алгоритм монтирования также подходит для монтирования vdi образов.

Работа с виртуальными дисками Virtio.

Передача параметра при запуске qemu выглядит как-то так:

-drive file=my_guest_disk,cache=none,if=virtio

После загрузки системы данный диск будет виден как устройство vda:

# ls -l /dev/vda
brw-r-----    1 root     disk     254,   0 Jan  1 00:02 /dev/vda
 

Как создать образ virtio диска:

Можно так:

qemu-img create -f qcow2 virtio_disk.qcow2 0.5G

Можно так:

dd if=/dev/zero of= virtio_disk bs=4K count=4K

Как разметить/отформатировать образ virtio диска:

После загрузки linux, для устройства /dev/vda доступны стандартные операции по работе с дисками.

Разметка:

fdisk /dev/vda

Форматирование:

mkfs.ext3 /dev/vda1

Монтирование:

mount /dev/vda1 /mnt/virtio
 

Пример запуска ubuntu 14 для платформы ppc с помощью qemu.

Тестирование производилось на версии qemu-2.4.0.

1. Создаем диск:

qemu-img create -f qcow2 ubuntu14server.qcow2 2G

2. Запускаем установку:

qemu-2.4.0-rc0/ppc64-softmmu/qemu-system-ppc64 -m 1024 -hda ./ ubuntu14server.qcow2 -cdrom /home/user1/Загрузки/ubuntu-14.04.3-server-powerpc.iso -boot d

После запуска откроется окно, в котором будет проходить процесс установки. В появившемся диалоговом окне следует нажать «tab» (либо набрать help), затем следует выбрать пункт live-powerpc64. После этого начнется длительный процесс установки.

После установки запустить виртуальный образ можно так:

qemu-system-i386 -hda ubuntu14server.qcow2