真實系統、效能與前沿

單核映像(unikernel)

/ YOO-nee-kernel /

單核映像(unikernel)是對「如何封裝軟體」的徹底重新思考:你不是把應用程式跑在一套完整的通用作業系統之上,而是把應用程式和它實際所需的那一點作業系統零件,一起編譯成單一、微小、專用的映像,這個映像自行開機並執行。想像兩者的差別:租一間設備齊全的旅館(一套什麼都有、給所有人用的普通作業系統),相對於用 3D 列印出一間單房小屋,裡頭恰好只有你會用的家具、別無其他。小屋更小、瞬間啟動,幾乎沒有可供入侵者攻擊的表面。

它立基於函式庫作業系統(library operating system)的觀念:作業系統服務——網路堆疊、檔案系統、記憶體管理——以普通函式庫的形式提供,由你連結進自己的程式,而非作為你去呼叫的獨立核心。其結果是沒有使用者模式與核心模式之分、也沒有分立的行程,因為只有你那一個應用程式;系統呼叫變成單一映像內的普通函式呼叫。單核映像通常作為客體執行於超管理器之上(虛擬機器提供了普通作業系統會在行程之間提供的隔離),而由於它只含一個應用程式所需的東西,映像可以只有幾 MB、在數毫秒內開機,並呈現極小的攻擊面——這對雲端與隨選啟動的無伺服器函式很有吸引力。

誠實的取捨相當顯著。單核映像通常只執行恰好一個應用程式,無法讓多個程式並列執行,所以不適合作為一般桌面或多使用者系統。由於沒有使用者/核心之分,應用程式的一個錯誤可能毀掉整個映像(隔離來自其外圍的超管理器,而非來自內部)。而且因為熟悉的工具、外殼與行程根本不存在,除錯與營運它們更困難。單核映像是一種前沿的特化——對單一專用的網路服務極為出色,卻不是通用作業系統的替代品。

一家公司跑一個小小的 DNS 伺服器。他們不用一台數百 MB 的完整 Linux 虛擬機器,而是建一個單核映像:DNS 程式加上最精簡的網路堆疊與記憶體管理器,連結成一個 6 MB 的映像,在超管理器上不到 50 毫秒就開機。沒有外殼、沒有其他行程、也沒有別的可攻擊之物——就只有那一個服務。

一個 app 加上它所需的那一點作業系統函式庫,融合成一個微小、可開機的映像。

單核映像不是更小的 Linux。它執行單一應用程式、沒有使用者/核心之分,所以它的隔離完全來自其外圍的超管理器——而一個應用程式錯誤可能毀掉整個映像。

又称
library operating systemlibrary OS函式庫作業系統