Nanvix 开源轻量沙箱:Micro-VM 加多内核 OS 设计
Nanvix – Lightweight Sandbox
Nanvix 开源了一套用于运行不可信应用的沙箱实现,通过只暴露虚拟处理器和内存的 Micro-VM 提供硬件隔离,并用 guest 侧 Microkernel 与 host 侧 Macro-Kernel 组成的多内核 OS 灵活放置系统组件。
Nanvix 是一种沙箱技术,用于在硬件隔离环境中以极低开销运行不受信任的应用程序。
注意:本仓库包含该沙箱的实现。如果你想使用 Nanvix,请参阅 nanvix-python,这是 Nanvix 的 Python 发行版。
概述
Nanvix 采用独特的协同设计架构,融合了两项关键创新:
-
一个专门构建的 Micro-VM,以极低开销提供硬件强制隔离。该 Micro-VM 设计得尽可能轻量,仅向客户机暴露虚拟处理器和内存,并剥离了所有设备仿真及其他会增加延迟的功能。
-
一个多内核操作系统,支持灵活的系统组件放置与共享。该设计将操作系统拆分到两个内核:运行在 Micro-VM 内的客户机侧微内核,提供必要的操作系统功能;以及运行在宿主平台上的宿主侧宏内核,提供网络和存储软件交换机。系统组件作为特殊进程运行在任一内核之上,具体取决于部署配置。
在我们的论文中阅读更多关于此架构的内容:Nanvix:面向高密度无服务器部署的多内核操作系统设计。
┌─────────────────────────────────────┐
│ Micro-VM │ Microkernel on Micro-VM runs:
│ Microkernel │ • The untrusted application.
│ │ • Essential system services (scheduler, etc.).
│ ┌─────────────┐ ┌──────────────┐ │ • Optional in-guest components (e.g. filesystem).
│ │ Application │ │ Filesystem │ │
│ └─────────────┘ └──────────────┘ │
└──────────────────┬──────────────────┘
│ selected I/O
│ (e.g. network)
▼
┌─────────────────────────────────────┐
│ Macro-Kernel │ Macro-Kernel on host platform runs:
│ (host OS) │ • Network software switch.
│ │ • Storage software switch.
│ ┌──────────────┐ │ • Host-side system components (e.g. network stack).
│ │ Network │ │
│ └──────────────┘ │
└─────────────────────────────────────┘
主要特性
- 轻量级虚拟机:以极低开销实现硬件隔离——无设备仿真,仅提供虚拟处理器和内存。
- 自定义客户机微内核:一个薄内核,暴露丰富的功能集和 POSIX API,以支持广泛的应用(参见我们的软件目录)。
- 灵活的系统组件放置:文件系统和网络协议栈等组件既可以运行在客户机侧,也可以运行在宿主侧。
- 跨平台支持:可运行在 Linux 和 Windows 宿主上。
- 快速启动时间:应用程序启动在数十毫秒范围内,适用于无服务器和智能体工作负载。
- 低内存占用:每个 Micro-VM 的内存消耗为数十兆字节,对资源受限环境和高密度部署友好。
快速对比
| 特性 | Nanvix | Unikraft | Firecracker | gVisor | Docker | WebAssembly |
|---|---|---|---|---|---|---|
| 灵活组件放置 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| 多客户机进程 | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ |
| 硬件隔离 | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
| 启动时间 | ~30ms | ~320ms | ~70ms | ~160ms | ~1s | ~1ms |
| 内存占用 | ~10MB | ~10MB | 10–100MB | 10–50MB | ~100MB | ~1MB |
| 部署密度 | ~10k | ~1k | ~1k | ~1k | ~100 | ~10k |
| 完整 Linux 兼容性 | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ |
启动时间是服务首个 HTTP echo 请求的 p50 延迟;内存占用是同一工作负载下每实例对宿主内存的贡献,通过
MemAvailable在/proc/meminfo中测量。Nanvix 和 Firecracker 使用快照恢复(生产无服务器配置);Unikraft 和 gVisor 使用冷启动(无可用生产快照路径)。范围涵盖冷启动和快照恢复变体(如适用)。Docker 和 WebAssembly 为近似社区值。有关方法的更多信息,请参见 arXiv:2604.11669。
权衡
- Linux 兼容性:Nanvix 提供包含 150 多个系统调用的 POSIX API,但它并非与所有 Linux 应用程序完全兼容,运行某些应用程序可能需要一些修改。
- 不断壮大的软件生态系统:可运行应用程序的目录正在不断增长,因此引入新工作负载通常需要针对 Nanvix 工具链进行移植和交叉编译。请参阅目录以获取已移植应用程序的列表。
快速开始
Linux
需要 Ubuntu 24.04,具有 sudo 权限并启用 KVM。
# Run on Bash. # Clone this source code. git clone https://github.com/nanvix/nanvix.git && cd nanvix # Setup the development environment. ./z setup # Build Nanvix. ./z build -- all # Run an example application. ./bin/nanvixd.elf -console-file /dev/stdout -- ./bin/hello-rust-nostd.elf
Windows
需要 Windows 11,PATH 中包含 GNU Make,启用 Windows Hypervisor Platform,打开开发者模式,并通过 rustup 安装 Rust 工具链。
# Run on PowerShell. # Clone this source code (symlinks require Developer Mode). git clone -c core.symlinks=true https://github.com/nanvix/nanvix.git; cd nanvix # Setup the development environment. .\z.ps1 setup # Build Nanvix. .\z.ps1 build -- all # Run an example application. .\bin\uservm.exe -kernel .\bin\kernel.elf -initrd .\bin\hello-rust-nostd.elf -standalone
文档
- doc/setup.md - 设置开发环境的说明。
- doc/build.md - 构建 Nanvix 的说明。
- doc/run.md - 运行 Nanvix 的说明。
- doc/test.md - 测试 Nanvix 的说明。
- doc/benchmark.md - 对 Nanvix 进行基准测试的说明。
使用声明
本项目是一个原型。因此,我们不保证其能够正常工作,您使用该代码需自行承担任何风险。我们欢迎评论和反馈。请将任何问题或评论发送给以下项目维护者:
发送反馈即表示您同意其可用于本项目的进一步开发。
许可证
本项目在 MIT 许可证下分发。
来源:Hacker News · github.com