Про виртуализацию на основе 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