首先,我们来了解一下 KVM 虚拟机有关的几个概念和工具。
新建 KVM 虚拟机时,可以指定另一磁盘文件作为BackingFile。BackingFile 是一个只读的虚拟磁盘基础映像,可以在多个虚拟机间进行共享。基于 BackingFile 创建和运行虚拟机时,只会在自己的磁盘文件中增量地写入文件,从而提高效率、节省磁盘和维护成本。
虚拟机快照保存了虚拟机在某个指定时间点的状态,当我们在自动化测试过程中遭遇问题或错误时,可以利用快照保存、并恢复到执行中的某个时间点。借助 BackingFile 机制,虚拟机支持形如以下的多层依赖的快照链。
base image <-- vm01 <-- snap 1 <-- snap 2 <-- vm02(active)
可使用以下命令,将处于快照链中的某个虚机,导出形成一个独立的磁盘映像文件,其不再依赖其它映像。
qemu-img convert -O qcow2 vm02.qcow2 vm-templ.img
假设我们在用户的工作目录中,建立了以下目录。
kvm 根目录
iso 存放光盘镜像
base 存放BackingFile
share 存放共享磁盘镜像,用户存储测试工具、驱动等
image 存放测试机的磁盘镜像
xml 存放导出的虚拟机XML配置文件
下面用一个例子,给大家介绍下快速创建测试虚拟机的方法。
qemu-img create -f qcow2 -o cluster_size=2M kvm/share/tools.qcow2 10G
qemu-img create -f qcow2 -o cluster_size=2M,backing_file=kvm/base/windows/win10/x64-pro-zh_cn.qcow2 kvm/image/test-win10-x64-pro-zh_cn-01.qcow2 40G
除了使用图形界面的 qemu-manager 软件,这里也提供一种命令行的方法,大家可用于测试平台的代码中。
virsh dumpxml test-win10-x64-pro-zh > kvm/xml/test-win10-x64-pro-zh.xml
修改 XML 配置文件中的以下字段:
在第 1 块 disk 的 Elemnt 中,加入以下 BackingFile 有关的内容:
<backingStore type="file" index="2">
<format type="qcow2"/>
<source file="/home/aaron/kvm/base/windows/win10/x64-pro-zh_cn.qcow2"/>
<backingStore/>
<graphics type="vnc" port="-1" autoport="yes" listen="0.0.0.0" passwd="P2ssw0rd">
<listen type="address" address="0.0.0.0"/>
</graphics>
virsh define kvm/xml/test-win10-x64-pro-zh.xml
virsh start test-win10-x64-pro-zh
virsh vncdisplay test-win10-x64-pro-zh
另外,本人使用 GO 语言实现了基于 libvirt 接口的虚拟机管理有关功能,此开源项目旨在为大家提供一个基于 KVM 虚拟机和 Docker 容器的、按需测试环境管理平台,详情请参照网址https://github.com/easysoft/zagent 。
常用命令:
# 查看虚拟机信息
qemu-img info --backing-chain kvm/image/test-win10-x64-pro-zh_cn-01.qcow2
# 修改虚拟机磁盘大小
qemu-img resize x64-pro-zh_cn.qcow2 +10G
# 查看虚拟机里列表
virsh list --all
# 查看虚拟机VNC端口
virsh vncdisplay win10-test
# 导出虚拟机XML配置文件
virsh dumpxml win10-test > win10-test.xml
# 创建虚拟机磁盘镜像
qemu-img create -f qcow2 -o cluster_size=2M,backing_file=base.qcow2 win10-test.qcow2 40G
# 转换虚拟机镜像
qemu-img convert -O qcow2 vm02.qcow2 vm-templ.img
# 定义、取消定义,启动、停止虚拟机
virsh define win10-test.xml
virsh start win10-test
virsh destroy win10-test
virsh undefine win10-test