qemu guest automation

前端 未结 8 787
生来不讨喜
生来不讨喜 2021-02-09 02:39

I\'ve not been able to find any documentation stating the existence of an API that can be used to automate things inside of a qemu guest.

For example, I would like to la

8条回答
  •  南笙
    南笙 (楼主)
    2021-02-09 03:19

    [Note: Automation without using any virtualization API. From my blog post.]

    Step 1:

    By default, qemu uses SDL to display the VGA output. So, the first step is make this interaction with qemu through stdio. Qemu provides an option for this.

    From qemu docs:

    -nographic Normally, QEMU uses SDL to display the VGA output. With this option, you can totally disable graphical output so that QEMU is a simple command line application. The emulated serial port is redirected on the console. Therefore, you can still use QEMU to debug a Linux kernel with a serial console.

    So, all you have to do is invoke qemu with -nographic.

    qemu -nographic -hda guest.disk

    Step 2:

    Now that you can interact with your guest (or qemu process) through command line, you have to automate this interaction. The obvious way to do this in python is start the qemu process (with -nographic) with subprocess module and then communicate with that process. But to my surprise, this just didn’t work out for me. So, I looked for some other way.

    Later, I found out that the most awesome tool for this kind of jobs is Expect. It is an automation tool for interactive applications written in tcl.

    This guide should help you in getting started with Expect. Here is the script to run a guest with qemu using 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”
    

提交回复
热议问题