1. 程式人生 > >[筆記] Unikernel原型:Docker映象秒變虛擬機器映象以及無ssh開terminal除錯

[筆記] Unikernel原型:Docker映象秒變虛擬機器映象以及無ssh開terminal除錯

現如今docker run各種流行,可是虛擬機器並沒有消退。有沒有辦法把映象部署成一個虛擬機器來個暫時的轉換呢?有沒有好辦法在沒有ssh的container上可以開個terminal進行除錯呢?
其實很簡單,docker save就可以把整個映象裡的檔案dump出來。
我們用dd建立一個磁碟檔案,把dump出來的檔案塞進去就完成了基本的轉化工作。
因為docker是執行container的,所以接的是系統自己的kernel;要想讓它獨立執行起來,幫它把kernel補上就好了。
下載Linux kernel核心,make menuconfig配置一下,然後編譯出來一個kernel。將kernel放到dd

的磁碟檔案裡/boot
這樣其實就可以了嗎?差不多了,但是缺少一個init程式,就是pid=0程序。dockerinit特殊處理了,對於獨立出來,第一反射當然是busybox。下載並使用static編譯得到一個程式,放入/bin並連結到/sbin/init
這樣系統就做好了,下面在Linux下直接用grub-install的命令對磁碟檔案進行grub的安裝,一旦完成,磁碟檔案就可以直接拉去qemu上運行了。
執行的時候在grub裡linux /boot/vmlinuz root=/dev/sda boot。當然,最好配置下自動載入kernel,這樣就不用手動啟動了。
後面這個過程就是重複勞動了,為了讓它有網路,得在/etc/init.d/rcS
裡寫點命令,比如使用busybox的dhcp client功能動態得到一個ip,比如mount一些重要檔案系統/sys /proc /var/run /tmp /dev/pts
最後就是將Dockerfile裡的命令放到rcS裡,一切就緒。

至於沒有ssh的container或者虛擬機器系統,想要除錯也不難,gotty很經典。只是go的static link編譯不是特別熟,就找了個它的近親ttyd,靜態編譯了一下,去除各種依賴。在rcS裡並行執行ttyd >/dev/null 2>&1 &,這樣就可以暴露一個http埠,用瀏覽器就能啟動一個terminal。接下去你懂的。

J.Y.Liu
2018.03.29