Управление запущенной виртуальной машиной

Помимо множества опций командной строки qemu также содержит механизм для управления и мониторинга уже запущенной виртуальной машины - qemu monitor. Мне кажется что настало время рассказать о нем, тем самым помогая читателям приобщится к радости работы с виртуальными машинами.

Все примеры проверены на Fedora14 qemu-0.14.0 c включенным KVM, но будут работать также и с 0.13.0.

Основы?

Если виртуальная машина запущена с поддержкой графического вывода SDL (режим по умолчанию), то добраться до монитора достаточно просто: комбинация Ctrl+Alt+2 переключит окно в режим монитора. В заключении будут описаны и другие способы работы с qemu monitor, которые используются в других режимах запуска вирт машины.

Qemu monitor - это текстовый интерфейс, которые позволяет получать информацию о запущенных виртуальных машинах и изменять их настройки в процессе работы. Первой командой с которой стоит ознакомиться - это help, которая выводит список всех возможных команд с кратким описанием. Справку по каждой команде можно получить при помощи help <command>.

QEMU 0.14.0 monitor - type 'help' for more information
(qemu)help ? commit
q quit block_resize
eject drive_del change
screendump logfile log
savevm loadvm delvm
singlestep stop c
cont gdbserver x
xp p print
i o sendkey
system_reset system_powerdown sum
usb_add usb_del device_add
device_del cpu mouse_move
mouse_button mouse_set wavcapture
stopcapture memsave pmemsave
boot_set nmi migrate
migrate_cancel migrate_set_speed migrate_set_downtime
snapshot_blkdev client_migrate_info drive_add
pci_add pci_del pcie_aer_inject_error
host_net_add host_net_remove netdev_add
netdev_del hostfwd_add hostfwd_remove
balloon set_link watchdog_action
acl_show acl_policy acl_add
acl_remove acl_reset mce
getfd closefd block_passwd
set_password expire_password info

Несложно догадаться, что команда info <subcommand> выдает информацию о запущенной вирт машине. Что же интересного можно таким образом узнать? Команды info block и info blockstats выдают информацию о подключенных образах дисков и количестве считанных и записанных данных:

(qemu) info block
ide0-hd0: type=hd removable=0 file=/home/user/test.img ro=0 drv=raw encrypted=0
ide1-cd0: type=cdrom removable=1 locked=0 [not inserted]
floppy0: type=floppy removable=1 locked=0 [not inserted]
sd0: type=floppy removable=1 locked=0 [not inserted]

(qemu) info blockstats
ide0-hd0: rd_bytes=51105792 wr_bytes=951296 rd_operations=2784 wr_operations=84
ide1-cd0: rd_bytes=0 wr_bytes=0 rd_operations=0 wr_operations=0
floppy0: rd_bytes=0 wr_bytes=0 rd_operations=0 wr_operations=0
sd0: rd_bytes=0 wr_bytes=0 rd_operations=0 wr_operations=0

Команда info usernet позволяет узнать о состоянии сетевых сосединений пр работе в режиме user mod (встроенный в qemu NAT).

(qemu) info usernet 
VLAN 0 (user.0):
Protocol[State] FD Source Address Port Dest. Address Port RecvQ SendQ
TCP[ESTABLISHED] 13 10.0.2.15 57990 10.0.2.2 22 0 0
UDP[235 sec] 14 10.0.2.15 57640 10.0.2.3 53 0 0
(qemu)

Для получения данных о работе виртуальных процессоров используются команды info cpus и info registers

(qemu) info cpus 
* CPU #0: pc=0xffffffff8102b7dd (halted)

(qemu) info registers
RAX=0000000000000000 RBX=ffffffff81a00000 RCX=ffffffffffffff10 RDX=ffffffff81a00000
RSI=0000000000000003 RDI=ffffffff81a00000 RBP=ffffffff81a01ed8 RSP=ffffffff81a01ed8
R8 =0000000000000000 R9 =0000000000000001 R10=00000084a57ee2fa R11=0000000000000040
R12=ffffffff81b81ee0 R13=ffff880001e936c0 R14=ffffffffffffffff R15=00000000000935c0
RIP=ffffffff8102b7dd RFL=00000246 [---Z-P-] CPL=0 II=0 A20=1 SMM=0 HLT=1
ES =0000 0000000000000000 000fffff 00000000
CS =0010 0000000000000000 ffffffff 00a09b00 DPL=0 CS64 [-RA]
SS =0018 0000000000000000 ffffffff 00c09300 DPL=0 DS [-WA]
DS =0000 0000000000000000 000fffff 00000000
FS =0000 0000000000000000 ffffffff 00000000
GS =0000 ffff880002000000 000fffff 00000000
LDT=0000 0000000000000000 000fffff 00000000
TR =0040 ffff880002013080 00002087 00008b00 DPL=0 TSS64-busy
<вывод сокращен, чтобы не смущать читателя :)>

Для получения информации о использовании памяти есть команда info mem

(qemu) info mem
00007ffc4b734000-00007ffc4b735000 0000000000001000 ur-
00007ffc4b938000-00007ffc4b939000 0000000000001000 ur-
00007ffc4bb3c000-00007ffc4bb3d000 0000000000001000 ur-
00007ffc4bd40000-00007ffc4bd41000 0000000000001000 ur-
00007ffc4c0bb000-00007ffc4c0c0000 0000000000005000 ur-
00007ffc4c2c4000-00007ffc4c2c5000 0000000000001000 ur-
00007ffc4c4cf000-00007ffc4c4d1000 0000000000002000 ur-
00007ffc4c6ed000-00007ffc4c6ef000 0000000000002000 ur-
00007ffc4c8f1000-00007ffc4c8f2000 0000000000001000 ur-
<вывод значительно сокращен>

Надо отметить, что в режиме монитора работает автодополнение, что упрощает ввод некоторых команд и обозначений устройств.

А что-нибудь поинтереснее?

Довольно обыденная задача смены CD или floppy носителя легко решается при помощи команды change <device> <file>

(qemu) info block
ide0-hd0: type=hd removable=0 file=/home/user/test.img ro=0 drv=raw encrypted=0
ide1-cd0: type=cdrom removable=1 locked=0 [not inserted]
floppy0: type=floppy removable=1 locked=0 [not inserted]
sd0: type=floppy removable=1 locked=0 [not inserted]

(qemu) change ide1-cd0 /home/user/Fedora-14-x86_64-Live-Desktop.iso

(qemu) info block
ide0-hd0: type=hd removable=0 file=/home/beaver//test.img ro=0 drv=raw encrypted=0
ide1-cd0: type=cdrom removable=1 locked=0 file=/home/beaver/distr/Fedora-14-x86_64-Live-Desktop.iso ro=0 drv=raw encrypted=0
floppy0: type=floppy removable=1 locked=0 [not inserted]
sd0: type=floppy removable=1 locked=0 [not inserted]

Автодополнение работает как по имени виртульного устройства, так и по файлам в файловой системе. Для того, чтобы подключить физический cdrom с хост системы, надо указать имя файла /dev/cdrom.

Также есть возможность подключить устройство с хост системы. Для начала нужно получить список usb устройств хост системы при помощи команды info usbhost

(qemu) info usbhost
husb: using sys file-system with /dev/bus/usb
Device 1.1, speed 480 Mb/s
Hub: USB device 1d6b:0002, EHCI Host Controller
Device 2.1, speed 480 Mb/s
Hub: USB device 1d6b:0002, EHCI Host Controller
Device 1.2, speed 480 Mb/s
Hub: USB device 8087:0020
Device 2.2, speed 480 Mb/s
Hub: USB device 8087:0020
Device 1.6, speed 480 Mb/s
Class ef: USB device 17ef:4816, Integrated Camera

После этого подключение устроиства к гостевой системе выполняется при помощи команд usb_add host:<device> или usb_add host:<vendorid>:<deviceid>. В нашем случае веб-камере соответсвует VendorID = 17ef и DeviceID = 4816.

(qemu) usb_add host:17ef:4816

Необходимо отметить, что поключения ряда usb устройств может вызвать некоторые трудности: формально устройство подключается, но не работает корректно. Разработчики qemu признают факт существования проблемы и работают над её устранением.

В некоторых случаях может потребоваться послать машине нужную комбинацию клавиш. Для этого существует команда sendkey

(qemu) sendkey ctrl-alt-delete

Возможные названия клавиш легко выясняются при помощи автодополнения.

Напоследок

Во многих случаях работать с qemu monitor при помощи запуска SDL графики невозможно или неудобно. Для таких случаев существует много других способов вызвать monitor. Например, можно вызвать монитор в терминале из которого запускается qemu:

shell $ qemu-kvm <параметры какие-то> -monitor stdio
QEMU 0.14.0 monitor - type 'help' for more information
(qemu)

Для автоматизации работы можно перенаправить ввод вывод монитора в pipe. Для этого создается два fifo pipe c именами <что-то>.in и что-то.out

shell $ mkfifo montest.in
shell $ mkfifo montest.out

При запуске qemu в опции -monitor указывается имя канала с опцией pipe

shell $ qemu-kvm <параметры неинтересные> -monitor pipe:montest

Отправляем команду

shell $ echo "info blockstats" > montest.in

И читаем ответ

shell $ cat montest out
QEMU 0.14.0 monitor - type 'help' for more information
(qemu) info blockstats
ide0-hd0: rd_bytes=51359744 wr_bytes=697344 rd_operations=2801 wr_operations=66
ide1-cd0: rd_bytes=0 wr_bytes=0 rd_operations=0 wr_operations=0
floppy0: rd_bytes=0 wr_bytes=0 rd_operations=0 wr_operations=0
sd0: rd_bytes=0 wr_bytes=0 rd_operations=0 wr_operations=0
(qemu)

Ссылки

http://en.wikibooks.org/wiki/QEMU/Monitor - Викикнига по qemu monitor. Для некоторых команд описания еще нет.

http://qemu-buch.de/e/Content - Фундаментальная книга по qemu.

497