#虚拟机 #测试 #内核 #客户机 #主机 #镜像 #运行

bin+lib vmtest

帮助您在虚拟机中运行测试

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模拟器

Download history 4/week @ 2024-05-02 208/week @ 2024-05-09 8/week @ 2024-05-16 5/week @ 2024-05-23 12/week @ 2024-05-30 18/week @ 2024-06-06 24/week @ 2024-06-13 12/week @ 2024-06-20 11/week @ 2024-06-27 20/week @ 2024-07-04 10/week @ 2024-07-11 4/week @ 2024-07-18 14/week @ 2024-07-25 13/week @ 2024-08-01 116/week @ 2024-08-08 156/week @ 2024-08-15

每月 299 次下载

Apache-2.0

270KB
1.5K SLoC

vmtest

CI crates.io

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