Linux KVM: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
 
(не показано 150 промежуточных версий 12 участников)
Строка 1: Строка 1:
  +
[[Категория:Linux]]
=KVM=
 
  +
[[Категория:Virtualisation]]
  +
[[Категория:KVM]]
  +
[[Категория:QEMU]]
  +
[[Категория:udev]]
  +
=KVM=
 
KVM - система виртуализации котороая включена в состав ядра linux начиная с 2.6.20. Вероятно, наиболее прогрессивная система, т.к. RedHat переключилась на нее с XEN.
 
KVM - система виртуализации котороая включена в состав ядра linux начиная с 2.6.20. Вероятно, наиболее прогрессивная система, т.к. RedHat переключилась на нее с XEN.
 
Задача - запускать внутри виртуальных машин ОС отличную от хостовой (в моем случае - win32, FreeBSD, linux но другие версии ядра отличные от хостовых).
 
Задача - запускать внутри виртуальных машин ОС отличную от хостовой (в моем случае - win32, FreeBSD, linux но другие версии ядра отличные от хостовых).
Строка 8: Строка 13:
 
* Иногда - проблемы при обновлении ядра.
 
* Иногда - проблемы при обновлении ядра.
 
* Нет механизмов ограничения процессорного времени. (или я о них не знаю)
 
* Нет механизмов ограничения процессорного времени. (или я о них не знаю)
=Hardware=
+
==Hardware==
  +
KVM требует наличия x86-совместимого процессора с поддержкой одной из технологий аппаратной виртуализации — Intel VT либо AMD SVM. На данный момент KVM в состоянии запускать в качестве гостевых ОС GNU/Linux (32-битные и 64-битные), Windows (32-битные и 64-битные) и другие системы.
Для полноценной работы потребуется процессор с поддержкой аппаратной виртуализации.
 
  +
  +
Для полноценной работы <b>немодифицированных</b> гостевых ОС потребуется процессор с поддержкой аппаратной виртуализации:
  +
Проверить наличие поддержки можно по наличию соответвующих флагов - комманда ниже должна дать непустой результат
  +
{{Root|<nowiki>#cat /proc/cpuinfo | egrep flags.*'svm|vmx'</nowiki>}}
  +
 
В моем случае это
 
В моем случае это
 
<PRE>
 
<PRE>
Строка 65: Строка 75:
 
power management: ts fid vid ttp tm stc 100mhzsteps
 
power management: ts fid vid ttp tm stc 100mhzsteps
 
</PRE>
 
</PRE>
  +
  +
==Конфигурация ядра==
  +
Что бы включить поддержку KVM, следует включить следующие опции ядра (я использовал модули):
  +
{{Kernel|Поддержка KVM|<pre>
  +
Device Drivers --->
  +
[*] Virtualization --->
  +
--- Virtualization
  +
<M> Kernel-based Virtual Machine (KVM) support
  +
<M> KVM for Intel processors support
  +
<M> KVM for AMD processors support
  +
</pre>}}
  +
  +
==Необходимое ПО==
  +
Для работы с kvm нужны следующие пакеты:
  +
* app-emulation/kvm
  +
* sys-apps/usbutils (только если нужна поддержка USB. Мне - не нужен)
  +
* net-misc/bridge-utils (только если планируется bridged-net)
  +
* sys-apps/usermode-utilities (нужен для управлениея tap-устройствами)
  +
  +
Еще я использовал:
  +
* app-misc/screen
  +
  +
==Запуск первой виртуальной машины==
  +
Добавляю в /etc/modules.autoload.d/kernel-2.6:
  +
<PRE>
  +
kvm-amd
  +
tun
  +
</PRE>
  +
и загружаю модули (tun нужен для работы сети, на этапе запуска виртуальной машины и установки гостевой WinXP - не нужен)
  +
  +
Далее, создаю диск с именем test1 размером 10G
  +
{{Root|kvm-img create -f qcow2 test1.img 10G}}
  +
  +
{{Note|"qcow2": KVM image format, the most versatile format. Use it to have smaller images (useful if your filesystem does not supports holes, for example on Windows), optional AES encryption, zlib based compression and support of multiple VM snapshots.
  +
}}
  +
Что бы посмотретьинформацию о диске можно воспользоваться следующей коммандой
  +
{{Root|# kvm-img info ./test1.img
  +
image: ./test1.img
  +
file format: qcow2
  +
virtual size: 10G (10737418240 bytes)
  +
disk size: 1.4G
  +
cluster_size: 4096
  +
}}
  +
  +
Далее пробую установить WinXP с образа установочного диска:
  +
{{Command|<nowiki>kvm -hda /var/virt/test1.img -cdrom /var/virt/XP_BOOTCD.iso -boot d</nowiki>}}
  +
Т.к. все эксперементы я провожу на удаленном сервере, где нет ничего связанного с Х, то получаю следующее сообщение
  +
<PRE>Could not initialize SDL - exiting</PRE>
  +
Очевидно, что kvm попробовал вывести на экран какую-то графику и у него это не получилось. Отмечу, что я не сразу нашел решение, наиболее простое и правильное - перенаправить вывод графики на vnc.
  +
Соответвенно, комманда приобретает вид
  +
{{Command|<nowiki>kvm -hda /var/virt/test1.img -cdrom /var/virt/XP_BOOTCD.iso -boot d -vnc :10 </nowiki>}}
  +
  +
{{Root|<nowiki># netstat -ntpl
  +
Active Internet connections (only servers)
  +
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  +
tcp 0 0 0.0.0.0:5910 0.0.0.0:* LISTEN 18328/kvm
  +
</nowiki>
  +
}}
  +
{{Note|Здесь :10 - номер порта, :1 заставило бы kvm слушать соединения vnc на порту 5901}}
  +
  +
Теперь можно подключиться к серверу на порт 5910 по vnc и пронаблюдать загрузку виртуальной машины.
  +
{{Note|При переключении разрешения внутри виртуальной машины на этапе загрузки у меня отваливался vnc из пакета net-misc/vnc. Лучше работает net-misc/tightvnc но и с ним работа с виртуальной машиной - мучение. Решение проблемы я не искал т.к. использовал vnc только до того момента как настроил сеть}}
  +
  +
Далее, наблюдаю за установкой и жму "далее" через vnc.
  +
  +
Если ОС не использует графику совсем - то запускать с параметром -curses вместо -vnc. В этом случае вывод будет праямо на текущюю консоль, что в большенстве случаев достаточно удобно.
  +
  +
==Натройка сети на хост-системе и виртуальных машинах==
  +
Вцелом схема сети выглядит так: (вторая гостевая система пока только в процессе подготовки)
  +
<pre> HOST KVM Гостевая система 1 (WinXP)
  +
+-----------------------+ +-----------------+
  +
| 95.69.хх.xx | | |
  +
INET---+---- eth0 | | |
  +
| | | | KVM Гостевая система 2 (FreeBSD 7.2)
  +
| +------+ +--+---+---- nic0 | +--------------+
  +
| |kvm_tap0---------+ | |172.16.254.6 | | |
  +
| | 172.16.254.5 | | | | |
  +
| |kvm_tap0---------+ | +-----------------+ | |
  +
| | 172.16.254.9 | | | |
  +
| +------+ | | | |
  +
| +--+-------------------------+---- nic0 |
  +
| | |172.16.254.10 |
  +
+-----------------------+ +--------------+</pre>
  +
=== Конфигурация ядра для поддержки сети ===
  +
Понадобиться поддержка в ядре TUN/TAP устройств и возможно VLAN (не уверен что это необходимо). Я в своей конфигурации предпочел использовать routed а не bridged соеднение, и поддержка birdge обязательной не является. Поддержка VLAN мне необходима в любом случае, выключить ее я не могу.
  +
{{Kernel|Поддержка bridging, TUN и VLAN|<pre>
  +
Device Drivers --->
  +
[*] Network device support --->
  +
<M> Universal TUN/TAP device driver support
  +
  +
Networking support --->
  +
Networking options --->
  +
<M> 802.1d Ethernet Bridging
  +
<*> 802.1Q VLAN Support
  +
</pre>}}
  +
  +
=== Настройка сети в хост-системе ===
  +
* Загружаем соответвующий модуль)
  +
{{Root|modprobe tun}}
  +
<PRE>
  +
[433164.306111] tun: Universal TUN/TAP device driver, 1.6
  +
[433164.306114] tun: (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
  +
</PRE>
  +
* Добавляем соответвующие интерфейсы и именуем их как нравится.
  +
  +
{{Root|tunctl -b -u root -t kvm_tap0}}
  +
{{Root|tunctl -b -u root -t kvm_tap1}}
  +
  +
{{Note|У меня к уттилите tunctl нет man-страниц хотя судя по USE-должны быть.
  +
{{Root|<nowiki># equery uses sys-apps/usermode-utilities</nowiki>}}
  +
<PRE>
  +
[ Searching for packages matching sys-apps/usermode-utilities... ]
  +
[ Colour Code : set unset ]
  +
[ Legend : Left column (U) - USE flags from make.conf ]
  +
[ : Right column (I) - USE flags packages was installed with ]
  +
[ No USE flags found for sys-apps/usermode-utilities-20040406-r1]
  +
</PRE>
  +
}}
  +
  +
В результате имеем 2 интерфейса в системе.
  +
<PRE>
  +
#ifconfig -a
  +
kvm_tap0 Link encap:Ethernet HWaddr 1e:56:79:e2:41:eb
  +
BROADCAST MULTICAST MTU:1500 Metric:1
  +
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  +
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  +
collisions:0 txqueuelen:500
  +
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
  +
  +
kvm_tap1 Link encap:Ethernet HWaddr 1e:56:79:e2:41:eb
  +
BROADCAST MULTICAST MTU:1500 Metric:1
  +
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  +
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  +
collisions:0 txqueuelen:500
  +
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
  +
</PRE>
  +
  +
Настраиваем адреса на них:
  +
{{Root|ifconfig kvm_tap0 172.16.254.5 netmask 255.255.255.252 up}}
  +
{{Root|ifconfig kvm_tap1 172.16.254.9 netmask 255.255.255.252 up}}
  +
  +
Теперь нужно перезапустить виртуальную машину для того что бы включить в ней поддержку сети.
  +
{{Root|<nowiki># kvm -hda test1.img -boot c -vnc :10 -net nic -net tap,ifname=kvm_tap0,script=no,downscript=no</nowiki>}}
  +
При запуске можно указать какая именно сетевая карта будет сэмулирована для гостевой ОС (по умолчанию - реалтек) и куда его подключить (в моем случае к kvm_tap0). Обязательно указать что никаких скриптов при старте выполнять не нужно (script=no,downscript=no)
  +
  +
{{Note| Не забыть разрешить ip_forward на хостовой системе.}}
  +
  +
== Вторая виртуальная машина (FreeBSD 7.2) ==
  +
Наcтроил dhcpd что бы не прописывать адрес руками
  +
<pre>
  +
option domain-name "noname.com.ua";
  +
option domain-name-servers 193.33.48.33, 193.33.49.160;
  +
default-lease-time 36000;
  +
max-lease-time 72000;
  +
ddns-update-style none;
  +
log-facility local7;
  +
subnet 172.16.254.8 netmask 255.255.255.252 {
  +
range 172.16.254.10 172.16.254.10;
  +
option routers 172.16.254.9;
  +
option domain-name "virtual.noname.com.ua";
  +
option broadcast-address 172.16.254.9;
  +
default-lease-time 60000;
  +
max-lease-time 720000;
  +
}
  +
  +
Запускаю на установку:
  +
</pre>
  +
{{Root|<nowiki>kvm -hda freebsd72.img -cdrom /var/virt/7.2-RELEASE-amd64-dvd1.iso -boot d -vnc :1 -net nic -net tap,ifname=kvm_tap1,script=no,downscript=no</nowiki>}}
  +
  +
== Windows 7 (тест) ==
  +
Ну, есть и хорошая новость - она работает )
  +
  +
  +
  +
==Видеокарты==
  +
я использую
  +
{{Command|<nowiki>
  +
-vga vmware
  +
</nowiki> }}
  +
т.к.эта видеокарта позволяет наиюолее гибко менять разрешение под WinXP (что мне, собственно, и нужно)
  +
=Управление виртуальными машинами=
  +
==Предварительная настройка (-monitor)==
  +
Для управления виртуальными машинами используется консоль. По-умолчанию она доступна из графики (в примере выше - из сессии VNC) с помощью ctr-alt-2 (ctr-alt-1 - возврат в графику ) <BR>
  +
Но гораздо удобнее использовать сеть для подключении к консоли. Это позволит в будущем использовать скрипты и т.п. "вкусности".
  +
<BR>
  +
Приведу цитату, думаю этого более чем достаточно для понимания для использования сети:
  +
<BR>
  +
There are two basic options for redirecting your monitor to tcp sockets, namely raw socket and using the telnet protocol. I’ll go ahead and show the syntax for both options then discuss the options you have. For redirecting your monitor to raw tcp socket you use the following syntax:
  +
  +
<PRE>
  +
-monitor tcp:192.168.1.1:4444,server,nowait
  +
</PRE>
  +
For redirecting to a socket supporting telnet protocol you use the following syntax
  +
<PRE>
  +
-monitor telnet:192.168.1.1:4444,server,nowait
  +
</PRE>
  +
  +
The options are
  +
* tcp – raw tcp sockets
  +
*telnet – the telnet protocol is used instead of raw tcp sockets. This is the preferred option over tcp as you can break out of the monitor using Ctrl-] then typing quit. You can’t break out of the monitor like this after connecting with the raw socket option
  +
* 192.168.1.1 – Listen on this port only. You can use 127.0.0.1 if you want to only allow connections locally. If you want to listen on any ip address on the server, just leave this blank so you end up with two consecutive colons ie “::” .
  +
* 4444 – port number to listen on.
  +
* server – listening in server mode
  +
* nowait – qemu will wait for a client socket application to connect to the port before continuing unless this option is used. In most cases you’ll want to use the nowait option.
  +
  +
  +
Второй вариант - использовать сокеты, как в примере ниже:
  +
<PRE>
  +
-monitor unix:/tmp/socket,server,nowait
  +
</PRE>
  +
Для работы использовать сто-то вроде:
  +
<PRE>
  +
echo 'info' | nc -v -U /tmp/socket
  +
</PRE>
  +
  +
Сейчас я тестирую такую конфигурацию:
  +
{{Root|<nowiki>
  +
/usr/bin/qemu-system-x86_64 \
  +
-hda \
  +
./win_xp.img.back1 \
  +
-vga vmware \
  +
-boot c \
  +
-m 512M \
  +
-net nic \
  +
-net tap,ifname=kvm_tap0,script=no,downscript=no \
  +
-vnc :1 \
  +
-usbdevice tablet \
  +
-usb \
  +
-monitor tcp:192.168.15.198:4444,server,nowait
  +
</nowiki>}}
  +
  +
==Добавление устройств на-лету==
  +
Нужно пробросить в ВМ флешку:
  +
<PRE>
  +
usb_add device -- add USB device (e.g. 'host:bus.addr' or 'host:vendor_id:product_id')
  +
usb_del device -- remove USB device 'bus.addr'
  +
</PRE>
  +
  +
Например - добавление флешки:
  +
<PRE>
  +
(qemu) usb_add host:058f:6387
  +
usb_add host:058f:6387
  +
husb: using sys file-system with /dev/bus/usb
  +
</PRE>
  +
  +
В консоли где запущена виртуальная машина вижу:
  +
<PRE>
  +
usb_create: no bus specified, using "usb.0" for "usb-host"
  +
husb: open device 2.8
  +
husb: config #1 need -1
  +
husb: 1 interfaces claimed for configuration 1
  +
husb: grabbed usb device 2.8
  +
husb: config #1 need 1
  +
husb: 1 interfaces claimed for configuration 1
  +
husb: config #1 need 1
  +
</PRE>
  +
Посмотреть устройства можно или
  +
{{Root|<nowiki>
  +
#lsusb
  +
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
  +
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
  +
Bus 002 Device 002: ID 05e3:0605 Genesys Logic, Inc. USB 2.0 Hub [ednet]
  +
Bus 001 Device 002: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
  +
Bus 002 Device 004: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
  +
Bus 002 Device 005: ID 05e3:0710 Genesys Logic, Inc. USB 2.0 33-in-1 Card Reader
  +
Bus 002 Device 008: ID 058f:6387 Alcor Micro Corp. Transcend JetFlash Flash Drive
  +
</nowiki>}}
  +
или из консоли виртуальной машины:
  +
<PRE>
  +
info usb
  +
info usb
  +
Device 0.1, Speed 12 Mb/s, Product QEMU USB Tablet
  +
Device 0.3, Speed 12 Mb/s, Product QEMU USB Hub
  +
Device 0.4, Speed 480 Mb/s, Product Mass Storage
  +
</PRE>
  +
<PRE>
  +
(qemu)info usbhost
  +
info usbhost
  +
Device 1.1, speed 12 Mb/s
  +
Hub: USB device 1d6b:0001, OHCI Host Controller
  +
Device 2.1, speed 480 Mb/s
  +
Hub: USB device 1d6b:0002, EHCI Host Controller
  +
Device 2.2, speed 480 Mb/s
  +
Hub: USB device 05e3:0605, USB2.0 Hub
  +
Device 1.2, speed 12 Mb/s
  +
Class e0: USB device 0a12:0001
  +
Device 2.4, speed 12 Mb/s
  +
Class 00: USB device 0403:6001, usb serial converter
  +
Device 2.5, speed 480 Mb/s
  +
Class 00: USB device 05e3:0710, USB2.0 card Reader
  +
Device 2.8, speed 480 Mb/s
  +
Class 00: USB device 058f:6387, Mass Storage
  +
Auto filters:
  +
Device *.* ID 058f:6387
  +
(qemu)
  +
</PRE>
  +
  +
При этом я получил доступ к флешке из виртуальной машины.<BR>
  +
Аналогично, если я хочу отключить устройство:
  +
<PRE>
  +
(qemu) usb_del 0.4
  +
usb_del 0.4
  +
(qemu)
  +
</PRE>
  +
Идентификатор 0.4 - я взял из листинга выше
  +
<PRE>
  +
Device 0.4, Speed 480 Mb/s, Product Mass Storage
  +
</PRE>
  +
  +
===udev и автоматизация процесса===
  +
Естественно, все это можно обернуть в скрипт и, например, всегда автоматически пробрасывать устройство в ВМ.
  +
<BR>. Обратить внимание на ключ -w1 - нужно что бы закрывать соединение после команды. У меня -w не работало в пакете nc6 , только в оригинальном nc.
  +
<PRE>
  +
echo "usb_add host:058f:6387" | nc -w1 192.168.15.198 4445
  +
echo "info usb" | nc -w1 192.168.15.198 4445
  +
echo "usb_del 0.3 " | nc -w1 192.168.15.198 4445
  +
</PRE>
  +
По большому счету работа с udev достаточно однообразна, подробности в отдельной статье: http://wiki.sirmax.noname.com.ua/index.php/Udev <BR>
  +
Тут приведу только правило и скрипт:
  +
<PRE>
  +
BUS=="usb", SUBSYSTEM=="block", KERNEL=="sd[a-z]", ACTION=="add", NAME="%k", GROUP="disk", ATTRS{serial}=="576B63C4", RUN+="/etc/udev/udev-VM.sh %k %s{idVendor} %s{idProduct}"
  +
BUS=="usb", SUBSYSTEM=="block", KERNEL=="sd*", ACTION=="add", NAME="%k", GROUP="disk", RUN+="/etc/udev/udev-flash-mount.sh add %k"
  +
BUS=="usb", SUBSYSTEM=="block", KERNEL=="sd*", ACTION=="remove", RUN+="/etc/udev/udev-flash-mount.sh remove %k"
  +
</PRE>
  +
Второе и третье правила - монтируют "известные" устройства в соответствующие точки монтирования. sd[a-z] - что бы избежать вызова скрипта для sdf1. Естественно, скрипт "для домашнего использования", но адаптировать его для массового использования нет никакой проблемы.
  +
<PRE>
  +
#!/bin/bash
  +
  +
LOGGER="/usr/bin/logger -t [udev-VM.sh]"
  +
  +
sleep 3
  +
  +
echo "Parameters are: "${1}" "${2} | $LOGGER
  +
env | $LOGGER
  +
echo "usb_add host:"${ID_VENDOR_ID}":"${ID_MODEL_ID} | $LOGGER
  +
echo "usb_add host:${ID_VENDOR_ID}:${ID_MODEL_ID}" | /usr/bin/nc -w 1 192.168.15.198 445 | $LOGGER
  +
echo $? | $LOGGER
  +
exit
  +
</PRE>
  +
На отключение никакой скрипт не навешивал - нет необходимости.
  +
  +
==Снапшоты==
  +
изучаю
  +
==Миграция==
  +
Пробую миграцию:<BR>
  +
Запускаю еще одну копию ВМ с пустым диском и опцией
  +
<PRE>-incoming tcp:0:9999</PRE>
  +
<PRE>
  +
/usr/bin/qemu-system-x86_64 \
  +
-hda \
  +
./test_centos.img \
  +
-vga vmware \
  +
-boot c -m 512M \
  +
-net nic -net tap,ifname=$DEV0,script=no,downscript=no \
  +
-vnc :3 \
  +
-usbdevice tablet \
  +
-usb \
  +
-monitor tcp:192.168.15.198:4446,server,nowait \
  +
-monitor unix:/tmp/winxp2.fifo,server,nowait \
  +
-incoming tcp:0:9999
  +
</PRE>
  +
Запускаю миграцию, наблюдаю прогресс:
  +
<PRE>
  +
(qemu) migrate -d -b tcp:192.168.15.198:9999
  +
migrate -d -b tcp:192.168.15.198:9999
  +
(qemu)
  +
(qemu) info migrate
  +
info migrate
  +
Migration status: active
  +
transferred ram: 217 kbytes
  +
remaining ram: 536000 kbytes
  +
total ram: 541056 kbytes
  +
transferred disk: 249856 kbytes
  +
remaining disk: 20721664 kbytes
  +
total disk: 20971520 kbytes
  +
...
  +
(qemu) info migrate
  +
info migrate
  +
Migration status: active
  +
transferred ram: 217 kbytes
  +
remaining ram: 536000 kbytes
  +
total ram: 541056 kbytes
  +
transferred disk: 5641216 kbytes
  +
remaining disk: 15330304 kbytes
  +
total disk: 20971520 kbytes
  +
(qemu)
  +
(qemu) info migrate
  +
info migrate
  +
Migration status: completed
  +
</PRE>
  +
  +
  +
На стороне получателя:
  +
<PRE>
  +
Receiving block device images
  +
Completed 100 %
  +
</PRE>
  +
  +
  +
  +
Оригинальная ВМ после миграции остановлена (stop в консоли), снова запустить ее можно используя команду c
  +
  +
===Миграция с рабочей станции на другую рабочуюю станциию (рабочий пример)===
  +
Продолжая тему живой миграции, пробую реализовать все на практике. <BR>
  +
Отмечу что все попытки смигрировать на ВМ на другую архитектуру окончились неудачей. <BR>
  +
По этой причиине при подготовки оборудования я просто склонировал ОС, и в ходе эксперемента все программы имеют одну и ту же версию. Ядро, естественнно, то же с теми же опциями.
  +
====Hardware details====
  +
{{Root|<nowiki>
  +
Linux sirmax2 2.6.38.2-sirmax1 #1 SMP PREEMPT Sat Apr 9 16:26:46 EEST 2011 x86_64 AMD Phenom(tm) 8450 Triple-Core Processor AuthenticAMD GNU/Linux
  +
</nowiki>}}
  +
И процессором (ядер три, но они все одинаковые):
  +
{{Root|<nowiki>root@maverick:/usr/local/virtual# cat /proc/cpuinfo
  +
processor : 0
  +
vendor_id : AuthenticAMD
  +
cpu family : 16
  +
model : 2
  +
model name : AMD Phenom(tm) 8450 Triple-Core Processor
  +
stepping : 3
  +
cpu MHz : 2107.141
  +
cache size : 512 KB
  +
physical id : 0
  +
siblings : 3
  +
core id : 0
  +
cpu cores : 3
  +
apicid : 0
  +
initial apicid : 0
  +
fpu : yes
  +
fpu_exception : yes
  +
cpuid level : 5
  +
wp : yes
  +
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc rep_good nopl nonstop_tsc extd_apicid pni monitor cx16 popcnt lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs npt lbrv svm_lock
  +
bogomips : 4214.28
  +
TLB size : 1024 4K pages
  +
clflush size : 64
  +
cache_alignment : 64
  +
address sizes : 48 bits physical, 48 bits virtual
  +
power management: ts ttp tm stc 100mhzsteps hwpstate
  +
<SKIPPED>
  +
</nowiki>}}
  +
Создаю диск и запускаю ВМ.
  +
<PRE>
  +
qemu-img create -f qcow2 win_xp.img.incoming 20G
  +
</PRE>
  +
Запускаю ВМ и ожидаю входных данных:
  +
<PRE>
  +
DEV0=kvm_tap6
  +
/usr/bin/qemu-system-x86_64 \
  +
-boot c \
  +
-hda \
  +
./win_xp.img.incoming \
  +
-m 512M \
  +
-net nic -net tap,ifname=$DEV0,script=no,downscript=no \
  +
-vnc :11 \
  +
-vga vmware \
  +
-usbdevice tablet \
  +
-usb \
  +
-monitor tcp:127.0.0.1:4411,server,nowait \
  +
-monitor unix:/tmp/winxp.fifo,server,nowait \
  +
-incoming tcp:192.168.15.34:9911
  +
  +
  +
</PRE>
  +
  +
  +
====настройка сети====
  +
На второй машине 2 интерфейса - нативный влан на eth5 и влан 197 который и будет сбриджован для ВМ
  +
{{Root|<nowiki>
  +
modprobe tun
  +
/usr/sbin/tunctl -b -u root -t kvm_tap6
  +
ip link set up dev kvm_tap6
  +
  +
vconfig add eth5 197
  +
Added VLAN with VID == 197 to IF -:eth5:-
  +
brctl addbr br0
  +
brctl addif br0 eth5.197
  +
brctl addif br0 kvm_tap6
  +
ip link set up dev eth5.197
  +
ip link set up dev kvm_tap6
  +
ip link set up dev br0
  +
</nowiki>}}
  +
  +
Аналогично на первой рабочей станции. в результате имеем
  +
# на ноде 1 запущена ВМ в рабочем режиме, сеть работает. Поднят ВПН (CiscoVPN) как тестовое приложение. IP 192.168.77.42
  +
# на ноде 2 запущена ВМ в режиме ожидания.
  +
# обе ноды подключены к VLAN197 (eth0.197 и eth5.197 соответвенно)
  +
# на обоих нодах интерфейсы br0 соединяют виртуальные kvm_tap6 и vlan197
  +
# в VLAN197 присутвует шлюз, выпускающий ВМ в инет.
  +
  +
====Процесс миграции====
  +
Замечу что в процессе миграции я нормаьно продолжал работать на ВМ.
  +
<BR>
  +
Запускаем процесс миграции:
  +
<PRE>
  +
(qemu) migrate -d -b tcp:192.168.15.34:9911
  +
migrate -d -b tcp:192.168.15.34:9911
  +
(qemu)
  +
(qemu) info migrate
  +
info migrate
  +
Migration status: active
  +
transferred ram: 32 kbytes
  +
remaining ram: 540900 kbytes
  +
total ram: 541056 kbytes
  +
transferred disk: 59392 kbytes
  +
remaining disk: 20912128 kbytes
  +
total disk: 20971520 kbytes
  +
(qemu)
  +
<SKIPPED>
  +
(qemu) info migrate
  +
info migrate
  +
Migration status: active
  +
transferred ram: 32 kbytes
  +
remaining ram: 540900 kbytes
  +
total ram: 541056 kbytes
  +
transferred disk: 178176 kbytes
  +
remaining disk: 20793344 kbytes
  +
total disk: 20971520 kbytes
  +
</PRE>
  +
Со стороны второй ноды:
  +
<PRE>
  +
Receiving block device images
  +
Completed 74 %
  +
</PRE>
  +
  +
==Разделение и ограничение ресурсов==
  +
==VirtIO==
  +
Для диска: <BR>
  +
${DISK} - имя файла
  +
<PRE>
  +
qemu-img create -o preallocation=metadata -f qcow2 ${DISK} 20G
  +
</PRE>
  +
  +
<PRE>
  +
screen -dmS $VM_NAME /usr/bin/qemu-system-x86_64 \
  +
-drive file=${DISK},if=virtio \
  +
-vga cirrus \
  +
-boot c \
  +
-option-rom /usr/share/kvm/pxe-rtl8139.bin \
  +
-m 512 \
  +
-net nic,model=rtl8139,vlan=0,macaddr=00:16:5e:25:05:${VM_NUMBER} \
  +
-net tap,ifname=$DEV0,script=no,downscript=no \
  +
-vnc :$VM_NUMBER \
  +
-usbdevice tablet \
  +
-usb \
  +
-monitor tcp:127.0.0.1:44${VM_NUMBER},server,nowait \
  +
-monitor unix:/tmp/${VM_NAME}.fifo,server,nowait
  +
</PRE>
  +
  +
=Nested virtualization=
  +
* http://kashyapc.wordpress.com/2012/01/14/nested-virtualization-with-kvm-intel/
  +
<PRE>
  +
options kvm-intel nested=y
  +
</PRE>
  +
<PRE>
  +
modprobe kvm-intel nested=y
  +
</PRE>
  +
  +
=ToDo=
  +
* Ограничение процессорного времени
  +
* Приоритезация (возможно ли?)
  +
* Разделение памяти
  +
 
=Ссылки=
 
=Ссылки=
 
Есть некоторая доля вероятности, что какую-то из ссылок которой я воспользовался я забыл указать. Потому, если такое вдруг случиться - укажите мне на ошибку. Я исправлю.
 
Есть некоторая доля вероятности, что какую-то из ссылок которой я воспользовался я забыл указать. Потому, если такое вдруг случиться - укажите мне на ошибку. Я исправлю.
 
* http://www.ibm.com/developerworks/ru/library/l-linux-kvm/
 
* http://www.ibm.com/developerworks/ru/library/l-linux-kvm/
  +
* http://tyom.blogspot.com/
  +
* http://jack.kiev.ua/docs/qemu-doc-ru.html
  +
* http://www.pivpav.ru/2011/05/406.html
  +
* http://www.ossportal.ru/technologies/kvm?page=1
  +
* http://www.opennet.ru/openforum/vsluhforumID3/63200.html
  +
* http://mydebianblog.blogspot.com/2008/09/qemu-usb.html
  +
* http://xgu.ru/wiki/man:qemu
  +
http://jack.kiev.ua/docs/qemu-doc-ru.html
  +
http://www.opennet.ru/opennews/art.shtml?num=25119

Текущая версия на 11:58, 15 мая 2024

KVM

KVM - система виртуализации котороая включена в состав ядра linux начиная с 2.6.20. Вероятно, наиболее прогрессивная система, т.к. RedHat переключилась на нее с XEN. Задача - запускать внутри виртуальных машин ОС отличную от хостовой (в моем случае - win32, FreeBSD, linux но другие версии ядра отличные от хостовых).

Сейчас использую VMWare, решил отказаться из-за следующих недостатков

  • Неудобство управления (нужно держать под рукой vmware-console)
  • Большие накладные расходы.
  • VMWare не позволяет эмулировать более 2 процессоров (проверить!)
  • Иногда - проблемы при обновлении ядра.
  • Нет механизмов ограничения процессорного времени. (или я о них не знаю)

Hardware

KVM требует наличия x86-совместимого процессора с поддержкой одной из технологий аппаратной виртуализации — Intel VT либо AMD SVM. На данный момент KVM в состоянии запускать в качестве гостевых ОС GNU/Linux (32-битные и 64-битные), Windows (32-битные и 64-битные) и другие системы.

Для полноценной работы немодифицированных гостевых ОС потребуется процессор с поддержкой аппаратной виртуализации: Проверить наличие поддержки можно по наличию соответвующих флагов - комманда ниже должна дать непустой результат

#cat /proc/cpuinfo | egrep flags.*'svm|vmx'

В моем случае это

#cat /proc/cpuinfo
processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 15
model           : 107
model name      : AMD Athlon(tm) 64 X2 Dual Core Processor 4400+
stepping        : 1
cpu MHz         : 2310.439
cache size      : 512 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 2
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 1
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow rep_good pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch
bogomips        : 4620.87
TLB size        : 1024 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management: ts fid vid ttp tm stc 100mhzsteps

processor       : 1
vendor_id       : AuthenticAMD
cpu family      : 15
model           : 107
model name      : AMD Athlon(tm) 64 X2 Dual Core Processor 4400+
stepping        : 1
cpu MHz         : 2310.439
cache size      : 512 KB
physical id     : 0
siblings        : 2
core id         : 1
cpu cores       : 2
apicid          : 1
initial apicid  : 1
fpu             : yes
fpu_exception   : yes
cpuid level     : 1
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow rep_good pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch
bogomips        : 4621.05
TLB size        : 1024 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management: ts fid vid ttp tm stc 100mhzsteps

Конфигурация ядра

Что бы включить поддержку KVM, следует включить следующие опции ядра (я использовал модули):

Linux Kernel Configuration: Поддержка KVM
Device Drivers --->
    [*] Virtualization --->
            --- Virtualization
            <M> Kernel-based Virtual Machine (KVM) support
            <M>   KVM for Intel processors support 
            <M>   KVM for AMD processors support

Необходимое ПО

Для работы с kvm нужны следующие пакеты:

  • app-emulation/kvm
  • sys-apps/usbutils (только если нужна поддержка USB. Мне - не нужен)
  • net-misc/bridge-utils (только если планируется bridged-net)
  • sys-apps/usermode-utilities (нужен для управлениея tap-устройствами)

Еще я использовал:

  • app-misc/screen

Запуск первой виртуальной машины

Добавляю в /etc/modules.autoload.d/kernel-2.6:

kvm-amd
tun

и загружаю модули (tun нужен для работы сети, на этапе запуска виртуальной машины и установки гостевой WinXP - не нужен)

Далее, создаю диск с именем test1 размером 10G

kvm-img create -f qcow2 test1.img 10G
Note: "qcow2": KVM image format, the most versatile format. Use it to have smaller images (useful if your filesystem does not supports holes, for example on Windows), optional AES encryption, zlib based compression and support of multiple VM snapshots.

Что бы посмотретьинформацию о диске можно воспользоваться следующей коммандой

# kvm-img info ./test1.img

image: ./test1.img file format: qcow2 virtual size: 10G (10737418240 bytes) disk size: 1.4G cluster_size: 4096

Далее пробую установить WinXP с образа установочного диска:

kvm -hda /var/virt/test1.img -cdrom /var/virt/XP_BOOTCD.iso -boot d

Т.к. все эксперементы я провожу на удаленном сервере, где нет ничего связанного с Х, то получаю следующее сообщение

Could not initialize SDL - exiting

Очевидно, что kvm попробовал вывести на экран какую-то графику и у него это не получилось. Отмечу, что я не сразу нашел решение, наиболее простое и правильное - перенаправить вывод графики на vnc. Соответвенно, комманда приобретает вид

kvm -hda /var/virt/test1.img -cdrom /var/virt/XP_BOOTCD.iso -boot d -vnc :10
# netstat -ntpl Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:5910 0.0.0.0:* LISTEN 18328/kvm
Note: Здесь :10 - номер порта, :1 заставило бы kvm слушать соединения vnc на порту 5901

Теперь можно подключиться к серверу на порт 5910 по vnc и пронаблюдать загрузку виртуальной машины.

Note: При переключении разрешения внутри виртуальной машины на этапе загрузки у меня отваливался vnc из пакета net-misc/vnc. Лучше работает net-misc/tightvnc но и с ним работа с виртуальной машиной - мучение. Решение проблемы я не искал т.к. использовал vnc только до того момента как настроил сеть

Далее, наблюдаю за установкой и жму "далее" через vnc.

Если ОС не использует графику совсем - то запускать с параметром -curses вместо -vnc. В этом случае вывод будет праямо на текущюю консоль, что в большенстве случаев достаточно удобно.

Натройка сети на хост-системе и виртуальных машинах

Вцелом схема сети выглядит так: (вторая гостевая система пока только в процессе подготовки)

              HOST                 KVM Гостевая система 1 (WinXP)
        +-----------------------+   +-----------------+
        | 95.69.хх.xx           |   |                 |
 INET---+---- eth0              |   |                 |
        |                       |   |                 |    KVM Гостевая система 2 (FreeBSD 7.2)
        |  +------+          +--+---+---- nic0        |   +--------------+
        |  |kvm_tap0---------+  |   |172.16.254.6     |   |              |
        |  | 172.16.254.5       |   |                 |   |              |
        |  |kvm_tap0---------+  |   +-----------------+   |              |
        |  | 172.16.254.9    |  |                         |              |
        |  +------+          |  |                         |              |
        |                    +--+-------------------------+---- nic0     |
        |                       |                         |172.16.254.10 |
        +-----------------------+                         +--------------+

Конфигурация ядра для поддержки сети

Понадобиться поддержка в ядре TUN/TAP устройств и возможно VLAN (не уверен что это необходимо). Я в своей конфигурации предпочел использовать routed а не bridged соеднение, и поддержка birdge обязательной не является. Поддержка VLAN мне необходима в любом случае, выключить ее я не могу.

Linux Kernel Configuration: Поддержка bridging, TUN и VLAN
Device Drivers --->
    [*] Network device support --->
            <M> Universal TUN/TAP device driver support

Networking support --->
    Networking options --->
        <M> 802.1d Ethernet Bridging
        <*> 802.1Q VLAN Support

Настройка сети в хост-системе

  • Загружаем соответвующий модуль)
modprobe tun
[433164.306111] tun: Universal TUN/TAP device driver, 1.6
[433164.306114] tun: (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
  • Добавляем соответвующие интерфейсы и именуем их как нравится.
tunctl -b -u root -t kvm_tap0
tunctl -b -u root -t kvm_tap1
Note: У меня к уттилите tunctl нет man-страниц хотя судя по USE-должны быть.
# equery uses sys-apps/usermode-utilities
[ Searching for packages matching sys-apps/usermode-utilities... ]
[ Colour Code : set unset ]
[ Legend : Left column  (U) - USE flags from make.conf              ]
[        : Right column (I) - USE flags packages was installed with ]
[ No USE flags found for sys-apps/usermode-utilities-20040406-r1]

В результате имеем 2 интерфейса в системе.

#ifconfig -a
kvm_tap0  Link encap:Ethernet  HWaddr 1e:56:79:e2:41:eb
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

kvm_tap1  Link encap:Ethernet  HWaddr 1e:56:79:e2:41:eb
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Настраиваем адреса на них:

ifconfig kvm_tap0 172.16.254.5 netmask 255.255.255.252 up
ifconfig kvm_tap1 172.16.254.9 netmask 255.255.255.252 up

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

# kvm -hda test1.img -boot c -vnc :10 -net nic -net tap,ifname=kvm_tap0,script=no,downscript=no

При запуске можно указать какая именно сетевая карта будет сэмулирована для гостевой ОС (по умолчанию - реалтек) и куда его подключить (в моем случае к kvm_tap0). Обязательно указать что никаких скриптов при старте выполнять не нужно (script=no,downscript=no)

Note: Не забыть разрешить ip_forward на хостовой системе.

Вторая виртуальная машина (FreeBSD 7.2)

Наcтроил dhcpd что бы не прописывать адрес руками

option domain-name "noname.com.ua";
option domain-name-servers 193.33.48.33, 193.33.49.160;
default-lease-time 36000;
max-lease-time 72000;
ddns-update-style none;
log-facility local7;
subnet 172.16.254.8 netmask 255.255.255.252 {
  range 172.16.254.10 172.16.254.10;
  option routers 172.16.254.9;
  option domain-name "virtual.noname.com.ua";
  option broadcast-address 172.16.254.9;
  default-lease-time 60000;
  max-lease-time 720000;
}

Запускаю на установку:
kvm -hda freebsd72.img -cdrom /var/virt/7.2-RELEASE-amd64-dvd1.iso -boot d -vnc :1 -net nic -net tap,ifname=kvm_tap1,script=no,downscript=no

Windows 7 (тест)

Ну, есть и хорошая новость - она работает )


Видеокарты

я использую

-vga vmware

т.к.эта видеокарта позволяет наиюолее гибко менять разрешение под WinXP (что мне, собственно, и нужно)

Управление виртуальными машинами

Предварительная настройка (-monitor)

Для управления виртуальными машинами используется консоль. По-умолчанию она доступна из графики (в примере выше - из сессии VNC) с помощью ctr-alt-2 (ctr-alt-1 - возврат в графику )
Но гораздо удобнее использовать сеть для подключении к консоли. Это позволит в будущем использовать скрипты и т.п. "вкусности".
Приведу цитату, думаю этого более чем достаточно для понимания для использования сети:
There are two basic options for redirecting your monitor to tcp sockets, namely raw socket and using the telnet protocol. I’ll go ahead and show the syntax for both options then discuss the options you have. For redirecting your monitor to raw tcp socket you use the following syntax:

-monitor tcp:192.168.1.1:4444,server,nowait 

For redirecting to a socket supporting telnet protocol you use the following syntax

-monitor telnet:192.168.1.1:4444,server,nowait

The options are

  • tcp – raw tcp sockets
*telnet – the telnet protocol is used instead of raw tcp sockets. This is the preferred option over tcp as you can break out of the monitor using Ctrl-] then typing quit. You can’t break out of the monitor like this after connecting with the raw socket option
  • 192.168.1.1 – Listen on this port only. You can use 127.0.0.1 if you want to only allow connections locally. If you want to listen on any ip address on the server, just leave this blank so you end up with two consecutive colons ie “::” .
  • 4444 – port number to listen on.
  • server – listening in server mode
  • nowait – qemu will wait for a client socket application to connect to the port before continuing unless this option is used. In most cases you’ll want to use the nowait option.


Второй вариант - использовать сокеты, как в примере ниже:

-monitor unix:/tmp/socket,server,nowait

Для работы использовать сто-то вроде:

echo 'info' | nc -v -U /tmp/socket

Сейчас я тестирую такую конфигурацию:

/usr/bin/qemu-system-x86_64 \ -hda \ ./win_xp.img.back1 \ -vga vmware \ -boot c \ -m 512M \ -net nic \ -net tap,ifname=kvm_tap0,script=no,downscript=no \ -vnc :1 \ -usbdevice tablet \ -usb \ -monitor tcp:192.168.15.198:4444,server,nowait

Добавление устройств на-лету

Нужно пробросить в ВМ флешку:

usb_add device -- add USB device (e.g. 'host:bus.addr' or 'host:vendor_id:product_id')
usb_del device -- remove USB device 'bus.addr'

Например - добавление флешки:

(qemu) usb_add host:058f:6387
usb_add host:058f:6387
husb: using sys file-system with /dev/bus/usb

В консоли где запущена виртуальная машина вижу:

usb_create: no bus specified, using "usb.0" for "usb-host"                                                                                                                                                                                   
husb: open device 2.8                                                                                                                                                                                                                        
husb: config #1 need -1                                                                                                                                                                                                                      
husb: 1 interfaces claimed for configuration 1                                                                                                                                                                                               
husb: grabbed usb device 2.8                                                                                                                                                                                                                 
husb: config #1 need 1                                                                                                                                                                                                                       
husb: 1 interfaces claimed for configuration 1                                                                                                                                                                                               
husb: config #1 need 1                                

Посмотреть устройства можно или

#lsusb Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 002: ID 05e3:0605 Genesys Logic, Inc. USB 2.0 Hub [ednet] Bus 001 Device 002: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode) Bus 002 Device 004: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC Bus 002 Device 005: ID 05e3:0710 Genesys Logic, Inc. USB 2.0 33-in-1 Card Reader Bus 002 Device 008: ID 058f:6387 Alcor Micro Corp. Transcend JetFlash Flash Drive

или из консоли виртуальной машины:

info usb
info usb
  Device 0.1, Speed 12 Mb/s, Product QEMU USB Tablet
  Device 0.3, Speed 12 Mb/s, Product QEMU USB Hub
  Device 0.4, Speed 480 Mb/s, Product Mass Storage
(qemu)info usbhost
info usbhost
  Device 1.1, speed 12 Mb/s
    Hub: USB device 1d6b:0001, OHCI Host Controller
  Device 2.1, speed 480 Mb/s
    Hub: USB device 1d6b:0002, EHCI Host Controller
  Device 2.2, speed 480 Mb/s
    Hub: USB device 05e3:0605, USB2.0 Hub
  Device 1.2, speed 12 Mb/s
    Class e0: USB device 0a12:0001
  Device 2.4, speed 12 Mb/s
    Class 00: USB device 0403:6001, usb serial converter
  Device 2.5, speed 480 Mb/s
    Class 00: USB device 05e3:0710, USB2.0 card Reader
  Device 2.8, speed 480 Mb/s
    Class 00: USB device 058f:6387, Mass Storage
  Auto filters:
    Device *.* ID 058f:6387
(qemu) 

При этом я получил доступ к флешке из виртуальной машины.
Аналогично, если я хочу отключить устройство:

(qemu) usb_del 0.4 
usb_del 0.4
(qemu) 

Идентификатор 0.4 - я взял из листинга выше

 Device 0.4, Speed 480 Mb/s, Product Mass Storage

udev и автоматизация процесса

Естественно, все это можно обернуть в скрипт и, например, всегда автоматически пробрасывать устройство в ВМ.
. Обратить внимание на ключ -w1 - нужно что бы закрывать соединение после команды. У меня -w не работало в пакете nc6 , только в оригинальном nc.

echo "usb_add host:058f:6387" | nc -w1 192.168.15.198 4445
echo "info usb"               | nc -w1 192.168.15.198 4445
echo "usb_del 0.3 "           | nc -w1 192.168.15.198 4445

По большому счету работа с udev достаточно однообразна, подробности в отдельной статье: http://wiki.sirmax.noname.com.ua/index.php/Udev
Тут приведу только правило и скрипт:

BUS=="usb", SUBSYSTEM=="block", KERNEL=="sd[a-z]", ACTION=="add", NAME="%k", GROUP="disk", ATTRS{serial}=="576B63C4", RUN+="/etc/udev/udev-VM.sh %k %s{idVendor} %s{idProduct}"                                                              
BUS=="usb", SUBSYSTEM=="block", KERNEL=="sd*", ACTION=="add", NAME="%k", GROUP="disk", RUN+="/etc/udev/udev-flash-mount.sh add %k"                                                                                                           
BUS=="usb", SUBSYSTEM=="block", KERNEL=="sd*", ACTION=="remove", RUN+="/etc/udev/udev-flash-mount.sh remove %k"                                                                                                                              

Второе и третье правила - монтируют "известные" устройства в соответствующие точки монтирования. sd[a-z] - что бы избежать вызова скрипта для sdf1. Естественно, скрипт "для домашнего использования", но адаптировать его для массового использования нет никакой проблемы.

#!/bin/bash
 
LOGGER="/usr/bin/logger -t [udev-VM.sh]"

sleep 3

echo "Parameters are: "${1}" "${2}      | $LOGGER
env                                     | $LOGGER
echo "usb_add host:"${ID_VENDOR_ID}":"${ID_MODEL_ID}    | $LOGGER
echo "usb_add host:${ID_VENDOR_ID}:${ID_MODEL_ID}"      | /usr/bin/nc -w 1 192.168.15.198 445 | $LOGGER
echo $? | $LOGGER 
exit                                                                                                                                                                                                                                         

На отключение никакой скрипт не навешивал - нет необходимости.

Снапшоты

изучаю

Миграция

Пробую миграцию:
Запускаю еще одну копию ВМ с пустым диском и опцией

-incoming tcp:0:9999
/usr/bin/qemu-system-x86_64 \                                                                                                                                                                                                                
    -hda \                                                                                                                                                                                                                                   
    ./test_centos.img \                                                                                                                                                                                                                      
    -vga vmware \                                                                                                                                                                                                                            
    -boot c -m 512M \                                                                                                                                                                                                                        
    -net nic -net tap,ifname=$DEV0,script=no,downscript=no \                                                                                                                                                                                 
    -vnc :3 \                                                                                                                                                                                                                                
    -usbdevice tablet \                                                                                                                                                                                                                      
    -usb \                                                                                                                                                                                                                                   
    -monitor tcp:192.168.15.198:4446,server,nowait \                                                                                                                                                                                         
    -monitor unix:/tmp/winxp2.fifo,server,nowait \                                                                                                                                                                                           
    -incoming tcp:0:9999      

Запускаю миграцию, наблюдаю прогресс:

(qemu) migrate -d -b tcp:192.168.15.198:9999
migrate -d -b tcp:192.168.15.198:9999
(qemu) 
(qemu) info migrate
info migrate
Migration status: active
transferred ram: 217 kbytes
remaining ram: 536000 kbytes
total ram: 541056 kbytes
transferred disk: 249856 kbytes
remaining disk: 20721664 kbytes
total disk: 20971520 kbytes
...
(qemu) info migrate
info migrate
Migration status: active
transferred ram: 217 kbytes
remaining ram: 536000 kbytes
total ram: 541056 kbytes
transferred disk: 5641216 kbytes
remaining disk: 15330304 kbytes
total disk: 20971520 kbytes
(qemu) 
(qemu) info migrate
info migrate
Migration status: completed


На стороне получателя:

Receiving block device images
Completed 100 %


Оригинальная ВМ после миграции остановлена (stop в консоли), снова запустить ее можно используя команду c

Миграция с рабочей станции на другую рабочуюю станциию (рабочий пример)

Продолжая тему живой миграции, пробую реализовать все на практике.
Отмечу что все попытки смигрировать на ВМ на другую архитектуру окончились неудачей.
По этой причиине при подготовки оборудования я просто склонировал ОС, и в ходе эксперемента все программы имеют одну и ту же версию. Ядро, естественнно, то же с теми же опциями.

Hardware details

Linux sirmax2 2.6.38.2-sirmax1 #1 SMP PREEMPT Sat Apr 9 16:26:46 EEST 2011 x86_64 AMD Phenom(tm) 8450 Triple-Core Processor AuthenticAMD GNU/Linux

И процессором (ядер три, но они все одинаковые):

root@maverick:/usr/local/virtual# cat /proc/cpuinfo processor  : 0 vendor_id  : AuthenticAMD cpu family  : 16 model  : 2 model name  : AMD Phenom(tm) 8450 Triple-Core Processor stepping  : 3 cpu MHz  : 2107.141 cache size  : 512 KB physical id  : 0 siblings  : 3 core id  : 0 cpu cores  : 3 apicid  : 0 initial apicid  : 0 fpu  : yes fpu_exception  : yes cpuid level  : 5 wp  : yes flags  : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc rep_good nopl nonstop_tsc extd_apicid pni monitor cx16 popcnt lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs npt lbrv svm_lock bogomips  : 4214.28 TLB size  : 1024 4K pages clflush size  : 64 cache_alignment : 64 address sizes  : 48 bits physical, 48 bits virtual power management: ts ttp tm stc 100mhzsteps hwpstate <SKIPPED>

Создаю диск и запускаю ВМ.

qemu-img  create -f qcow2  win_xp.img.incoming 20G

Запускаю ВМ и ожидаю входных данных:

DEV0=kvm_tap6
/usr/bin/qemu-system-x86_64 \
    -boot c \ 
    -hda \
    ./win_xp.img.incoming \
    -m 512M \
    -net nic -net tap,ifname=$DEV0,script=no,downscript=no \
    -vnc :11 \
    -vga vmware \
    -usbdevice tablet \
    -usb \
    -monitor tcp:127.0.0.1:4411,server,nowait \
    -monitor unix:/tmp/winxp.fifo,server,nowait \
    -incoming tcp:192.168.15.34:9911
                                          


настройка сети

На второй машине 2 интерфейса - нативный влан на eth5 и влан 197 который и будет сбриджован для ВМ

modprobe tun /usr/sbin/tunctl -b -u root -t kvm_tap6 ip link set up dev kvm_tap6 vconfig add eth5 197 Added VLAN with VID == 197 to IF -:eth5:- brctl addbr br0 brctl addif br0 eth5.197 brctl addif br0 kvm_tap6 ip link set up dev eth5.197 ip link set up dev kvm_tap6 ip link set up dev br0

Аналогично на первой рабочей станции. в результате имеем

  1. на ноде 1 запущена ВМ в рабочем режиме, сеть работает. Поднят ВПН (CiscoVPN) как тестовое приложение. IP 192.168.77.42
  2. на ноде 2 запущена ВМ в режиме ожидания.
  3. обе ноды подключены к VLAN197 (eth0.197 и eth5.197 соответвенно)
  4. на обоих нодах интерфейсы br0 соединяют виртуальные kvm_tap6 и vlan197
  5. в VLAN197 присутвует шлюз, выпускающий ВМ в инет.

Процесс миграции

Замечу что в процессе миграции я нормаьно продолжал работать на ВМ.
Запускаем процесс миграции:

(qemu) migrate -d -b tcp:192.168.15.34:9911                                                                                                                                                                                                  
migrate -d -b tcp:192.168.15.34:9911 
(qemu)                                                                                                                                                                                                                                       
(qemu) info migrate                                                                                                                                                                                                                          
info migrate
Migration status: active                                                                                                                                                                                                                     
transferred ram: 32 kbytes                                                                                                                                                                                                                   
remaining ram: 540900 kbytes                                                                                                                                                                                                                 
total ram: 541056 kbytes                                                                                                                                                                                                                     
transferred disk: 59392 kbytes                                                                                                                                                                                                               
remaining disk: 20912128 kbytes                                                                                                                                                                                                              
total disk: 20971520 kbytes                                                                                                                                                                                                                  
(qemu)                                                                                                                                                                                                                                       
<SKIPPED>
(qemu) info migrate  
info migrate  
Migration status: active
transferred ram: 32 kbytes
remaining ram: 540900 kbytes
total ram: 541056 kbytes
transferred disk: 178176 kbytes
remaining disk: 20793344 kbytes
total disk: 20971520 kbytes

Со стороны второй ноды:

Receiving block device images
Completed 74 %

Разделение и ограничение ресурсов

VirtIO

Для диска:
${DISK} - имя файла

qemu-img create -o preallocation=metadata -f qcow2 ${DISK} 20G
screen -dmS $VM_NAME /usr/bin/qemu-system-x86_64 \
    -drive file=${DISK},if=virtio \
    -vga cirrus \
    -boot c \
    -option-rom /usr/share/kvm/pxe-rtl8139.bin \
    -m 512 \
    -net nic,model=rtl8139,vlan=0,macaddr=00:16:5e:25:05:${VM_NUMBER} \
    -net tap,ifname=$DEV0,script=no,downscript=no \
    -vnc :$VM_NUMBER \
    -usbdevice tablet \
    -usb \
    -monitor tcp:127.0.0.1:44${VM_NUMBER},server,nowait \
    -monitor unix:/tmp/${VM_NAME}.fifo,server,nowait

Nested virtualization

options kvm-intel nested=y
modprobe kvm-intel nested=y

ToDo

  • Ограничение процессорного времени
  • Приоритезация (возможно ли?)
  • Разделение памяти

Ссылки

Есть некоторая доля вероятности, что какую-то из ссылок которой я воспользовался я забыл указать. Потому, если такое вдруг случиться - укажите мне на ошибку. Я исправлю.

http://jack.kiev.ua/docs/qemu-doc-ru.html http://www.opennet.ru/opennews/art.shtml?num=25119