jollen.org

Jollen 的 Blog
Jollen's email: jollen # jollen.org
more:  Jollen's Training

學習 Unikernel 與 Runtime.js (Part 2)-Build Runtime.js VM Image

.作者:jollen/
.日期:February 16, 2016 12:32 PM


Runtime.js 可以讓我們用 Node.js 與 JavaScript 來開發 Unikernel,熟悉 Node.js 是第一個基本功課,Runtime.js 的 OS kernel 採用 V8 JavaScript Engine,目前支援 KVM,研究 Runtime.js 的 kernel 實作,是第二個基本功課...

本文章採用 Markdown 語法撰寫(why?),若無法完整閱讀全文,請點擊這裡

前言

以下步驟參考自 Runtime.js 官網 的說明,目標是初始化一個新的 Runtime.js 專案。請參考 Getting Started 上的環境安裝說明。

要使用 Runtime.js 必須安裝 Node.js 執行環境,以下步驟以 Mac 環境為主,Node.js 的版本為 v4.2.6。

建立 Runtime.js 專案

Runtime.js 仍是一個發展中的開源計畫,目前的發展狀態如下:

  • Hypervisor 部份,目前僅支援 KVM
  • API 部份,目前 Runtime.js 提供的 JavaScript library 非常有限,不過根據應用程式需求,可以自行安裝 Node.js 模組來使用
  • 目前提供 runtimeify 工具來製作 Unikernel image,這是 browserify 的前端(wrapper)命令列工具

即便 Runtime.js 還是處於這麼早期的階段,但實作簡單的 IoT cloud VM image 問題並不大。以下是使用 runtime.js 製作 unikernel image 的準備工作說明。

1. 安裝 QEMU VM

安裝 QEMU VM 做為 Runtime.js 的執行環境。以 Mac 為例,使用 homebrew 安裝 qemu:

$ brew install qemu   

Runtime.js 目前僅支援 KVM。

2. 建立新的 Node.js 專案

使用 npm 建立新的 Node.js 專案:

$ mkdir simple-iot-runtime
$ cd simple-iot-runtime
$ npm init

這次的學習計畫,將不使用 Express。如果要實作 REST API 的話,後續就要實作一個小型的 URL router。

3. 安裝 Runtime.js 模組

安裝 Runtime.js 的 core library:

$ npm install runtimejs --save

4. 安裝 Runtime.js CLI 與 Runtimeify

Runtime.js 提供二個命令列工具(CLI):

  • runtime-cliqemu 的 wrapper,用來啟動 qemu,方便測試 runtime.js VM image
  • runtimeifybrowserify 的 wrapper,用來將 Node.js 的相依模組打包(bundle)成一個檔案
$ sudo npm install runtime-cli -g
$ sudo npm install runtimeify -g

Browserify 原本是用給 frontend 開發使用的工具,讓 frontend 的 JavaScript 程式碼,也能以 require() 的風格引入相依模組。現在被應用於 Runtime.js 專案中。

5. 製作 Unikernel Images

撰寫應用程式 index.js,目前內容僅只是簡單的 console.log(),可參考 jollen/simple-iot-runtime/index.js

使用 runtimeify 將主程式 index.js 打包(bundle)成 initrd 檔案:

$ runtimeify index.js -o initrd

6. 啟動 Unikernel

使用 runtime-cli 啟動製作出來的 initrd

$ runtime start 

2016-02-15 6 58 35

小結

上述步驟得到的 initrd 就是一個 unikernel image。runtime-cliqemu 的 wrapper,測試方式是使用 runtime-cli 啟動 qemu,並載入 initrd 檔案。initrd 是 runtime.js 預設的 unikernel 檔案。

雖然 unikernel 的檔名是 initrd,但這與 GNU/Linux 上的 initrd(init process)是完全不同的實作。Runtime.js 所製作的 initrd,其實就是 browserify 所編譯出來的 JavaScript 應用程式。

這個部份並沒有難度,只是操作層面的練習,熟悉指令就可以很容易上手。從這個練習也可以知道:

  • Runtime.js 可以讓我們用 Node.js 與 JavaScript 來開發 Unikernel,熟悉 Node.js 是第一個基本功課
  • Runtime.js 的 OS kernel 採用 V8 JavaScript Engine,目前支援 KVM,研究 Runtime.js 的 kernel 實作,是第二個基本功課
  • Runtime.js 的 OS kernel 架構與 Exokernel 相似,所以研究 Exokernel 與 Runtime.js kernel 的架構,是第三個功課

延伸閱讀

Reports and Discussion

Tags:

純手工打造說明:技術專欄文章為 Jollen 原創,內容皆為人工撰寫,無 AI 生成。轉載請註明出處與作者,並全文引用。轉載時請在文章開頭或結尾明顯處註明「本文出處:https://www.jollen.org,已取得原作者同意並授權使用。」
訂閱電子報:不定期 Jollen's Blog 精選文章隨 Moko365 電子報寄送;請透過 Moko365 電子報訂閱(可隨時取消)。

Copyright(c) 2001–2016 www.jollen.org. All rights reserved.
Last update: 2026-07-22