27 个版本 (13 个重大更新)
新版本 0.14.0 | 2024 年 8 月 19 日 |
---|---|
0.12.0 | 2024 年 5 月 9 日 |
0.11.0 | 2024 年 1 月 17 日 |
0.10.0 | 2023 年 12 月 19 日 |
0.3.1 | 2023 年 2 月 28 日 |
#25 在 模拟器
每月 299 次下载
270KB
1.5K SLoC
vmtest
vmtest
允许您在虚拟机中快速且以编程方式运行测试。
以下是一些场景,这些场景可能有用,但不限于:
- 您发布了一个虚拟机镜像,希望在开发期间以编程方式测试该镜像,无论是在本地还是在 CI 中。
- 您开发基于 eBPF 的应用程序,并希望在支持的各种内核上运行应用程序测试,无论是在本地还是在 CI 中。
- 您是内核开发者,并希望快速迭代更改。
一个关键特性是根主机用户空间可以透明地映射到客户机 VM。这使得将 vmtest
添加到现有的 CI 工作流程变得容易,因为安装在根主机上的依赖项也可以轻松地在客户机 VM 中重用。
依赖项
以下是需要依赖项,按位置分组:
主机机器
虚拟机镜像
qemu-guest-agent
- 内核 9p 文件系统支持,编译在内或作为模块(参见内核依赖项)
- 大多数(如果不是所有)发行版都已经以模块或更好的方式提供了支持
内核
CONFIG_VIRTIO=y
CONFIG_VIRTIO_PCI=y
CONFIG_VIRTIO_CONSOLE=y
CONFIG_NET_9P=y
CONFIG_NET_9P_VIRTIO=y
CONFIG_9P_FS=y
请注意,虚拟机镜像依赖项仅在您使用 image
目标参数时才需要。同样,这也适用于内核依赖项。
安装
假设您已安装了 rust 工具链
,只需运行
$ cargo install vmtest
或者,vmtest
在其 发布资产 中发布静态链接的二进制文件。目前仅发布 x86-64-linux。
用法
单行接口
配置文件接口功能更强大,可以解锁所有 vmtest
功能。然而,如果您只是想尝试一次性的操作,它可能会有些重量级。对于这种轻量级的情况,vmtest
提供了单行接口。
例如,要使用不同的内核在客户机 VM 中运行任意命令
$ vmtest -k ./bzImage-v6.2 "uname -r"
=> bzImage-v6.2
===> Booting
===> Setting up VM
===> Running command
6.2.0
在具有不同内核和rootfs的虚拟机中运行任意命令
$ vmtest -k ./bzImage-v6.2 -r ./rootfs "uname -r"
=> bzImage-v6.2
===> Booting
===> Setting up VM
===> Running command
6.2.0
在虚拟机中从另一个架构的内核运行任意命令
$ vmtest -k ./kernels/Image-arm64 -r ./rootfs/ubuntu-lunar-arm64 -a aarch64 "uname -r"
=> Image-arm64
===> Booting
===> Setting up VM
===> Running command
6.6.0-rc5-ga4a0c99f10ca-dirty
也可以通过使用命令 -
在虚拟机中获取交互式shell提示符
vmtest -k ./bzImage-v6.2 "-"
...
...
root@(none):/#
有关所有选项和标志,请参阅 vmtest --help
。
配置文件接口
默认情况下,vmtest
从当前工作目录中的 vmtest.toml
读取。 vmtest.toml
又反过来描述了应该运行哪些 目标。
例如,考虑以下 vmtest.toml
[[target]]
name = "AWS kernel"
kernel = "./bzImage-5.15.0-1022-aws"
command = "uname -r | grep -e aws$"
[[target]]
name = "OCI image"
image = "./oci-stage-6/oci-stage-6-disk001.qcow2"
command = "ls -l /mnt/vmtest && cat /proc/thiswillfail"
[[target]]
name = "Foreign Architecture"
kernel = "./kernels/Image-arm64"
arch = "aarch64"
rootfs = "./rootfs/ubuntu-lunar-arm64"
command = "uname -m | grep aarch64"
在上面的配置中,定义了两个目标:“AWS内核”和“OCI镜像”。
简单来说,“AWS内核”目标告诉vmtest在具有与主机相同用户空间环境的虚拟机中运行 command
,除了指定的 kernel
。
另一方面,“OCI镜像”告诉vmtest在提供的虚拟机镜像中运行 command
。该镜像完全定义了 command
运行的环境,除了 /mnt/vmtest
。 /mnt/vmtest
(如下所示)包含以 vmtest.toml
所在目录为根的完整目录树。此目录树是共享的——不是复制的——并且具有可读和可写权限。
使用上述配置运行vmtest会产生以下结果
$ vmtest
=> AWS kernel
PASS
=> OCI image
===> Booting
===> Setting up VM
===> Running command
total 2057916
drwxr-xr-x 1 ubuntu ubuntu 200 Nov 14 20:41 avx-gateway-oci-stage-6
-rw-r--r-- 1 ubuntu ubuntu 11631520 Feb 1 00:33 bzImage-5.15.0-1022-aws
-rw-r--r-- 1 ubuntu ubuntu 359 Feb 4 01:41 vmtest.toml
cat: /proc/thiswillfail: No such file or directory
Command failed with exit code: 1
FAILED
=> Foreign Architecture
===> Booting
===> Setting up VM
===> Running command
aarch64
有关完整的配置文档,请参阅 config.md。
在Github CI中的使用
vmtest-action 是一个方便的包装器,围绕 vmtest
设计,旨在在Github Actions中运行。有关更多详细信息,请参阅 vmtest-action
文档。
技术细节
有关一般架构说明,请参阅 architecture.md。
致谢
感谢Omar Sandoval的 drgn
的 vmtest 和Andy Lutomirski的卓越的 virtme
,他们提供了思想和技术探索。
依赖项
~8–19MB
~263K SLoC