jollen / blog

Jollen's Blog
http://www.jollen.org/blog
66 stars 4 forks source link

學習 Unikernel 與 runtimejs (Part1) #12

Closed jollen closed 8 years ago

jollen commented 8 years ago

已發佈至 Jollen's Blog


Unikernel 是一個很有趣的概念。不久前 Docker 收購 Unikernel Systems[1] 是很多人對它的第一印象,台灣的新聞媒體將 Unikernel 翻譯為「無核化」或「去核化」;不過,Unikernel 並「不是」要消滅作業系統核心,當然也不是要去除作業系統核心;相反地,作業系統核心技術,將更顯重要。

相較傳統的作業系統核心(conventional OS),Unikernel 的作業系統核心是以「Library」的形式實作 。技術上來說,Unikernel 可以說是一個「Library OS」的概念。

Unikernel 的做法(implementation)是將應用程式(applications)、相關模組(modules)與 library OS 打包(construct)成一個 image 檔。這樣做的目的,是希望將目標系統(target image)儘量簡化;簡化的目的,是縮小 images 的大小(image size)。

根據維基百科上的解釋[2]:

These libraries are then compiled with the application and configuration code to build sealed, fixed-purpose images (unikernels) which run directly on a hypervisor or hardware without an intervening OS such as Linux or Windows.

簡單來說,打包出來的 images 檔就稱為「Unikernel」。這個打包的過程,會將 library OS 編譯到應用程式裡,因此,製作 unikernel image 也需要配套工具。

Unikernel 並不是要去除作業系統。所謂的「無核化」的「核」,更精準的解釋應該是去掉 conventional OS 的「核(kernel)」,改採 library OS 的「核」。

專研作業系統與編譯器的工程師,不但沒有身價眨值的問題,還可能會倍數增值呢。為什麼學習作業系統又更重要了呢?因為 Unikernel image 是一種特定用途的 image file,這種 image file 也稱為 immutable VM image。

Immutable image 裡面的 library OS 讓 unikernel image 能直接(directly)在虛擬機上(hypervisor)運行,而不需要透過像是 Linux 或 Windows 的 conventional OS[2]。實作這個 library OS 需要對作業系統、微處理器、虛擬機、編譯器與 software stacks 有綜合的知識。

Unikernel 是一個 image file,也是一種 immutable image。它的用途單一不變(immutable),Unikernel 的「Uni」正能表達它的理念。Unikernel 自然有許多不同的實作;針對不同的應用程式(applications)甚致是不同的雲端佈署架構,也需要更多單一的 library OS。

受到 jserv 一直在自幹編譯器[3]的激勵,新的一年(2016 猴年)就幫自已定了一道作業:期許在新的一年,也可以自已做一個 Unikernel。不過,因為 Unikernel from scratch 的目標有點遠大,所以:

近幾年一直是 JavaScript 的愛好者,所以找了 runtime.js 做為研究目標。Runtime.js 提供一個稱為 * runtimeify* 的編譯器,可以將 JavaScript 應用程式,打包為 ramdisk image,並透過 initrd 啟動。第一階段的學習紀錄,都會發佈在 jollen/simple-iot-runtime

沒想到 Embedded Linux 也能有這樣的面貌,這是一種有點熟悉又有些陌生的奇妙感覺。隨著 Node.js 的發展,以及 frontend 模組化(JavaScript modules)技術的進步,出現了 Browserify 技術,今天還被運用在 Unikernel 概念上,只能說 JavaScript 無極限。

Runtime.js 是一個開源的 library OS 實作,裡面包含二個 component [4]:

Runtime.js 的 OS kernel 採用 V8 JavaScript engine,整體來看,Runtime.js 提供了一個優雅的 JavaScript Unikernel 技術方案。

[1] Unikernel Systems Joins Docker, https://blog.docker.com/2016/01/unikernel/ [2] Unikernel, https://en.wikipedia.org/wiki/Unikernel [3] 從無到有開發 C 編譯器, https://goo.gl/aqBw9R [4] Runtime.js, https://github.com/runtimejs/runtime [5] https://github.com/jollen/simple-iot-runtime