资讯动态

Avocado-VT虚拟化测试框架实战指南

发布时间:2026/10/26 16:28:06 来源:尧图企业网站定制
简介本资源为Avocado测试框架的官方源码归档包avocado-vt-master分支面向Linux系统测试工程师、自动化测试开发者及开源项目质量保障人员用于快速部署、二次开发或深入理解系统级自动化测试框架的核心机制。压缩包为ZIP格式大小8.08MB包含完整源代码、README与使用文档、示例测试脚本、配置模板及基础工具脚本等典型内容覆盖框架核心模块、VTVirtualization 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-VTVirtualization 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 bs1M count1024avocado-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-vtPyPI 上的avocado-vt是旧版已归档且缺失大量vt特有插件和最新 guest 镜像支持。必须用源码 zip 启动。2.1 解压与依赖对齐为什么pip install -r requirements.txt会失败先确认你的环境仅支持 x86_64 LinuxRHEL 8/CentOS Stream 9/Ubuntu 22.04不支持 macOS 或 Windows WSL2因需直接访问/dev/kvm和libvirtd。下载avocado-vt-master_avocado_zip_后解压到干净路径如/opt/avocado-vtwget 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。原因有三requirements.txt里部分包如libvirt-python需系统级依赖libvirt-devel,python3-develavocado主框架版本必须严格匹配avocado-vt所需当前 master 要求avocado-framework100.0,101.0vt依赖的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-framework100.0,101.0 --user最后让 Python 能 importavocado_vtcd /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首次运行会较慢约 300MBvt.boot测试用例名对应tests/boot.py。首次运行会自动下载centos7-minimal.iso到~/.avocado/data/iso/用qemu-img创建 10G qcow2 磁盘启动 VM等待login:字符串出现在串口日志中成功则输出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传入本质是 keyvalue 字典。Windows 测试的关键参数如下参数名值说明guest_osWindows:10触发 Windows 专用初始化流程cdroms[win10.iso, virtio-win.iso]挂载两个 ISO主系统盘 驱动盘cdrom_cd1win10.iso第一光驱为 Windows ISOcdrom_cd2virtio-win.iso第二光驱为 VirtIO 驱动 ISOboot_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_osWindows:10;cdroms[win10.iso,virtio-win.iso];cdrom_cd1win10.iso;cdrom_cd2virtio-win.iso;boot_onced;driver_installyes;windows_unattendyes \ vt.windows_install逻辑说明vt.windows_install是avocado-vt内置的 Windows 安装用例。它会创建 VM挂载双 ISO启动后自动发送按键模拟winr→diskmgmt.msc在安装界面检测virtio-win光驱是否存在若存在则运行virtio-win-guest-tools.exe /S静默安装驱动最终验证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_osWindows:10;cdroms[win10.iso,virtio-win.iso];cdrom_cd1win10.iso;cdrom_cd2virtio-win.iso;boot_onced;driver_installyes;windows_unattendyes;ps_script/opt/avocado-vt/scripts/check_vioscsi.ps1 \ vt.windows_installavocado-vt会在 Windows guest 启动后自动将ps_script路径下的脚本上传至C:\Users\Administrator\并执行powershell -ExecutionPolicy Bypass -File ...。日志中会输出 PowerShell 的 stdout/stderr便于定位驱动加载失败或磁盘未识别问题。4. 避坑指南5 个让工程师凌晨三点还在查日志的真实问题avocado-vt功能强大但因其深度耦合 KVM/libvirt/guest OS踩坑成本极高。以下是我在三个不同客户现场金融云、运营商 NFVI、国产芯片服务器遇到的高频问题按「现象 → 原因 → 解决」结构整理每条都附日志关键词方便你 CtrlF 快速定位。4.1 现象avocado run vt.boot卡住日志显示Timeout waiting for login: on serial console原因avocado-vt默认通过serial console/dev/ttyS0捕获 guest 输出但某些 CentOS 7 minimal 镜像未启用getty服务或内核参数缺少consolettyS0。解决修改avocado-vt的guest_os配置强制添加内核参数--vt-extra-params kernel_paramsconsolettyS0,115200n8或手动编辑avocado-vt的shared/config.py在DEFAULT_KERNEL_PARAMS中追加该参数。血泪经验不要迷信镜像名。centos7-minimal.iso有多个变种有的默认关串口有的开但没 getty。用virsh dumpxml查看生成的 domain XML确认console typepty下有target typeserial port0/且boot devhd/正确。4.2 现象vt.windows_install执行到一半报错Could not find unattended answer file原因avocado-vt的 Windows 无人值守逻辑依赖autounattend.xml但该文件需放在virtio-win.iso根目录下。而官方virtio-win.iso不含此文件需手动注入。解决下载autounattend.xml模板avocado-vt源码中examples/windows/autounattend.xml用7z或xorriso将其写入virtio-win.isoxorriso -indev virtio-win.iso -outdev virtio-win-fixed.iso -map autounattend.xml /用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-framework100.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.boot4.4 现象vt.bootPASS但vt.qemu_monitor报QMP command query-status failed: Connection refused原因avocado-vt的 QEMU monitor 测试需启用 QMPQEMU Machine Protocolsocket但默认qemu:///system启动的 VM 未暴露 QMP。解决在--vt-extra-params中显式开启 QMP--vt-extra-params qmp_socket/tmp/qmp-$(date %s).sock;qmp_enabledyes并在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环境变量。解决获取企业 CA 证书如internal-ca.crt设置环境变量export REQUESTS_CA_BUNDLE/path/to/internal-ca.crt export SSL_CERT_FILE/path/to/internal-ca.crt重新运行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会在vt.boot开始前对 VM 执行virsh snapshot-create-as baseline --memspec file/tmp/baseline.mem测试结束后执行virsh snapshot-revert baseline若测试失败快照仍保留方便你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_osWindows:11;virtio_version0.1.245 \ vt.windows_install这里--vt-snapshot-name win10-virtio复用的是 Windows 10 的快照但--vt-guest-os Windows:11会触发不同的初始化逻辑如不同autounattend.xmlavocado-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 分钟内恢复整个测试流水线。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑