天天看點

到底什麼是 Unikernel?到底什麼是 Unikernel?

然而,究竟什麼是unikernel? 它是我想要的東西嗎?

我糾結這個問題許久。不知如何定義unikernel以及它存在的意義?

<a></a>

真相的來源僅僅是wikipedia上的一段晦澀的解釋,我們先看看:

unikernel是通過使用專門的庫作業系統來建構的單位址空間機器鏡像。開發者通過選擇棧子產品和一系列最小依賴庫來運作應用,而這些棧和庫對應于作業系統中運作應用所必需的依賴。 這些庫負責應用和配置代碼編譯,建構成封閉的、固定用途的鏡像(即 unikernel)可以直接在虛拟機管理程式hypervisor或硬體上運作,不需要類似linux或windows的作業系統介于其中。

都清楚了,對嗎?

好吧,如果是我,或許以上并沒有說太多。接下來是我對unikernel的解釋。

首先讓我們跟着這裡例子回顧一下。假設你是一個開發者在寫php應用。當你運作你的php(其他ruby、node、perl均類似)應用,你本質上是在運作:

語言解釋器:php、perl、ruby、...

調用作業系統中系統級别的api

其中的一些api調用需要不同級别的權限,強制切換應用程式的上下文...(使用者空間 vs. 核心空間)

所有運作在作業系統上,例如centos、debian、ubuntu、...

或許是運作在vm上,例如vmware、xen、kvm、...

或許是運作在自己的虛拟化管理系統上,例如esxi、xen hypervisor...

依次運作在硬體上

通過bios或uefi來引導

說老實話,如果你在抽象一個應用程式建構所需的所有層次,這會是一個奇迹般的工作。

但是他們做到了。并且做得非常好,有較好的性能。但是你必須認識到,在提供應用運作環境的硬體到應用程式本身存在許多層。

那就是unikernel試圖解決的:删除應用與硬體中間臃腫的部分。讓最“精簡”的作業系統運作你的代碼。

unikernel的願景:當你看到雲用戶端時就像看到單應用硬體一樣。

unikernel試圖抹去現代作業系統帶來的一些複雜性。因為“通用”的作業系統(就像任何linux和windows的發行版),通常會伴随着帶來一些對你的應用來說并不需要的驅動、依賴包、服務、等等,但這些對每一個作業系統來說某種程度上又是必需的。

甚至是在linux核心的核心子產品都并不是需要每一次都完全加載。像usb驅動這類東西在虛拟化的“雲”環境被認為是無用的,但仍然會被包含在核心中。

到底什麼是 Unikernel?到底什麼是 Unikernel?

unikernel對比通用的作業系統例如linux有許多優勢:

安全性的提升:隻運作作業系統的核心,廢棄掉那些可能是幹擾源的視訊和usb驅動。

占用很小空間:想象一下能夠抹去95%核心的大小,因為你的應用不需要那些。

定制的實作:深谙應用并且把核心精簡調整到你想要的部分。

這樣我們非常自然的把unikernel當作是微服務的備選方案。

如果你運作應用之後想要它的開銷是最小的,那你就可能要考慮制作一個unikernel。

unikernel是用進階語言定制的作業系統核心,并且作為獨立的軟體構件。完整的應用(或應用系統)作為一個分布式系統運作在一套unikernels上。 -- queue.acm.org: unikernels: rise of the virtual library operating system

目前最流行的用來寫unikernel的語言是:

<a href="https://www.rust-lang.org/">rust</a>

<a href="https://golang.org/">go (or 'golang')</a>

<a href="https://ocaml.org/">ocaml</a>

<a href="https://www.haskell.org/">haskell</a>

這些并不都是新的程式設計語言。除了go和rust,其他均有超過15年的曆史。

為了使作業系統和應用運作得更加流暢,這些unikernel庫需要使用核心部分盡可能小。

現在,由于虛拟化技術,像xen或vmware這類虛機管理系統(注*:原operating system)把異構的硬體裝置抽象成一堆标準的虛拟化裝置,unikernel也能為定制的虛拟裝置而優化。

unikernel利用虛拟化的優勢創造出一種專屬的經過優化的作業系統。

想要編譯應用程式的“unikernel”,需要依賴mirageos的庫和ocaml語言,結果像這樣:

編譯器輸出一個完全獨立的核心取代unix可執行檔案。這些unikernels是隻為滿足特定的應用程式和配置檔案而實作的庫作業系統vm,并且會依賴hypervisor提供的資源複用和隔離。

最終你通過運作一個unikernel,精簡專屬的作業系統,來運作你應用程式的一部分。如果你的應用和配置需要更新,你需要重新編譯你的源碼來生成新的unikernel并部署新版本。如果是新的安全更新?也同樣需要重新編譯和部署。

這将使部署的協調和編排更加困難,但好處是運作應用程式更加高效。

建構不可變的基礎設施架構的關鍵在于:應用程式不再儲存狀态,并且能友善地丢棄和重新建構。

實話實說,這個問題的答案對我來說還并不明确。我認為說如果你現在是要在wordpress上部署web應用,使用unikernel也許還有一定的鴻溝。

另一方面,unikernel的好處是明顯的,但需要一個完全不同的模式來管理你的基礎設施,一組不同的技能來建構這類的應用和核心并且需要深谙目前對我們來說還完全陌生的一個概念:不可變的基礎設施架構。

也許在今後的5至10年,我們會以新的規範一樣來部署unikernel。目前,我認為它針對一小部分想要相當專業和安全應用的使用者。對于大多數普通使用者,虛機(或是,如果你走在技術前沿一定會明白:docker容器)或許才是你應該專注的。

本文來自雲栖社群合作夥伴“linux中國”

原文釋出時間為:2013-04-02.