Edited at

Linuxのユーザーランドをinitから全てまるごとgolangで書く

gokrazy を試してみました。


gokrazyとは

https://gokrazy.org/

"gokrazy is a pure-Go userland for your Raspberry Pi 3 appliances"

Linuxのユーザーランドをinitから全てまるごとgolangで書いてあるシステムで、しかもコマンド一発でRaspberry Pi 3用にビルドして、ブートするSDカードを作成してくれます。

Quick startの手順通りにSDカードを作って動作することを確認しました。

(ただし、host名gokrazyの解決ができなったので、別の方法でラズパイのIPアドレスを特定してIPアドレス直接指定で、そこで動くWebサーバに接続しました。)


びっくりする小ささ

SDカード上に作られたルートファイルシステムを見てみました。

$ df -h .

Filesystem Size Used Avail Use% Mounted on
/dev/sdc2 11M 11M 0 100% /media/koba/gokrazy1

サイズが11MBしかありません。ファイルシステムはFAT16です。内容にぴったりのサイズでつくるらしく100%の使用率になっています。

$ find .

.
./perm
./gokrazy
./gokrazy/dhcp
./gokrazy/ntp
./gokrazy/init
./cacerts
./dev
./etc
./tmp
./user
./user/hello
./localtim
./gokr-pw.txt
./proc
./sys
./hostname

全ファイルでたったこれだけしかありません。

実体のあるファイルのサイズを見てみると

$ ls -lh `find . -type f`

-r--r--r-- 1 koba koba 228K Oct 11 01:16 ./cacerts
-r--r--r-- 1 koba koba 1.7M Mar 29 07:01 ./gokrazy/dhcp
-r--r--r-- 1 koba koba 5.4M Mar 29 07:01 ./gokrazy/init
-r--r--r-- 1 koba koba 2.0M Mar 29 07:01 ./gokrazy/ntp
-r--r--r-- 1 koba koba 21 Mar 27 08:24 ./gokr-pw.txt
-r--r--r-- 1 koba koba 7 Mar 29 07:01 ./hostname
-r--r--r-- 1 koba koba 292 Feb 2 03:49 ./localtim
-r--r--r-- 1 koba koba 1.2M Mar 29 07:01 ./user/hello

golangで書かれたコマンドの実行ファイルが4つあって、それがサイズの大部分を占めています。

実は最初はgolangの実行ファイルがstripされていない状態だったので、もっとサイズは大きかったのですが、自分で修正してstrip済みにしたサイズです。

その修正はプルリクエストしました。

https://github.com/gokrazy/tools/pull/8


制約


  • libc や busybox のコマンドを含んでいない。sshでログインして対話的に何かをすることはできません。

  • カーネルモジュールを含んでいない。必要なカーネルモジュールはスタティックに組み込んでおくことを想定していると思います。


必要最小限のシステムを理解するのは勉強になる

これを見ると動かしたいgolangの実行ファイルのサイズに10MBを追加するだけでよいことがわかります。組み込みLinuxの人だけでなくて、サーバーサイドの人でgolangのアプリを動かす最小のコンテナを作りたい人も興味を持つのではないでしょうか。

中でどんなことをしているのか非常に興味があるので、おいおい調べてまた書こうと思います。

サイズについては、initとdhcpとntp の3つをひとつのバイナリにまとめてしまえば、さらに小さくできると思います。

--> 書きました。 minimumgo: Linuxでgolangの実行ファイルをひとつだけ動かすときに必要最小限の初期化処理をしてくれるgolangのパッケージ


Go Conference

このネタでGo Conference 2018 Springで話をしました。

そのときの発表資料。

https://www.slideshare.net/tetsu.koba/linuxinitgolang


関連

golangのruntimeからアクセスする/etcのファイル

minimumgo: Linuxでgolangの実行ファイルをひとつだけ動かすときに必要最小限の初期化処理をしてくれるgolangのパッケージ

Golangの実行ファイルを複数まとめてトータルのファイルサイズを減らす工夫(busybox方式)

組み込みLinuxでGolangのススメ