SlideShare a Scribd company logo
1
Linux のユーザーランドを
init から全てまるごと
Golang で書く
Tetsuyuki Kobayashi
2018.4.15 Go Conference 2018 Spring
2
 The latest version of this slide will
be available from here
 http://www.slideshare.net/tetsu.koba/presentati
ons
3
Who am I?
 20+ years involved in embedded systems
 10 years in real time OS, such as iTRON
 10 years in embedded Java Virtual Machine
 Now GCC, Linux, QEMU, Android, …
 Blogs
 https://qiita.com/tetsu_koba
 http://d.hatena.ne.jp/embedded/
 http://kobablog.wordpress.com/(English)
 Twitter
 @tetsu_koba
はじめに
 golang の実行ファイルは自己完結的
 基本ライブラリ (libc に相当するもの )
は自前で持っている
 インストールするときに依存性が少ない
 後、何を追加したら、 Linux
カーネルと golang の実行ファ
イルだけで動かせる?
最小構成を理解するのは
エンジニアリングの基本
 削って削って、残ったものが本質。
 本日の「最小限」の定義
 ホスト名を解決してネットワークに
アクセスできること
 TLS( 暗号化通信 ) はオプション
 現在時刻を UTC で扱えること
 タイムゾーンはオプション
本日話すること
 gokrazy の紹介
 docker での最小限のコンテナの
実験
 最小限のルートファイルシステム
 miminumgo: 最小限の初期化処理
をする go パッケージ
Gokrazy の紹介
Gokrazy とは
 https://gokrazy.org/
 golang だけで Linux のユーザーランドを
構築してくれる
 ラズパイ 3 用のマイクロ SD カードを作成
 init, dhcp, ntp とユーザーのプロセスが実
行される
 WebUI でプロセスの状態が見られる
Gokrazy 動作中のルートファイ
ルシステム
/dev (mount devtmpfs)
/dev/pts (mount devpts)
/etc/hosts (auto generated)
/etc/localtime
/etc/resolv.conf -> /proc/net/pnp
/etc/ssl/ca-bundle.pem
/gokrazy/dhcp
/gokrazy/init
/gokrazy/ntp
/proc (mount proc)
/sys (mount sysfs)
/tmp (mount tmpfs)
/user/hello
Gokrazy の制限
 sh など通常のコマンドは含んでいない
 参考 gobox
 カーネルモジュールをロードするしくみ
は無い
 必要なモジュールはあらかじめカーネル
にビルトインしておく
 デバイスの抜き差しは扱わない
docker での
最小限のコンテナの実験
docker で busybox 一個のファ
イルを動かしてみた
 docker では実マシンでの初期
化処理を自動で行ってくれる
 具体的にそれが何かを実験で調べ
てみた。
 dockerでbusybox一個だけのファイルを含むイメージを作って動かしたらどうなるか
docker が自動生成したファイル
/dev (mount devtmpfs)
/dev/pts (mount devpts)
/etc/hostname
/etc/hosts
/etc/mtab -> /proc/mounts
/etc/resolv.conf
/proc (mount proc)
/sys (mount sysfs)
最小限のルートファイルシステム
最小限のルートファイルシステム
/dev (mount devtmpfs)
/dev/pts (mount devpts)
/etc/hosts (auto generated)
/etc/resolv.conf -> /proc/net/pnp
/proc (mount proc)
/sys (mount sysfs)
/tmp (mount tmpfs)
/etc/hostname が無い場合のデフォルトの hostname は IP アドレスの ASCII 表現
時刻に関して
 最小限では UTC のみが扱える
 ローカルタイムを扱うには /etc/localtime
を追加
 その他のタイムゾーンを扱うには
 /usr/share/zoneinfo/ 以下のファイルが
必要
 または、 runtime.GOROOT 以下に
/lib/time/zoneinfo.zip を置く
TLS( 暗号化通信 ) に関して
 最小限では TLS は扱えない
 /etc/ssl/certs/ 以下のファイルが必要
 ルート証明書だけでも
 /etc/ssl/certs/ca-certificates.crt
minimumgo: 最小限の初期化処理を
してくれる go パッケージ
minimumgo
 最小限の初期化処理をしてくれる
go パッケージを自作した
 ブランク (_) import するだけ
 その golang の実行ファイルを init
として動かせる
 設定はカーネルパラメータで
 ntp サーバの指定
使用例
package main
import (
"log"
"net/http"
)
func main() {
log.Fatal(http.ListenAndServe(":80",
http.FileServer(http.Dir("/"))))
}
この golang のプログラムを一個だけ動かしたい場合
使用例
package main
// This should be imported at first
import _ "github.com/tetsu-koba/minimumgo"
import (
"log"
"net/http"
)
func main() {
log.Fatal(http.ListenAndServe(":80",
http.FileServer(http.Dir("/"))))
}
minimumgo パッケージを import するだけで、
これを init として動かせる。
minimumgo
 https://github.com/tetsu-koba/minimumgo
 example に ラズパイ用にビルドして
initramfs のイメージを作成して動かす
方法を書きました
最後に
 本セッションの観察や実験を通して、 Linux の
起動時に行っていることが明らかに。
 「 Linux のユーザーランドを golang で init から
まるごと全部書く」 -> 達成。
 minimumgo パッケージは実験用。
 ブラックボックスとして使うのでなくてソー
スコードを参考にしてください。

References
 gokrazy
 Linuxのユーザーランドをinitから全てまるごと
golangで書く
 dockerでbusybox一個だけのファイルを
含むイメージを作って動かしたらどうなるか
 dockerでgolangの実行ファイル1個だけを
含むイメージを作って動かす
 https://github.com/tetsu-koba/minimumgo

25
Q & A
@tetsu_koba
Thank you for listening!

More Related Content

What's hot (20)

PDF
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
Preferred Networks
 
PDF
Kubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-cluster
Preferred Networks
 
PDF
レシピの作り方入門
Nobuhiro Iwamatsu
 
PDF
Xenとzfsで作る家庭内VDIサーバ
zgock
 
PDF
Kubernetesによる機械学習基盤への挑戦
Preferred Networks
 
PDF
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
Kohei Tokunaga
 
PDF
Android起動周りのノウハウ
chancelab
 
PDF
Dockerセキュリティ: 今すぐ役に立つテクニックから,次世代技術まで
Akihiro Suda
 
PDF
BuildKitの概要と最近の機能
Kohei Tokunaga
 
PDF
大規模DCのネットワークデザイン
Masayuki Kobayashi
 
PPTX
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda
 
PPTX
Linuxのsemaphoreとmutexを見る 
wata2ki
 
PDF
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
Preferred Networks
 
PDF
Meet cute-between-ebpf-and-tracing
Viller Hsiao
 
PDF
Wireguard 実践入門
Kazuhiro Nishiyama
 
PDF
ARM Trusted FirmwareのBL31を単体で使う!
Mr. Vengineer
 
PDF
Linux女子部 firewalld徹底入門!
Etsuji Nakai
 
PPTX
3GPP TS 38.300-100まとめ
Tetsuya Hasegawa
 
PDF
【Redmine】ツールバーボタンを作ろう
Kohei Nakamura
 
PDF
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Masahito Zembutsu
 
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
Preferred Networks
 
Kubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-cluster
Preferred Networks
 
レシピの作り方入門
Nobuhiro Iwamatsu
 
Xenとzfsで作る家庭内VDIサーバ
zgock
 
Kubernetesによる機械学習基盤への挑戦
Preferred Networks
 
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
Kohei Tokunaga
 
Android起動周りのノウハウ
chancelab
 
Dockerセキュリティ: 今すぐ役に立つテクニックから,次世代技術まで
Akihiro Suda
 
BuildKitの概要と最近の機能
Kohei Tokunaga
 
大規模DCのネットワークデザイン
Masayuki Kobayashi
 
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda
 
Linuxのsemaphoreとmutexを見る 
wata2ki
 
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
Preferred Networks
 
Meet cute-between-ebpf-and-tracing
Viller Hsiao
 
Wireguard 実践入門
Kazuhiro Nishiyama
 
ARM Trusted FirmwareのBL31を単体で使う!
Mr. Vengineer
 
Linux女子部 firewalld徹底入門!
Etsuji Nakai
 
3GPP TS 38.300-100まとめ
Tetsuya Hasegawa
 
【Redmine】ツールバーボタンを作ろう
Kohei Nakamura
 
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Masahito Zembutsu
 

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

PDF
コンテナ情報交換会2
Masahide Yamamoto
 
PPTX
第一回コンテナ情報交換会@関西
Masahide Yamamoto
 
PDF
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Masahiro Nagano
 
PPTX
CAMPHOR- day 2020 - Docker 超入門
KokiMakita1
 
PPTX
KubeCon EU報告(ランタイム関連,イメージ関連)
Akihiro Suda
 
PDF
スタート低レイヤー #0
Kiwamu Okabe
 
PPTX
ラズパイ2で動く Docker PaaSを作ってみたよ
npsg
 
PDF
Windows subsystem for linuxで始める組み込みlinux ラズパイ3のブートイメージを作ってみる-
Toyohiko Komatsu
 
PDF
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Yuichi Ito
 
PDF
initramfsについて
Kazuhiro Nishiyama
 
PDF
Webアプリケーション開発者のためのDockerハンズオン20210519
虎の穴 開発室
 
コンテナ情報交換会2
Masahide Yamamoto
 
第一回コンテナ情報交換会@関西
Masahide Yamamoto
 
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Masahiro Nagano
 
CAMPHOR- day 2020 - Docker 超入門
KokiMakita1
 
KubeCon EU報告(ランタイム関連,イメージ関連)
Akihiro Suda
 
スタート低レイヤー #0
Kiwamu Okabe
 
ラズパイ2で動く Docker PaaSを作ってみたよ
npsg
 
Windows subsystem for linuxで始める組み込みlinux ラズパイ3のブートイメージを作ってみる-
Toyohiko Komatsu
 
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Yuichi Ito
 
initramfsについて
Kazuhiro Nishiyama
 
Webアプリケーション開発者のためのDockerハンズオン20210519
虎の穴 開発室
 
Ad

More from Tetsuyuki Kobayashi (20)

PDF
some topic of ffmpeg
Tetsuyuki Kobayashi
 
PDF
New VIdeo CODEC AV1
Tetsuyuki Kobayashi
 
PDF
Try new transport protocol SRT (ver. 2)
Tetsuyuki Kobayashi
 
PDF
Try new transport protocol SRT
Tetsuyuki Kobayashi
 
PDF
Raspberry Pi Zero とカメラモジュールで作るライブ配信実験機
Tetsuyuki Kobayashi
 
PDF
WebOS Open Source Edition を試してみた
Tetsuyuki Kobayashi
 
PDF
組み込みLinuxでのGolangのススメ(Go con版)
Tetsuyuki Kobayashi
 
PDF
Tricky implementation of Go ARM soft float
Tetsuyuki Kobayashi
 
PDF
ARM 64bit has come!
Tetsuyuki Kobayashi
 
PDF
Virtual memory 20070222-en
Tetsuyuki Kobayashi
 
PDF
Simple and efficient way to get the last log using MMAP
Tetsuyuki Kobayashi
 
PDF
Tips of Malloc & Free
Tetsuyuki Kobayashi
 
PDF
Basic of virtual memory of Linux
Tetsuyuki Kobayashi
 
PDF
Patch101
Tetsuyuki Kobayashi
 
PDF
ADB(Android Debug Bridge): How it works?
Tetsuyuki Kobayashi
 
PDF
Tweaking Google TV emulator
Tetsuyuki Kobayashi
 
ODP
Inter-process communication of Android
Tetsuyuki Kobayashi
 
PDF
Android is NOT just 'Java on Linux'
Tetsuyuki Kobayashi
 
PDF
Android ipm 20110409
Tetsuyuki Kobayashi
 
PDF
Init of Android
Tetsuyuki Kobayashi
 
some topic of ffmpeg
Tetsuyuki Kobayashi
 
New VIdeo CODEC AV1
Tetsuyuki Kobayashi
 
Try new transport protocol SRT (ver. 2)
Tetsuyuki Kobayashi
 
Try new transport protocol SRT
Tetsuyuki Kobayashi
 
Raspberry Pi Zero とカメラモジュールで作るライブ配信実験機
Tetsuyuki Kobayashi
 
WebOS Open Source Edition を試してみた
Tetsuyuki Kobayashi
 
組み込みLinuxでのGolangのススメ(Go con版)
Tetsuyuki Kobayashi
 
Tricky implementation of Go ARM soft float
Tetsuyuki Kobayashi
 
ARM 64bit has come!
Tetsuyuki Kobayashi
 
Virtual memory 20070222-en
Tetsuyuki Kobayashi
 
Simple and efficient way to get the last log using MMAP
Tetsuyuki Kobayashi
 
Tips of Malloc & Free
Tetsuyuki Kobayashi
 
Basic of virtual memory of Linux
Tetsuyuki Kobayashi
 
ADB(Android Debug Bridge): How it works?
Tetsuyuki Kobayashi
 
Tweaking Google TV emulator
Tetsuyuki Kobayashi
 
Inter-process communication of Android
Tetsuyuki Kobayashi
 
Android is NOT just 'Java on Linux'
Tetsuyuki Kobayashi
 
Android ipm 20110409
Tetsuyuki Kobayashi
 
Init of Android
Tetsuyuki Kobayashi
 
Ad

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