2024 年 3 月 4 日,作者分享了在 OpenZFS 开发中使用微虚拟机(microVM)的经验。
- 编程风格与 OpenZFS 开发需求:作者偏好高度交互和探索性的编程风格,需要快速的编辑-编译-测试周期。一年前开始从事 OpenZFS 开发,其为大量内核代码,需在真实硬件或虚拟机上开发,容易导致内核崩溃等问题,因此渴望能像开发其他程序一样工作,即快速修改、编译、运行并查看结果,于是开始研究微虚拟机。
微虚拟机相关内容:
- 微机器:需快速启动和停止的虚拟机,QEMU 的“微虚拟机”机器类型可满足,它省略了一些常规设备,减少启动时的初始化工作。还需要自定义内核,只包含已知硬件的支持,将所需内容编译到内核二进制文件中,保留模块支持以便后期加载 OpenZFS 模块,同时保持设备简单,如 CPU、内存、控制台和存储等。quiz 附带的
quiz-prepare-kernel
程序可负责下载、构建和准备内核。 - 大量文件:虽不需要 initrd,但仍需在虚拟机内有文件来运行程序,利用 Linux 的文件系统叠加功能,通过“层”构建完整的文件系统。底层是不可变的基本 Unix 系统组件,使用
mmdebstrap
创建,中间层是主机目录中的普通文件,通过9pfs
共享暴露给虚拟机,顶部是 ramdisk 用于存储修改后的文件,init1
脚本组装这些部分。 - 构建块:在最简单模式下,虚拟机进入 shell ,
init2
脚本进行基本设置并运行用户请求的程序或bash
,“配置文件”可进一步扩展,如zfs
配置文件确保 OpenZFS 准备好,memdev
配置文件创建内存块设备。 - 更改系统:理论上通过将
system
共享作为替代安装前缀来构建 OpenZFS,但实际上存在一些交叉编译的问题,需调整configure
和make install
,有辅助脚本quiz-build-zfs
来处理。
- 微机器:需快速启动和停止的虚拟机,QEMU 的“微虚拟机”机器类型可满足,它省略了一些常规设备,减少启动时的初始化工作。还需要自定义内核,只包含已知硬件的支持,将所需内容编译到内核二进制文件中,保留模块支持以便后期加载 OpenZFS 模块,同时保持设备简单,如 CPU、内存、控制台和存储等。quiz 附带的
- 完整开发流程:启动 quiz 环境后,OpenZFS 开发流程包括
autogen.sh
、quiz-build-zfs configure
、make
、make install
以及创建存储池等步骤。作者还有多架构版本和 FreeBSD 相关的计划。 - 尝试与反馈:如果在 Linux 上进行 OpenZFS 或内核开发,quiz 可能很有用,可从作者的 Github 获取,欢迎分享使用经验和建议,若喜欢可考虑赞助。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。