[筆記] Unikernel原型:Docker映象秒變虛擬機器映象以及無ssh開terminal除錯
阿新 • • 發佈:2018-12-26
現如今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程序。docker
對init
特殊處理了,對於獨立出來,第一反射當然是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