LWN:使用virtme-ng加速内核验证!

AndreaRighi介绍了virtme-ng,一种在虚拟机中加速内核测试的方法,通过virtiofs和overlayfs提升性能,减少引导时间。该工具旨在简化内核开发者的工作流程,特别是在gitbisect测试中。
摘要由CSDN通过智能技术生成

关注了就能看到更多这么棒的文章哦~

Faster kernel testing with virtme-ng

By Jake Edge
November 15, 2023
LPC
ChatGPT translation
https://lwn.net/Articles/951313/

在内核开发中,总是需要构建新内核并引导起来,这个动作耗费了一部分时间。Andrea Righi 在 Canonical 的 Ubuntu 内核团队工作,因此他经常需要做这个动作,而他希望找到一种加快这个过程的方法。为此,他一直在致力于virtme-ng,这是一种在虚拟机中快速引导新内核的方法。他专程来到弗吉尼亚州里士满的2023 Linux Plumbers Conference(LPC),向更多人介绍了这个项目。

他的团队需要为多个架构构建很多内核,通常需要合入一些补丁和 fix 然后进行测试,以确保它们可以正常工作且不引入质量回退。虽然有一个庞大的测试基础设施,但有时开发人员希望更深入地尝试这些内核,例如进行 git bisect 。他的工作通常需要进行大量的构建-重启(build-reboot)循环,因此他的目标是要缩短每一轮这种动作的时间。

d4f6b253582d81b35041fcd8c0fc4213.png

在测试内核时,他通常会在一个干净的环境中进行,因此他会基于一个新的内核映像来重新启动正在使用的系统。这确保了前一次运行没有留下会一些残留影响,从而破坏目前的运行情况,但这也需要时间。总的来说,与用户空间开发中开发人员已经习惯的快速编辑-编译-测试(edit-compile-test)循环相比,内核开发在这方面表现不够快速。

他的目标是弄清楚如何通过 clone 一台自己的开发机到新的机器上,从而运行新内核。他希望测试系统能够访问这个父系统(parent system)的根文件系统;他还需要能够在测试系统中进行更改,却不影响父系统。这样就不需要重新部署就可以马上访问一个系统来运行测试。

在他想到了这个想法之后就开始四处寻找,并遇到了virtme,由 Andy Lutomirski 编写,它完成了他正在寻找的大部分功能。通过创建当前运行系统的活动快照(live snapshot),然后使用新内核启动虚拟机。它通过9p文件系统以只读模式将根文件系统暴露给客户机,并允许在 tmpfs 的 home 目录中进行写操作。

他很高兴能发现 virtme 项目,开始愉快地使用,但它有一些限制,实际上只涵盖了他所需功能的大约 80%。只读的根文件系统意味着无法在测试系统上安装其他软件包,这限制了他可以进行的测试。此外,9p 的性能相当差,例如,在客户机里的内核树中运行 git diff 将花费五分钟的时间。这不仅限制了他的测试范围,还影响了引导时间,启动时间太长了。引导到控制台提示符大约需要 15 秒的时间,他认为这可以改进。

此外,virtme 目前没有得到维护;Lutomirski 没有足够的时间来做这个工作。Righi 和其他人的拉取请求(PR)未被采纳,因此他联系了 Lutomirski,后者鼓励他创建一个分支(fork)。于是 Righi 创建了 virtme-ng,并回顾了 virtme 上的 PR,合并了他喜欢的那些。

此后,他添加了许多不同的功能,首先是使用virtiofs和overlayfs,从而可以对 host 的整个文件系统中进行写时复制导出(copy-on-write export),而不是使用 9p。Virtiofs 需要更多的基础设施,比如在主机上运行 FUSE 守护程序,但它的性能要比 9p 好得多。然后,Overlayfs 允许客户端对文件系统进行写操作,以便可以进行安装软件包等操作却不会影响主机。

另一个相当重要的变化是采用了 QEMU microvm虚拟机类型。当他在推特上发布有关减少启动时间的进展时,有人向他建议使用这个虚拟机类型。Righi 还将 virtme-ng 切换到使用 Rust 编写的自定义 init 脚本,以取代 virtme 使用的 Bash init 脚本。Bash 脚本在维护上并不是什么大问题,但他对学习 Rust 更有兴趣,所以他用这种语言重写了它,这在引导时间上有很大的好处。

仅仅从 9p 切换到 virtiofs 就大大提高了 I/O 速度; git diff 从 284 秒降至仅 1.7 秒。这个操作会导致大量的 I/O,可以在基于 FUSE 的 virtiofs 中高效完成,因为它将结果放入与客户端共享的内存中;而在 9p 中,每个 I/O 操作和结果都是使用 9p 协议的独立消息。此外引导时间从 6.2 秒降至 5.2 秒,这并没有那么引人注目,是因为引导系统过程中的 I/O 要少得多。

在 virtiofs 之上添加 overlayfs 允许客户端访问并写入主机文件系统,而不会进行任何永久更改。它使用 tmpfs 作为上层目录,因此当虚拟机退出时,所做的任何更改都会消失。他遇到了 overlayfs 使用 O_NOATIME 标志导致 virtiofs FUSE 守护程序权限错误的问题,但这个问题现在已经在 virtiofs 上游得到了修复。

microvm 机器类型只是 QEMU 的一个选项,提供了一个专门针对启动时间和内存大小优化的机器。它没有 PCI 或 ACPI,这可以节省用于探测操作的时间。将其纳入这个方案中之后,引导时间从 5.2 秒降至 3.8 秒。这在绝对值上并不算巨大的降低,但如果您使用 virtme-ng 引导很多次不同的内核的话,就会很有帮助了,他说。

使用新的 Rust virtme-ng-init 进一步将引导时间减少到 1.2 秒。这些引导时间是从他键入 vng 以使用新内核启动 VM 开始统计到有可供键入命令的客户端提示符为止的时间。“这相当惊人。”例如,进行 git bisect 操作的时候这可能产生巨大的改进。

Righi 原本在演讲中考虑进行演示,但担心效果不佳,于是制作了一个YouTube视频展示了 virtme-ng 的实际运行,并描述了其中一些展示的内容。在 VM 启动后,您不仅可以在 VM 的 shell 中键入命令,还可以在 vng 命令行运行 VM 中的脚本,例如。 Virtme-ng 设置了标准输入和输出,以便您可以在主机上运行一个命令,通过带有特定内核的 VM,再通过带有不同内核的 VM 等,从而实现一组内核的自动化测试。它还可以用于运行图形应用程序;视频中的最后演示是在 VM 上运行 Steam 客户端,并展示在主机显示屏上,这些游戏完全可以正常运行。

他希望 virtme-ng 可以为内核开发带来快速的编辑-编译-测试周期改进。只有一秒多,这已经很好了,但这其实是在他的笔记本电脑上测量的;而在他更强大的家用服务器上可以进入一秒以内,启动时间为 0.8-0.9 秒。该工具旨在向后兼容 virtme,因此他认为在兼容性方面遇到的任何问题都应该被视为需要修复的错误;他鼓励任何遇到这种问题的人向 GitHub 存储库报告。

Righi 有机会与学生一起工作,他们通常对能够修改和构建自己的内核感到非常兴奋,但在将这些内核部署到 VM 上时遇到了麻烦。当他向他们展示 virtme-ng 时,它确实有助于让他们迅速上手;他认为这个工具可以成为平滑任何新内核开发者道路的一种方式。他还在四月份的OSPM电源管理和调度会议上发表了演讲,讨论了通过使用 virtme-ng 来减少连续集成(CI)系统中重新部署等工作所花费的时间,从而实现“更加节能”的目标。

Righi 说,他的演讲目标是为了提高人们对该工具的认识,以增加用户基础。SUSE 的一些人正在使用该工具,包括测试实时补丁(live patch),一些 Google 开发人员也在使用;一个 Debian 开发人员已经开始打包 virtme-ng,因此它可以在 Ubuntu 和其他基于 Debian 的发行版上使用。现在正在进行为 virtme-ng 提供 RPM 包的工作;有了这个和 Debian 的工作之后,大多数发行版应该很快就会支持该工具。他希望从用户那里收集更多的反馈,因为它基本上已经满足了他现在的需求,但可能还有其他需要支持的一些使用场景。

添加全面的 systemd 支持不是现在的当务之急,但他想为该工具添加全面的 systemd 支持;由于 systemd 在主机系统中具有自己的状态,这可能会导致启动为 guest 启动的 systemd 出现混乱。与当前的 init 脚本相比,基于 systemd 的 VM 启动速度不会很快,但它将带来当前 guest 所不具备的功能。

例如,他想在 guest 中运行 snap 服务器,但它是一个基于 systemd 的守护程序。他有一个方案可以通过欺骗 snap 守护程序使其认为正在运行 systemd 来达到目标,但他想要一个更好的解决方案。snap 模式(通过命令行选项启用)可用并且通常是稳定的,但如果有更好的 systemd 支持,virtme-ng 将完全可以支持 snap 模式和 Flatpak。

一位观众问及是否支持更改 user ID,以便使用 tar 文件中的根文件系统而不是主机文件系统。Righi 表示对于这种用例有一些支持,但 user ID 问题并没有得到完美解决;ID-mapped mounts 是人们提出的更好处理该问题的潜在方案。另一个问题是其他开源项目的采用情况;Righi 表示Mutter正在使用 virtme-ng 进行测试。还有一家不愿透露姓名的公司正在使用该工具测试网络摄像头,这让他感到惊讶,原来这家公司正在使用 QEMU 的选项将 USB 设备从 host 传递到 guest,以测试带有 webcam 的多个内核。

VM 可以与 GDB 一起使用,他回应了另一个问题;您可以设置断点等,还可以在需要时创建 crash dump。另一位与会者问及是否支持签名模块(signed module);Righi 表示正在他的“秘密待办事项清单”中考虑这个问题,因此他很高兴看到这个问题,这样可以激励他更早地研究它。

[I would like to thank LWN's travel sponsor, the Linux Foundation, for assistance with my travel costs to Richmond for LPC.]

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

format,png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值