Running Autotest In a Guest

接下来看一下虚拟机guest执行一次测试的列子。control文件有点特别的是需要在host中运行OProfile收集运行时的信息。使用oprofile前,需要在guest安装。 给KVm指定一个IP,就会有一个虚拟机生成。试图运行虚拟机里面的oprofile,但没有成功。最后,选项"opcontrol --setup"应根据host中vmlinux位置调整。

remote_host=hosts.SSHHost("192.168.1.1")
kvm_on_remote_host= kvm.KVM(remote_host)

kvm_on_remote_host.get("/var/local/src/kvm-compiled.tar.gz")
addresses= [{"mac":"02:00:00:00:00:01", "ip":"10.0.0.1"}]
kvm_on_remote_host.install(addresses, build=False, insert_moudles=False)

qemu_options="-m 256 -hda /var/local/vdisk.img -snapshot"
g1= hosts.KVMGuest(kvm_on_remote_host, qemu_options)
g1.wait.up()

at= autotest.Autotest()
at.get("/home/foo/autotest/client")
at.install(g1)

control_file="""
#~ job.profiles.add("oprofile", events=["CPU_CLK_UNHALTED:8000"])
job.run_test("linus_stress")
"""

results_dir= "g1_results"

# --start oprofile
remote_host.run("opcontrol --shutdown")
remote_host.run("opcontrol --reset")
remote_host.run("opcontrol --setup"
    # "--vmlinux /lib/modules/#(uname -r)build/vmlinux
    "--no-vmlinx"
    "--event CPU_CLK_UNHALTED:8000")
remote_host.run("opcontrol --start")

at.run(control_file, results_dir, g1)

# --stop opofile
remote_host.run("opcontrol --stop")
tmpdir= remote_host.get_tmp_dir()
remote_host.run('opreport -l &> "%s"' %(sh_escape(os.path.join(tmpdir, "report")),))
remote_host.get_file(os.path.join(tmpdir, "repoet"), os.path.join(results_dir, "host_oprofile"))

Changing the Guest Kernel

Usual"Way

KVM虚拟机使用bootloader,可以运行时进行重启,可以在同一个虚拟机上安装不同的内核

remote_host= hosts.SSHHost("192.168.1.1")

kvm_on_remote_host= kvm.KVM(remote_host)
kvm_on_remote_host.get("/var/local/src/kvm-comiled.tar.gz")
addresses=[{"mac": "02:00:00:00:00:01", "ip": "10.0.0.1"}]
kvm_on_remote_host.install(addresses, build=False, insert_moudles=False)

qemu_options="-m 256 -hda /var/local/vdisk.img -snapshot"
g1= hosts.KVMguest(kvm_on_remote_host, qemu_options)
g1.wait_up()

print g1.run("uname -a").stdout

kernel= deb_kernel.DEBKernel()
kernel.get("/home/foo/linux-2.6.21.3-6_2.6.21.3-6_amd64.deb")

kernel.install(g1)
g1.reboot()

print g1.run("uname -a").stdout

"QEMU" Way

通常可以通过qemu 的-kernel -append -initrd 选项,这些选项可以指定虚拟机内核和磁盘镜像。

remote_host= hosts.SSHHost("192.168.1.1")

kvm_on_remote_host= kvm.KVM(remote_host)
kvm_on_remote_host.get("/var/local/src/kvm-compiled.tar.gz")
addresses=[{"mac": "02:00:00:00:00:01", "ip": "10.0.0.1"})
kvm_on_remote_host.install(addresses, build=False, install_modules=False)

kernel= deb_kernel.DEBKernel()
kernel.get("/home/foo/linux-2.6.21.3-6_2.6.21.3-6_amd64-noNeedForInitrd.deb")
kernel_dir= kernel.extract(remote_host)

qemu_options= '-m 256 -hda /var/local/vdisk.img -snapshot -kernel "%s" -append "%s"' %(sh_escape(os.path.join(kernel_dir, kernel.get_image_name()[1:])), sh_escape("root=/dev/hda1 ro console=tty0 console=ttyS0, 9600"),)

g1=hosts.KVMGuest(kvm_on_remote_host, qemu_options)
g1.wait_up()

print g1.run("uname -a").stdout

Parallel commands

Autoserv 可以通过subcommand.py中的parallel()和parallel_simple()并行运行命令。 这对于一次测试多台机器和client-server测试非常有用。这里给出一个netperf2 测试的例子。

def check_kernel(host, version, package):
    if host.run("uname -r").stdout.strip() != version:
    package.install(host)
    host.reboot()

def install_kvm(kvm_on_host_var_name, host, source, addresses):
    exec("global %(var_name)s\n"
        "%(var_name)s= kvm.KVM(host)\n"
        "%(var_name)s.get(source)\n"
        "%(var_name)s.install(addresses)\n" % {"var_name":kvm_on_host_var_name})

    remote_host1= hosts.SSHHost("192.168.1.1")
    remote_host2= hosts.SSHHost("192.168.1.2")

    kernel= deb_kernel.DEBKernel()
    kernel.get("/var/local/linux-2.6.21.3-3_2.6.21.3-3_amd64.deb")

    host1_command= subcommand(check_kernel, [remote_host1, "2.6.21.3-3", kernel])
    host2_command= subcommand(check_kernel, [remote_host2, "2.6.21.3-3", kernel])

    parallel([host1_command, host2_command])

    install_kvm("kvm_on_remote_host1", remote_host1, "/var/local/src/kvm-33.tar.gz", [{"mac": "02:00:00:00:00:01", "ip": "10.0.0.1"}]
    qemu_options= "-m 256 -hda /var/local/vdisk.img -snapshot"
    gserver= hosts.KVMGuest(kvm_on_remote_host1, qemu_options)
    gserver.wait_up()

    at= autotest.Autotest()
    at.get("/home/foo/autotest/client")
    at.install(gserver)
    at.install(remote_host2)

    server_results_dir= "results-netperf-guest-to-host-far-server"
    client_results_dir= "results-netperf-guest-to-host-far-client"

    server_control_file= 'job.run_test("netperf2", "%s", "%s", "server", tag="server")' % (sh_escape(gserver.hostname), sh_escape(remote_host2.hostname),)
    client_control_file= 'job.run_test("netperf2", "%s", "%s", "client", tag="client")' % (sh_escapt(gserver.hostname),
    sh_escape(remote_host2.hostname),)

    server_command = subcommand(at.run, [server_control_file, server_results_dir, gserver])
    client_command= subcommand(at.run, [client_control_file, client_results_dir, remote_host2])

    parallel([server_command, client_command])

上一篇Autotest: Autotest-Autotest Remote (Autoserv)(二)>> 下一篇Autotest:Autotest-client Package(1)>>>

by 李鹏