返回资讯中心
外部精选
软件工程
#开发者实时流

Hyperlight 支持在隔离微型虚拟机中运行未修改的 Linux 应用

来源标题:Run Linux applications in hypervisor-isolated micro-VMs with Hyperlight

CNCF Sandbox 项目 Hyperlight 现在可以直接运行未修改的 Linux 二进制程序,无需移植或重新编译。它是一个以库形式链接进应用的虚拟机监视器,不依赖独立进程,试图在进程沙箱的毫秒级启动与虚拟机级隔离之间取得平衡。该能力已被 Kubernetes 容器运行时、agent 框架和数据库等集成使用。

Hacker News 最新shscs9112026/11/9 · 今天21 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

发布于2026年11月9日 作者:Danilo Chiarlone,Microsoft

越来越多的云原生系统运行的代码并非团队里任何人所写:可能是AI agent刚刚生成的Python代码,也可能是客户刚上传的插件。这些代码都需要与主机上的其他一切之间划出一道边界。

通常的选择总是顾此失彼。进程沙箱或语言沙箱能在毫秒级启动,但代码与主机之间只隔着一层软件:沙箱里出一个bug,或者它和主机共享的内核里出一个bug,代码就逃出来了。虚拟机把hypervisor挡在中间,但它生来是为了启动一整个操作系统,启动需要时间。CNCF Sandbox项目Hyperlight有助于弥合这一差距。本文介绍它是如何做到的、它在学会运行未经修改的Linux应用(即你今天在Linux上运行的同一批二进制文件,无需移植或重新编译)的过程中发生了哪些变化,以及目前使用它的各个集成方——从Kubernetes容器运行时到agent框架,再到一个数据库。

Hyperlight是一个库形式的虚拟机监视器(VMM)。它不像QEMU或Firecracker那样作为独立进程运行:应用程序将它链接进来。核心用Rust编写,并提供Python和.NET的SDK。应用程序向Hyperlight申请一个沙箱,Hyperlight便创建一个拥有独立内存的micro-VM,由CPU的虚拟化扩展通过主机的hypervisor进行隔离:Linux上是KVM或MSHV,Windows上是WHP,macOS上是Hypervisor.framework。

Hyperlight的micro-VM不携带任何模拟设备,也不带任何它不需要的东西。guest只能通过主机选择暴露的函数来访问主机。沙箱能触及什么基于能力(capability):由嵌入方编写的一份允许列表,不存在需要有人记得去移除的预设权限。

你可能通过hyperlight-wasm和hyperlight-js运行WebAssembly和JavaScript而了解Hyperlight,它们的guest是为Hyperlight专门构建的。本文要讲的是这个家族的最新成员hyperlight-unikraft,它运行未经修改的Linux程序。

hyperlight-unikraft(其CLI为hluk)在micro-VM中运行一个unikernel:一个为单个应用构建的操作系统,只有一个地址空间,只包含该应用所需的内核组件,例如内存分配器、调度器或文件系统。内核来自Linux Foundation项目Unikraft。guest运行的是与Linux相同的二进制文件。没有SDK,没有特殊的libc,也不需要重新编译。

目前hyperlight-unikraft可运行Python、Node.js、.NET(JIT和Native AOT)、Java、PHP、Go、Rust、C、Bash和PowerShell,同时支持x86_64和arm64。

每个运行时都以基础rootfs的形式提供,项目可以用普通的Dockerfile扩展基础rootfs,通过pip、npm或.NET SDK添加软件包。hluk build会把结果转换为guest镜像。有网络访问权限的Python guest还可以按需pip install。

由于guest运行的是普通的Linux二进制文件,它也可以运行另一个沙箱,例如Wasmtime WebAssembly运行时,并在后者失败时将其控制住。在WasmCon 2026的一次演讲中,Hyperlight团队展示了一个针对Wasmtime已修复漏洞(CVE-2023-26489)的利用程序,该漏洞可让WebAssembly代码读取其沙箱之外的内存。直接在主机上运行时,该利用程序从主机进程中读取到了机密信息。而在hyperlight-unikraft内运行时,它只能触及micro-VM自身的内存,主机的机密信息则无法企及。该利用程序与演示已放在GitHub上。hypervisor边界把一次沙箱逃逸变成了一次guest崩溃。

Python、Node.js或.NET程序的启动延迟很少由操作系统造成。它们来自语言运行时在你的代码运行之前所做的工作:导入模块、JIT编译、加载框架。hyperlight-unikraft把这些工作只做一次,在那一刻对micro-VM做快照,然后在毫秒级恢复。对于启动工作繁重的运行时,一个受hypervisor隔离的沙箱比在主机上原生启动同一程序还要更快就绪。

每个运行时镜像都有一个小的驱动,负责启动运行时,然后等待来自主机的调用。当驱动停驻时,运行时已完全启动并处于空闲状态,hluk正是在此时做快照。项目可以添加自己的预热代码(warm_exec = “import flask, pandas”),让快照包含它用到的库。之后的运行会以几毫秒恢复该快照,而不是重新启动。

加速幅度取决于运行时在前期做了多少工作。以下是同一脚本在同一台机器上的中位实际耗时(一台8 vCPU的Azure VM,在嵌套虚拟化下运行KVM,hluk 0.20.1,2026年11月),两边都包含进程启动时间(基准测试工具在GitHub上):

对于hello world,固定开销占主导,micro-VM反而更慢。一旦运行时在你的代码之前做了实际工作,恢复这些工作就胜过重做。有些运行时对此有自己的方案,例如V8的启动快照或Java的CRaC。VM快照则是一种对每个运行时都以相同方式起作用的机制,而且它恢复出的沙箱仍然受hypervisor隔离。由于恢复成本很低,可以从一个快照同时运行多个micro-VM:在同一台机器上,八个micro-VM共享一个Python快照,彼此合计每秒处理约850次调用,每个都在几毫秒内完成恢复。

你可以通过hluk CLI使用hyperlight-unikraft,也可以将其作为Rust库嵌入。沙箱从rootfs或已保存的快照启动,挂载和网络规则需预先声明:

let mut sandbox = SandboxBuilder::from_snapshot_dir(cached)? .mount(Mount::ro("./data", "/mnt/data")) .network(NetworkPolicy::AllowAll) .listen_ports(ListenPorts::from_ports([8080])) .boot()?; // restores in ~3 ms sandbox.run("print(open('/mnt/data/x.csv').read())")?;

默认不授予任何权限:guest没有网络,也看不到任何主机文件,直到嵌入方为其添加相应能力,就像上面的挂载和网络规则那样。

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →