автоматизация гостя QEMU - PullRequest
7 голосов
/ 30 июня 2010

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

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

Ответы [ 8 ]

11 голосов
/ 18 октября 2011

[Примечание. Автоматизация без использования API виртуализации. Из моего сообщения в блоге .]

Шаг 1:

По умолчанию qemu использует SDL для отображения выхода VGA. Итак, первый шаг - сделать это взаимодействие с qemu через stdio. Qemu предоставляет возможность для этого.

Из документов QEMU:

-nographic Обычно QEMU использует SDL для отображения выхода VGA. С помощью этой опции вы можете полностью отключить графический вывод, чтобы QEMU простое приложение командной строки. Эмулируемый последовательный порт перенаправлен на консоль. Поэтому вы все еще можете использовать QEMU для отладки ядро Linux с последовательной консолью.

Итак, все, что вам нужно сделать, это вызвать qemu с -nographic.

qemu -nographic -hda guest.disk

Шаг 2:

Теперь, когда вы можете взаимодействовать со своим гостем (или процессом qemu) через командную строку, вы должны автоматизировать это взаимодействие. Очевидный способ сделать это в python - запустить процесс qemu (с -nographic) с помощью модуля подпроцесса и затем связаться с этим процессом. Но, к моему удивлению, это просто не сработало для меня. Итак, я искал другой путь.

Позже я обнаружил, что самый удивительный инструмент для такого рода работ - Ожидайте . Это инструмент автоматизации для интерактивных приложений, написанный на tcl.

Это руководство должно помочь вам начать работу с Expect. Вот скрипт для запуска гостя с qemu с использованием Expect.

#!/usr/bin/expect -f

#starts guest vm, run benchmarks, poweroff
set timeout -1

#Assign a variable to the log file
set log     [lindex $argv 0]

#Start the guest VM
spawn qemu -nographic -hda guest.disk

#Login process
expect “login: “
#Enter username
send “user\r”

#Enter Password
expect “Password: “
send “user\r”

#Do whatever you want to do with in the guest VM. ( Run a process and write result to log )

#poweroff the Guest VM
expect “# “
send “shutdown -h now\r”
4 голосов
/ 26 января 2013

QEMU Monitor может ограниченно взаимодействовать с гостевыми системами, используя собственную консоль. Это включает чтение регистров, управление мышью / клавиатурой и получение снимков экрана. Существует протокол мониторинга QEMU (QMP) , который позволяет передавать команды JSON и читать значения из гостевой системы.

3 голосов
/ 30 июня 2010

Насколько я знаю, единственный способ общения с гостем - через сетевой мост.

2 голосов
/ 25 февраля 2016

Я использую python с pexpect для взаимодействия с порожденными виртуальными машинами, используя их последовательные консоли.Я обычно автоматизирую сценарии, которые имеют до 128 ВМ таким образом, это достаточно быстро.Обычно я использую virt-install для создания экземпляров гостей, и использую «virsh console (имя домена)», используя pexpect, чтобы получить «дескриптор» для каждой консоли, чтобы я мог отправлять команды для настройки сети, средств запуска / утилит / сценариев, работы монитора,и т.д. Довольно мило с точки зрения простоты, и поскольку скрипты просто выдают команды оболочки, вы не сталкиваетесь с API, которые меняются от версии к версии, например, последовательная консоль всегда будет там.Иногда я использую qemu напрямую (в последнее время я работаю с QEMU, который libvirt не поддерживает, поскольку он слишком новый), в этом случае у меня будет гостевая консоль, использующая порт telnet, так что я могу "telnet localhost portnumber" сделатьконсольное соединение вместо "virsh console (имя домена)".В любом случае, Python-скрипты с модулем pexpect для взаимодействия с виртуальными машинами - это прекрасно.

1 голос
/ 11 января 2017

PyQemu теоретически может сделать это.Я использовал его в прошлом, хотя сейчас это выглядит как устаревший проект.Он предоставляет Python-агент (эквивалент гостевых инструментов VMWare) для запуска на гостевой системе, взаимодействуя с хостом через последовательный порт.Вы можете получить прокси для модулей Python, работающих в контексте виртуальной машины, и любая связь с ними осуществляется через последовательный порт.В следующем примере AutoIt используется для автоматизации Notepad:

machine = PyQemu.GetProxy("win2k")

# Wrap the machine object in another proxy representing the 'os'
# module running inside the VM.
os = PyQemu.vm.Module(machine,"os")

# NOTE: This is running on the VM!
os.system("notepad")

# Get an IDispatch object representing the autoit ActiveX control
autoit = PyQemu.vm.Dispatch(machine,"AutoItX3.Control")

# See if a window is active on the VM
state = autoit.WinActive("Untitled -")

Предостережение: из-за использования последовательного порта он далеко не быстрый (независимо от настроек скорости последовательного порта), поэтому, возможно, лучше всего передать любой объемданные другими способами, например образ виртуального диска FAT.

1 голос
/ 10 июня 2012

Вы можете создать обратный туннель ssh от гостя к хосту, который будет перенаправлять каждый запрос на хост на конкретном порту гостю.Этот способ поможет вам контролировать гостя с хоста.

0 голосов
/ 20 апреля 2013

Вы можете получить доступ к гостю через сеть, установив сетевой мост или используя опцию -hostfwd.

Последнее проще. Это позволяет вам экспортировать гостевой порт TCP / UDP на хост. Вы можете сопоставить гостевой TCP-порт 22 с хостом и управлять им так же, как вы управляете реальными удаленными машинами. Смотрите этот блог Запуск qemu на фоне .

0 голосов
/ 30 ноября 2010

Если вы используете Linux в гостевой системе, не могли бы вы просто использовать ssh / screen для запуска удаленных процессов в гостевой системе?

Кроме того, я видел, как люди писали обертки Python, которые используют popen() для захвата stdin / stdout и используют их для автоматизации некоторых команд (т.е. когда вы видите приглашение входа в систему, отправьте имя входа в stdin QEMU.

...