Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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のススメ

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした