LinuxKit 中的 crosvm 集成:用 Rust 轻量级 VMM 运行精简容器操作系统的构建与使用指南
操作系统云原生容器运行时【免费下载链接】linuxkitA toolkit for building secure, portable and lean operating systems for containers项目地址https://gitcode.com/gh_mirrors/li/linuxkit点击查看免费下载本文以 LinuxKit 仓库中的 contrib/crosvm/README.md 为核心系统讲解如何把 Chrome OS 的 crosvm 虚拟机监视器VMM编译出来并用它直接启动一个 LinuxKit 构建的精简操作系统镜像。读完本文你将掌握 crosvm 及其依赖 libminijail 的完整构建流程、kernelsquashfs镜像格式的构建要点以及crosvm run的启动参数与已知问题的规避方法。crosvm 是什么crosvmChrome OS Virtual Machine Monitor是一个用 Rust 编写的轻量级 VMM运行在 Linux 内核的 KVM 之上。与 QEMU 这类功能全面的模拟器不同crosvm 的设计目标非常克制只做刚好够用的设备模拟把性能和安全放在首位。它的一个突出特点是设备模型可选独立进程化各设备模拟器可以运行在相互隔离的进程中并辅以 seccomp 策略进行系统调用过滤。这样即使某个设备模拟代码被攻破攻击面也被限制在该进程的 seccomp 白名单之内不会直接危及整个虚拟机监视器进程或宿主系统。这也是 LinuxKit 选择将其纳入 contrib/crosvm 目录的原因——LinuxKit 本身的目标就是构建安全、精简的容器操作系统crosvm 的小而安全理念与之高度契合。说明contrib 目录下的内容是社区贡献的集成方案作为 LinuxKit 的可选能力存在并非默认构建路径的一部分。构建 crosvm 与 libminijail构建产物与所需依赖按官方构建流程最终你会得到三个产物crosvm可执行文件Rust 编译产物libminijail.so动态库crosvm 的沙箱依赖由 Google 的 minijail 项目编译而来seccomp目录内含各设备模型进程使用的 seccomp 策略文件。产物统一落在./build目录中见 contrib/crosvm/Makefile。构建完成后需要把libminijail.so复制到/usr/lib或其他ldd能搜索到的库路径否则运行时无法加载。此外还可能用到libcapcrosvm 依赖的 capabilities 库在 Ubuntu 或 Debian 上可通过apt-get install -y libcap-dev安装。另外某些运行场景还需要手动创建一个空目录/var/empty。一条 make 命令完成编译contrib/crosvm/Makefile 将整个编译过程封装为 Docker 镜像构建 产物解包两步make该 Makefile 定义了两个目标iid基于 contrib/crosvm/Dockerfile 执行docker build --no-cache --iidfile iid .把镜像 ID 写入iid文件extract执行docker run --rm $(shell cat iid) | tar xf - -C ./build即运行镜像并把其标准输出中的 tar 流解包到./build。也就是说make会先构建镜像再把镜像内编译好的二进制以 tar 流方式导出到宿主机./build目录。Dockerfile 的构建细节contrib/crosvm/Dockerfile 以rust:1.30.0-stretch为构建环境并通过环境变量固定上游源码版本保证构建可复现CROSVM_REPO/CROSVM_COMMITcrosvm 源码仓库与提交哈希MINIJAIL_REPO/MINIJAIL_COMMITminijail 源码仓库与提交哈希。构建步骤依次为安装libcap-dev与libfdt-dev依赖 → 拉取并检出 minijail →make编译 minijail 并把libminijail.so、libminijail.h装入/usr/lib与/usr/include→ 在 crosvm 目录执行cargo build --release→ 将libminijail.so、crosvm、seccomp目录汇总到/out。镜像的ENTRYPOINT是tar cf - libminijail.so crosvm seccomp这正是 Makefile 中docker run能直接输出 tar 流的原因。Dockerfile 中固定的提交哈希是当时验证过的版本组合如果你需要构建更新的 crosvm可自行修改这两个ENV值后重新make。用 LinuxKit 构建适合 crosvm 的镜像crosvm 只负责运行虚拟机操作系统镜像本身仍由 LinuxKit 构建。关键在于选择合适的镜像输出格式。为什么选择 kernelsquashfsREADME 明确推荐使用kernelsquashfs格式。从 LinuxKit 构建器源码 src/cmd/linuxkit/moby/build/output.go 可以看到该格式会调用outputKernelSquashFS内核被单独导出为一个文件根文件系统则打包为 squashfs 镜像。这种内核与根文件系统分离的形态正好匹配 crosvm 的启动方式——crosvm 需要直接加载内核文件并把根文件系统作为块设备挂载而不支持 QEMU 常用的 initrd 打包方式。构建命令与 -decompress-kernel 开关以 examples/minimal.yml 为配置模板linuxkit build -format kernelsquashfs -decompress-kernel minimal.yml构建完成后会在当前目录得到minimal-kernel解压后的 vmlinux 格式内核与minimal-squashfs.img两个产物。-decompress-kernel开关是关键LinuxKit 默认产出的内核镜像是压缩过的bzImage 之类而crosvm 无法解析压缩的内核镜像只接受未压缩的 vmlinux。README 中把这一需求描述为-vmlinux switch在当前仓库中对应的实际实现就是build子命令的--decompress-kernel标志见 src/cmd/linuxkit/build.go。该标志会进入BuildOpts.DecompressKernel字段src/cmd/linuxkit/moby/build/opts.go随后在内核过滤阶段生效把内核解压为 vmlinux 再写入产物。关于minimal.yml需要特别提醒该模板当前包含onboot阶段的dhcpcd服务examples/minimal.yml但 README 的已知问题部分明确指出网络在 crosvm 下尚不可用不应在onboot中配置 DHCP 类服务。实际使用时请根据你的 crosvm 版本与内核版本酌情精简该模板。启动 crosvm 虚拟机产物就绪后用下面的命令启动crosvm run --disable-sandbox \ --root ./minimal-squashfs.img \ --mem 2048 \ --socket ./linuxkit-socket \ minimal-kernel各参数含义如下minimal-kernel位置参数指定 vmlinux 内核文件路径--root ./minimal-squashfs.img指定根文件系统镜像crosvm 会把它作为虚拟块设备挂载为根分区--mem 2048给虚拟机分配 2048 MiB 内存--socket ./linuxkit-socket指定控制套接字路径用于外部与运行中的 crosvm 实例通信--disable-sandbox关闭 crosvm 自身的沙箱机制。README 中的示例显式带上了该参数说明在 LinuxKit 集成场景下默认先以非沙箱方式运行如果希望启用 seccomp 隔离则去掉该参数并确保seccomp目录与libminijail.so已被正确部署。已知问题与规避方案README 记录了一批实测中遇到的问题按其描述这些现象是在当时测试的 4.x 内核与对应 crosvm 版本上观察到的当前仓库内核目录已演进到 kernel/6.6.x、kernel/6.12.x 等较新版本使用时需结合自己的内核与 crosvm 版本逐一验证内核 BUG_ON在 4.14.x 内核上会命中drivers/base/driver.c中的BUG_ON()而 4.9.x 内核当时测试可用。如果你的内核触发该问题应优先尝试更换内核版本README 的原始验证结论。无交互式控制台在较新的 crosvm 版本上作者未能获得交互式控制台即getty登录界面可能不可用。这会影响services阶段的交互式排障。网络不可用crosvm 下的网络支持当时尚未打通因此不要包含onboot阶段的dhcpd或类似 DHCP 客户端服务否则启动会卡在等待网络就绪。poweroff 不工作ACPI 缺失crosvm 当时不支持 ACPI虚拟机内执行poweroff无法触发关机。正确的停止方式是通过控制套接字发出 stop 指令./crosvm stop ./linuxkit-socket该命令要求启动时通过--socket指定了套接字路径。arm64 支持不完整crosvm及其依赖在arm64上可以编译通过但作者实测时 crosvm 缺少设置 IRQ chip 的能力报错为failed to create in-kernel IRQ chip: CreateGICFailure(Error(19))。这意味着当时在测试的 arm64 平台上无法真正运行虚拟机如需在 arm64 上使用建议先确认你所用的 crosvm 版本是否已修复 GIC 支持。小结与进一步探索crosvm 为 LinuxKit 提供了一条极简 VMM 极简 OS的轻量虚拟化路径make编译出 crosvm 与 libminijaillinuxkit build -format kernelsquashfs -decompress-kernel产出 vmlinux 与 squashfs 根文件系统最后crosvm run直接拉起虚拟机。整个流程产物精简、可复现性强尤其适合安全敏感或资源受限的场景。若希望深入可在当前仓库中继续阅读contrib/crosvm/Dockerfile版本固定的完整编译环境contrib/crosvm/Makefile镜像构建与产物解包流程examples/minimal.yml可用于 crosvm 的最小化 LinuxKit 配置src/cmd/linuxkit/build.golinuxkit build的全部命令行选项包括-decompress-kernel、-format、-size等src/cmd/linuxkit/moby/build/output.gokernelsquashfs、kernelerofs、kerneliso等内核分离格式的输出实现可作为选择其他轻量格式的参考。赞分享操作系统云原生容器运行时【免费下载链接】linuxkitA toolkit for building secure, portable and lean operating systems for containers项目地址https://gitcode.com/gh_mirrors/li/linuxkit点击查看免费下载相关推荐Code App项目构建与部署从源码到App Store的完整流程Code App项目构建与部署从源码到App Store的完整流程 Code App是一款专为iPad设计的完整代码编辑器它为开发者提供了桌面级的编程体验。开发工具LinuxKit 在 Scaleway 上的实战指南构建、推送与运行容器化操作系统镜像LinuxKit 在 Scaleway 上的实战指南构建、推送与运行容器化操作系统镜像 本指南基于 LinuxKit 仓库的 docs/platform sc操作系统云原生容器运行时5分钟免费还原Windows经典界面ExplorerPatcher终极配置指南5分钟免费还原Windows经典界面ExplorerPatcher终极配置指南 还在为Windows 11的现代化界面感到不适应吗ExplorerPatch桌面应用系统编程上一篇海尔智能家居接入HomeAssistant5分钟实现全屋设备统一控制终极指南下一篇Android Boilerplate依赖注入实战Dagger 2配置与使用完全教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考