[Примечание. Автоматизация без использования 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”