微型虛擬機(microVM)
/ MY-kroh-VEE-EM /
容器很快卻共用主機核心;虛擬機隔離得硬卻很重。微型虛擬機就是對「我們能不能兩者兼得?」的工程回答——一台被刻意精簡到極致的虛擬機,設計成以毫秒級啟動、只用幾 MiB 的額外負擔,於是它感覺輕得像容器,卻保有虛擬機那「獨立核心加超管理器」的邊界。旗艦級的例子是 Amazon 的 Firecracker,它被打造來支撐無伺服器(serverless)平台,那裡有成千上萬個微小、不可信的工作負載,每一個都得獲得強隔離,卻又不能付出一台完整傳統 VM 的代價。
它如何維持小巧:像 Firecracker 這樣的微型 VM 監視器把一台正常 VM 所模擬的幾乎一切都丟掉了。沒有 BIOS、沒有舊式裝置模擬、沒有緩慢的開機路徑——只有一個極簡的裝置模型,通常只有給磁碟與網路用的半虛擬化 virtio 裝置、一個序列主控台、與一個計時器。它直接載入客體核心並跳進去。因為要設定的東西這麼少、要模擬的裝置這麼少,一台微型 VM 能在遠不到一秒內啟動一個 Linux 核心,而監視器本身是一個小巧、記憶體安全的程式(Firecracker 是用 Rust 寫的),攻擊面極小。你仍然得到一個跑在硬體輔助虛擬化下的真客體核心,所以隔離是「VM 等級」的,不是「命名空間等級」的。
這個趨同的中間地帶有兩種值得誠實區分的口味。一種是微型 VM(Firecracker):一台微小的真 VM,有自己的客體核心,由超管理器隔離。另一種是使用者空間核心沙箱,以 gVisor 為代表,它走另一條路:它根本不跑一個獨立的客體核心,而是攔截容器的系統呼叫、在一個使用者空間行程裡把核心的大部分行為重新實作一遍,於是應用程式的呼叫打在 gVisor 的重新實作上、而非直接打在主機核心上——縮小了攻擊者能觸及的真核心有多少。兩者瞄準的是同一個目標——容器般的速度,加上遠勝容器的隔離——而兩者如今都以 OCI 相容的執行時插了進來。誠實的告誡是:兩者都不免費——微型 VM 仍要付一些虛擬化負擔,而 gVisor 的系統呼叫攔截會增加延遲,且並非每一個核心功能都實作得完美無缺。
Firecracker 啟動一台只有 virtio-net 與 virtio-blk、一個序列主控台、與一個計時器的 Linux 微型 VM——沒有 BIOS、沒有要探測的 PCI 匯流排——所以它在約 125 毫秒內啟動、只增加幾 MiB 的負擔,而客體卻擁有自己的、在 KVM 之後的核心。
微型 VM 把一台 VM 精簡到只剩 virtio 裝置與一個計時器——容器般的速度,VM 等級的隔離。
微型 VM(獨立客體核心,例如 Firecracker)與使用者空間核心沙箱(無客體核心,例如 gVisor)是針對同一目標的不同做法,「並非」同一件事。兩者都不免費:虛擬化或系統呼叫攔截的負擔依然存在,而 gVisor 也並未完美涵蓋每一個核心功能。