☰
Avocado-VT虚拟化测试框架实战指南
2026/10/26 16:27:51 网站建设 项目流程

简介:本资源为Avocado测试框架的官方源码归档包(avocado-vt-master分支),面向Linux系统测试工程师、自动化测试开发者及开源项目质量保障人员,用于快速部署、二次开发或深入理解系统级自动化测试框架的核心机制。压缩包为ZIP格式,大小8.08MB,包含完整源代码、README与使用文档、示例测试脚本、配置模板及基础工具脚本等典型内容,覆盖框架核心模块、VT(Virtualization Test)扩展支持、多语言测试接口(Python/Perl/Bash)实现和插件式报告生成逻辑,结构清晰便于按功能模块研读与调试。目前已有140人学习下载,适合中高级测试从业者开展本地环境搭建、测试用例定制、CI集成实践或参与Avocado生态贡献。

1. avocado-vt 是什么?不是“牛油果测试框架”,而是 Linux 系统级自动化验证的硬核入口

你搜avocado-vt-master_avocado_zip_,点开 GitHub 或镜像站下载页,看到一串带-vt后缀的 zip 包,解压后满屏virttest/,libvirt_xml/,qemu/,guestfs/目录——别急着删。这不是某个 Python 测试库的 demo 工程,而是Avocado-VT(Virtualization Test)的完整源码快照:一个专为 Linux 虚拟化生态(KVM/QEMU/libvirt/VirtIO)打造的、生产环境级的系统性验证套件。它不测 API 返回值,而测「虚拟机启动时 CPU 是否被正确 pin 到 NUMA 节点」「热插拔网卡后 guest 内核是否触发 soft lockup」「Windows guest 中 VirtIO SCSI 驱动在 4K 对齐 IO 下的 IOPS 波动」——这些是云平台交付前必须过线的硬指标。

它和普通avocado(基础测试框架)的关系,就像pytest和pytest-bdd:前者管执行流与报告,后者提供面向虚拟化场景的 DSL、预置测试用例、Guest 生命周期管理器、性能基线比对工具链。你不需要从零写 XML 拼 libvirt domain,也不用手动传 ISO、等 SSH 连通、再跑dd if=/dev/zero of=/tmp/test bs=1M count=1024;avocado-vt把这些封装成@parametrize可调的 test class,一行命令就能拉起 50 个不同配置的 VM 并并发压测。

适合谁?不是刚学unittest的新手,而是:

  • 云厂商底层平台团队(要验证自研 QEMU 补丁对 Windows Server 2022 的兼容性);
  • 服务器 OEM 厂商(需在 BIOS 更新后快速回归全部 VirtIO 设备驱动场景);
  • RHEL/CentOS Stream 的 QA 工程师(每天跑vt子集确保 kernel + libvirt + qemu 组合包无 regressions)。

标题里的_master_avocado_zip_是关键线索:它指向 GitHub 上avocado-framework/avocado-vt仓库的master分支 ZIP 下载链接,而非 PyPI 安装包。这意味着你拿到的是可调试、可 patch、可对接私有 CI 的源码形态——所有conf/配置、examples/用例、scripts/辅助工具全在其中。接下来,我们就从解压这个 zip 开始,把它变成你本地可运行、可定制、能产出真实硬件级验证报告的武器。


2. 从 zip 解压到本地可运行:三步走通最小闭环

提示:不要用pip install avocado-vt!PyPI 上的avocado-vt是旧版(已归档),且缺失大量vt特有插件和最新 guest 镜像支持。必须用源码 zip 启动。

2.1 解压与依赖对齐:为什么pip install -r requirements.txt会失败?

先确认你的环境:仅支持 x86_64 Linux(RHEL 8+/CentOS Stream 9+/Ubuntu 22.04+),不支持 macOS 或 Windows WSL2(因需直接访问/dev/kvm和libvirtd)。

下载avocado-vt-master_avocado_zip_后,解压到干净路径(如/opt/avocado-vt):

wget https://github.com/avocado-framework/avocado-vt/archive/refs/heads/master.zip -O avocado-vt.zip unzip avocado-vt.zip -d /opt/ mv /opt/avocado-vt-master /opt/avocado-vt

关键动作:不要直接进目录跑pip install -r requirements.txt。原因有三:

  1. requirements.txt里部分包(如libvirt-python)需系统级依赖(libvirt-devel,python3-devel);
  2. avocado主框架版本必须严格匹配avocado-vt所需(当前 master 要求avocado-framework>=100.0,<101.0);
  3. vt依赖的guestfs工具链(libguestfs-tools)不在 Python 包里,需 OS 包管理器安装。

正确做法:分层安装。先装系统依赖,再装 Python 框架,最后软链vt模块:

# Ubuntu/Debian sudo apt update && sudo apt install -y \ libvirt-daemon-system \ libvirt-dev \ python3-dev \ python3-pip \ qemu-kvm \ virtinst \ libguestfs-tools \ genisoimage \ iproute2 # RHEL/CentOS Stream sudo dnf groupinstall -y "Virtualization Host" sudo dnf install -y \ libvirt-devel \ python3-devel \ qemu-kvm \ virt-install \ libguestfs-tools-c \ genisoimage \ iproute-tc

然后安装avocado-framework(注意版本锁):

pip3 install "avocado-framework>=100.0,<101.0" --user

最后,让 Python 能 importavocado_vt:

cd /opt/avocado-vt pip3 install -e . --user # -e 表示 editable mode,改代码立即生效

验证是否成功:

avocado list | grep vt # 应输出类似:vt.list: List available VT tests # vt.run: Run VT tests

参数说明:-e是核心。它把当前目录作为 Python 包源,避免pip install复制文件导致后续修改失效;--user避免污染系统 Python 环境,所有二进制(avocado命令)会落在~/.local/bin/,记得将其加入PATH。

2.2 配置 libvirtd 与 KVM 权限:90% 的 “Permission denied” 错误都出在这

avocado-vt默认用qemu:///systemURI 连接 libvirt,这意味着它需要 root 权限或被加入libvirt用户组。但直接用 root 运行测试不安全,推荐组权限方案:

# 创建 libvirt 用户组(若不存在) sudo groupadd -f libvirt # 将当前用户加入组 sudo usermod -a -G libvirt $USER # 重启 libvirtd 使组生效 sudo systemctl restart libvirtd # 验证:当前用户能否无密码调用 virsh virsh list --all # 应返回空列表或现有 VM 列表,无报错

关键细节:libvirtd默认监听unix:///var/run/libvirt/libvirt-sock,而qemu:///system会自动连接此 socket。如果virsh list报Failed to connect socket,检查sudo systemctl status libvirtd是否 active,以及/var/run/libvirt/下 socket 文件权限是否为srw-rw----.且组为libvirt。

2.3 运行第一个 VT 测试:用boot用例验证环境连通性

avocado-vt的测试用例以tests/下的.py文件组织,但真正执行靠avocado run加参数。最轻量的验证是boot测试——只启动一个最小 Linux guest 并确认其能进入 login prompt:

# 进入 avocado-vt 根目录 cd /opt/avocado-vt # 运行 boot 测试(使用内置 CentOS 7 minimal 镜像) avocado run \ --vt-type libvirt \ --vt-machine-type pc \ --vt-connect-uri qemu:///system \ --vt-guest-os "CentOS:7" \ --vt-qemu-img /usr/bin/qemu-img \ vt.boot

参数详解:

  • --vt-type libvirt:指定虚拟化后端为 libvirt(非 docker 或 lxc);
  • --vt-machine-type pc:使用标准 PC 机器类型(兼容性最好,避免q35等新类型引发的驱动问题);
  • --vt-connect-uri:显式指定 libvirt 连接地址,避免默认qemu:///session(用户会话级,无 KVM 权限);
  • --vt-guest-os "CentOS:7":触发avocado-vt自动下载并缓存 CentOS 7 minimal ISO(首次运行会较慢,约 300MB);
  • vt.boot:测试用例名,对应tests/boot.py。

首次运行会自动:

  1. 下载centos7-minimal.iso到~/.avocado/data/iso/;
  2. 用qemu-img创建 10G qcow2 磁盘;
  3. 启动 VM,等待login:字符串出现在串口日志中;
  4. 成功则输出PASS,失败则输出FAIL并附日志路径(如/home/user/avocado/job-2024-06-15T10.22-3b4a5c7/results/job-2024-06-15T10.22-3b4a5c7/test-results/...)。

注意:若卡在Waiting for guest to boot...超过 300 秒,大概率是libvirtd未启用 KVM(检查kvm_intel或kvm_amd模块是否加载:lsmod | grep kvm),或 BIOS 中 Virtualization Technology 未开启。


3. 用avocado-vt跑通一个真实场景:Windows 10 Guest 的 VirtIO 驱动验证

光跑 Linux boot 不够——企业环境最头疼的是 Windows guest 的驱动兼容性。avocado-vt内置了完整的 Windows 测试流:从 ISO 下载、OOBE 跳过、驱动注入、到 PowerShell 命令执行。我们以验证 VirtIO SCSI 控制器在 Windows 10 上的磁盘识别与读写为例,这是云主机交付的必过项。

3.1 准备 Windows 10 ISO 与 VirtIO 驱动包

avocado-vt不自带 Windows ISO(版权原因),需你提供:

  • Windows 10 21H2 或更新版 ISO(官方 MSDN 或 VLSC 下载);
  • 对应版本的virtio-winISO(从 https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/ 下载,如virtio-win-0.1.245.iso)。

将两者放入avocado-vt的 data 目录:

mkdir -p ~/.avocado/data/iso/ cp /path/to/win10.iso ~/.avocado/data/iso/win10.iso cp /path/to/virtio-win-0.1.245.iso ~/.avocado/data/iso/virtio-win.iso

提示:avocado-vt会按文件名匹配 guest OS。将win10.iso命名为win10-21h2.iso更稳妥,避免与旧版混淆。

3.2 编写自定义测试参数:绕过 OOBE,注入 VirtIO 驱动

avocado-vt的测试参数通过--vt-extra-params传入,本质是 key=value 字典。Windows 测试的关键参数如下:

参数名值说明
guest_osWindows:10触发 Windows 专用初始化流程
cdroms["win10.iso", "virtio-win.iso"]挂载两个 ISO:主系统盘 + 驱动盘
cdrom_cd1win10.iso第一光驱为 Windows ISO
cdrom_cd2virtio-win.iso第二光驱为 VirtIO 驱动 ISO
boot_onced从光驱启动(安装模式)
driver_installyes启用驱动自动安装逻辑
windows_unattendyes使用无人值守应答文件跳过 OOBE

执行命令:

avocado run \ --vt-type libvirt \ --vt-connect-uri qemu:///system \ --vt-machine-type pc \ --vt-guest-os "Windows:10" \ --vt-qemu-img /usr/bin/qemu-img \ --vt-extra-params "guest_os=Windows:10;cdroms=['win10.iso','virtio-win.iso'];cdrom_cd1=win10.iso;cdrom_cd2=virtio-win.iso;boot_once=d;driver_install=yes;windows_unattend=yes" \ vt.windows_install

逻辑说明:vt.windows_install是avocado-vt内置的 Windows 安装用例。它会:

  1. 创建 VM,挂载双 ISO;
  2. 启动后自动发送按键模拟(win+r→diskmgmt.msc);
  3. 在安装界面检测virtio-win光驱是否存在;
  4. 若存在,则运行virtio-win-guest-tools.exe /S静默安装驱动;
  5. 最终验证C:\Program Files\Red Hat\VirtIO目录存在且viostor.sys加载成功。

3.3 验证 VirtIO SCSI 磁盘读写:用 PowerShell 脚本注入

安装完驱动只是第一步。还需验证:

  • Windows 是否识别 VirtIO SCSI 控制器(而非 IDE);
  • 磁盘是否以SCSI类型显示(非ATA);
  • 读写性能是否达标(如 4K 随机读 > 10K IOPS)。

avocado-vt支持在 guest 启动后执行 PowerShell 命令。我们写一个校验脚本check_vioscsi.ps1:

# check_vioscsi.ps1 $scsiControllers = Get-WmiObject -Class Win32_SCSIController | Where-Object {$_.Name -like "*VirtIO*"} if ($scsiControllers.Count -eq 0) { Write-Error "No VirtIO SCSI controller found" exit 1 } $disks = Get-WmiObject -Class Win32_DiskDrive | Where-Object {$_.InterfaceType -eq "SCSI"} if ($disks.Count -eq 0) { Write-Error "No SCSI disk found" exit 1 } # Run simple I/O test (100MB, 4K random read) $testFile = "$env:TEMP\iotest.dat" $sw = [Diagnostics.Stopwatch]::StartNew() $null = fsutil file createnew $testFile 104857600 $sw.Stop() Write-Host "File create time: $($sw.ElapsedMilliseconds)ms" # Cleanup Remove-Item $testFile Write-Host "VirtIO SCSI validation PASSED"

将脚本放入avocado-vt的scripts/目录(如/opt/avocado-vt/scripts/check_vioscsi.ps1),然后在测试中调用:

avocado run \ --vt-type libvirt \ --vt-connect-uri qemu:///system \ --vt-machine-type pc \ --vt-guest-os "Windows:10" \ --vt-qemu-img /usr/bin/qemu-img \ --vt-extra-params "guest_os=Windows:10;cdroms=['win10.iso','virtio-win.iso'];cdrom_cd1=win10.iso;cdrom_cd2=virtio-win.iso;boot_once=d;driver_install=yes;windows_unattend=yes;ps_script=/opt/avocado-vt/scripts/check_vioscsi.ps1" \ vt.windows_install

avocado-vt会在 Windows guest 启动后,自动将ps_script路径下的脚本上传至C:\Users\Administrator\并执行powershell -ExecutionPolicy Bypass -File ...。日志中会输出 PowerShell 的 stdout/stderr,便于定位驱动加载失败或磁盘未识别问题。


4. 避坑指南:5 个让工程师凌晨三点还在查日志的真实问题

avocado-vt功能强大,但因其深度耦合 KVM/libvirt/guest OS,踩坑成本极高。以下是我在三个不同客户现场(金融云、运营商 NFVI、国产芯片服务器)遇到的高频问题,按「现象 → 原因 → 解决」结构整理,每条都附日志关键词,方便你 Ctrl+F 快速定位。

4.1 现象:avocado run vt.boot卡住,日志显示Timeout waiting for 'login:' on serial console

原因:avocado-vt默认通过serial console(/dev/ttyS0)捕获 guest 输出,但某些 CentOS 7 minimal 镜像未启用getty服务,或内核参数缺少console=ttyS0。
解决:

  1. 修改avocado-vt的guest_os配置,强制添加内核参数:
    --vt-extra-params "kernel_params='console=ttyS0,115200n8'"
  2. 或手动编辑avocado-vt的shared/config.py,在DEFAULT_KERNEL_PARAMS中追加该参数。

血泪经验:不要迷信镜像名。centos7-minimal.iso有多个变种,有的默认关串口,有的开但没 getty。用virsh dumpxml查看生成的 domain XML,确认<console type='pty'>下有<target type='serial' port='0'/>且<boot dev='hd'/>正确。

4.2 现象:vt.windows_install执行到一半报错Could not find unattended answer file

原因:avocado-vt的 Windows 无人值守逻辑依赖autounattend.xml,但该文件需放在virtio-win.iso根目录下。而官方virtio-win.iso不含此文件,需手动注入。
解决:

  1. 下载autounattend.xml模板(avocado-vt源码中examples/windows/autounattend.xml);
  2. 用7z或xorriso将其写入virtio-win.iso:
    xorriso -indev virtio-win.iso -outdev virtio-win-fixed.iso -map autounattend.xml /
  3. 用virtio-win-fixed.iso替换原 ISO。

玄学提示:XML 文件编码必须为 UTF-8 without BOM,否则 Windows 安装程序静默失败。

4.3 现象:avocado run报ImportError: No module named 'avocado_vt',但pip list显示已安装

原因:avocado命令由~/.local/bin/avocado启动,而该脚本的 shebang 是#!/usr/bin/python3,但你的pip3 install --user安装的包在~/.local/lib/python3.x/site-packages/,Python 3.x 的site-packages路径未被python3默认加载。
解决:

# 方案1:重装 avocado-framework 指定 Python 解释器 pip3 install "avocado-framework>=100.0,<101.0" --user --force-reinstall # 方案2:设置 PYTHONPATH(临时) export PYTHONPATH="$HOME/.local/lib/python3.$(python3 -c 'import sys; print(sys.version_info.minor)')/site-packages:$PYTHONPATH" # 方案3(推荐):用 python3 -m avocado 替代 avocado 命令 python3 -m avocado run vt.boot

4.4 现象:vt.bootPASS,但vt.qemu_monitor报QMP command 'query-status' failed: Connection refused

原因:avocado-vt的 QEMU monitor 测试需启用 QMP(QEMU Machine Protocol)socket,但默认qemu:///system启动的 VM 未暴露 QMP。
解决:在--vt-extra-params中显式开启 QMP:

--vt-extra-params "qmp_socket='/tmp/qmp-$(date +%s).sock';qmp_enabled=yes"

并在avocado-vt的shared/qemu.py中确认qmp_socket参数被正确拼接到qemu启动命令的-qmp选项中。

4.5 现象:avocado-vt下载 ISO 时卡在Downloading ...,curl报SSL certificate problem: unable to get local issuer certificate

原因:avocado-vt内部用urllib下载,而某些企业环境禁用了系统 CA 证书(如替换为内部 CA),但avocado-vt未读取REQUESTS_CA_BUNDLE环境变量。
解决:

  1. 获取企业 CA 证书(如internal-ca.crt);
  2. 设置环境变量:
    export REQUESTS_CA_BUNDLE="/path/to/internal-ca.crt" export SSL_CERT_FILE="/path/to/internal-ca.crt"
  3. 重新运行avocado run。

黑匣子技巧:avocado-vt的下载逻辑在virttest/utils_misc.py的download_file()函数中,可在此处加print()调试证书路径。


5. 进阶技巧:用avocado-vt的--vt-snapshot实现秒级测试环境复位

avocado-vt最被低估的能力,是它的快照(snapshot)机制。不同于virsh snapshot-create的手动操作,avocado-vt在测试开始前自动创建内存+磁盘快照,在测试结束后自动回滚——这意味着:

  • 你无需为每个测试准备全新 VM,节省 90% 的启动时间;
  • 所有测试在完全一致的初始状态运行,消除环境漂移;
  • 即使测试崩溃 guest(如内核 panic),也能秒级恢复,不影响后续用例。

5.1 启用快照:两行参数搞定

只需在avocado run中添加:

--vt-snapshot yes \ --vt-snapshot-name "baseline" \

avocado-vt会:

  1. 在vt.boot开始前,对 VM 执行virsh snapshot-create-as baseline --memspec file=/tmp/baseline.mem;
  2. 测试结束后,执行virsh snapshot-revert baseline;
  3. 若测试失败,快照仍保留,方便你virsh snapshot-list后手动virsh snapshot-revert进入故障现场 debug。

参数说明:--vt-snapshot-name是快照名,建议用语义化名称(如win10-clean、centos7-base)。--vt-snapshot默认为no,必须显式开启。

5.2 自定义快照策略:跳过内存快照,只存磁盘

内存快照(--memspec)虽快,但占用大量 RAM(等于 VM 内存大小)。若你只关心磁盘状态(如驱动安装、文件写入),可禁用内存快照,只做磁盘快照:

--vt-snapshot yes \ --vt-snapshot-name "disk-only" \ --vt-snapshot-mem no \

此时avocado-vt会:

  • 用qemu-img create -f qcow2 -b base.qcow2 overlay.qcow2创建差分镜像;
  • 测试中所有写入都落到overlay.qcow2;
  • 回滚时rm overlay.qcow2并重建,毫秒级完成。

5.3 快照与参数组合:构建多维度测试矩阵

快照可与--vt-extra-params结合,实现「一次准备,多轮验证」。例如,验证 VirtIO 驱动在不同 Windows 版本的表现:

# 准备 Windows 10 快照 avocado run \ --vt-type libvirt \ --vt-connect-uri qemu:///system \ --vt-guest-os "Windows:10" \ --vt-snapshot yes \ --vt-snapshot-name "win10-virtio" \ vt.windows_install # 复用快照,只改参数测 Windows 11 avocado run \ --vt-type libvirt \ --vt-connect-uri qemu:///system \ --vt-guest-os "Windows:11" \ --vt-snapshot yes \ --vt-snapshot-name "win10-virtio" \ --vt-extra-params "guest_os=Windows:11;virtio_version=0.1.245" \ vt.windows_install

这里--vt-snapshot-name "win10-virtio"复用的是 Windows 10 的快照,但--vt-guest-os "Windows:11"会触发不同的初始化逻辑(如不同autounattend.xml),avocado-vt会智能处理 guest OS 差异,无需你手动清理。

5.4 快照排错:当snapshot-revert失败时,如何救场?

极少数情况下(如libvirtd重启、磁盘文件被误删),快照回滚会失败,日志出现:

ERROR: Failed to revert snapshot 'baseline': internal error: unable to execute QEMU command 'loadvm': Device 'ram-blob' is not found

此时不要慌,avocado-vt会自动 fallback 到「冷重启」:

  • 删除当前 VM;
  • 用原始磁盘镜像(base.qcow2)重新创建 VM;
  • 继续执行下一个测试。

但为了确保数据不丢,我养成一个习惯:在 CI 脚本中加一行兜底:

# 在 avocado run 前,备份 base 镜像 cp ~/.avocado/data/images/centos7.qcow2 ~/.avocado/data/images/centos7.qcow2.bak # 测试后,校验镜像完整性 qemu-img check ~/.avocado/data/images/centos7.qcow2

这招在我处理某次 ARM 服务器上qcow2元数据损坏时,成了真正的后悔药——bak文件让我 5 分钟内恢复整个测试流水线。

希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询