O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

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

9.329 visualizações

Publicada em

Writing whole linux userland in golang

Publicada em: Engenharia
  • Don't forget another good way of simplifying your writing is using external resources (such as ⇒ www.HelpWriting.net ⇐ ). This will definitely make your life more easier
       Responder 
    Tem certeza que deseja  Sim  Não
    Insira sua mensagem aqui
  • Girls for sex in your area are there: tinyurl.com/areahotsex
       Responder 
    Tem certeza que deseja  Sim  Não
    Insira sua mensagem aqui
  • Dating direct: ❤❤❤ http://bit.ly/2ZDZFYj ❤❤❤
       Responder 
    Tem certeza que deseja  Sim  Não
    Insira sua mensagem aqui
  • Dating for everyone is here: ❶❶❶ http://bit.ly/2ZDZFYj ❶❶❶
       Responder 
    Tem certeza que deseja  Sim  Não
    Insira sua mensagem aqui
  • Sex in your area is here: www.bit.ly/sexinarea
       Responder 
    Tem certeza que deseja  Sim  Não
    Insira sua mensagem aqui

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

  1. 1. 1 Linux のユーザーランドを init から全てまるごと Golang で書く Tetsuyuki Kobayashi 2018.4.15 Go Conference 2018 Spring
  2. 2. 2  The latest version of this slide will be available from here  http://www.slideshare.net/tetsu.koba/presentati ons
  3. 3. 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
  4. 4. はじめに  golang の実行ファイルは自己完結的  基本ライブラリ (libc に相当するもの ) は自前で持っている  インストールするときに依存性が少ない  後、何を追加したら、 Linux カーネルと golang の実行ファ イルだけで動かせる?
  5. 5. 最小構成を理解するのは エンジニアリングの基本  削って削って、残ったものが本質。  本日の「最小限」の定義  ホスト名を解決してネットワークに アクセスできること  TLS( 暗号化通信 ) はオプション  現在時刻を UTC で扱えること  タイムゾーンはオプション
  6. 6. 本日話すること  gokrazy の紹介  docker での最小限のコンテナの 実験  最小限のルートファイルシステム  miminumgo: 最小限の初期化処理 をする go パッケージ
  7. 7. Gokrazy の紹介
  8. 8. Gokrazy とは  https://gokrazy.org/  golang だけで Linux のユーザーランドを 構築してくれる  ラズパイ 3 用のマイクロ SD カードを作成  init, dhcp, ntp とユーザーのプロセスが実 行される  WebUI でプロセスの状態が見られる
  9. 9. 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
  10. 10. Gokrazy の制限  sh など通常のコマンドは含んでいない  参考 gobox  カーネルモジュールをロードするしくみ は無い  必要なモジュールはあらかじめカーネル にビルトインしておく  デバイスの抜き差しは扱わない
  11. 11. docker での 最小限のコンテナの実験
  12. 12. docker で busybox 一個のファ イルを動かしてみた  docker では実マシンでの初期 化処理を自動で行ってくれる  具体的にそれが何かを実験で調べ てみた。  dockerでbusybox一個だけのファイルを含むイメージを作って動かしたらどうなるか
  13. 13. 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)
  14. 14. 最小限のルートファイルシステム
  15. 15. 最小限のルートファイルシステム /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 表現
  16. 16. 時刻に関して  最小限では UTC のみが扱える  ローカルタイムを扱うには /etc/localtime を追加  その他のタイムゾーンを扱うには  /usr/share/zoneinfo/ 以下のファイルが 必要  または、 runtime.GOROOT 以下に /lib/time/zoneinfo.zip を置く
  17. 17. TLS( 暗号化通信 ) に関して  最小限では TLS は扱えない  /etc/ssl/certs/ 以下のファイルが必要  ルート証明書だけでも  /etc/ssl/certs/ca-certificates.crt
  18. 18. minimumgo: 最小限の初期化処理を してくれる go パッケージ
  19. 19. minimumgo  最小限の初期化処理をしてくれる go パッケージを自作した  ブランク (_) import するだけ  その golang の実行ファイルを init として動かせる  設定はカーネルパラメータで  ntp サーバの指定
  20. 20. 使用例 package main import ( "log" "net/http" ) func main() { log.Fatal(http.ListenAndServe(":80", http.FileServer(http.Dir("/")))) } この golang のプログラムを一個だけ動かしたい場合
  21. 21. 使用例 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 として動かせる。
  22. 22. minimumgo  https://github.com/tetsu-koba/minimumgo  example に ラズパイ用にビルドして initramfs のイメージを作成して動かす 方法を書きました
  23. 23. 最後に  本セッションの観察や実験を通して、 Linux の 起動時に行っていることが明らかに。  「 Linux のユーザーランドを golang で init から まるごと全部書く」 -> 達成。  minimumgo パッケージは実験用。  ブラックボックスとして使うのでなくてソー スコードを参考にしてください。 
  24. 24. References  gokrazy  Linuxのユーザーランドをinitから全てまるごと golangで書く  dockerでbusybox一個だけのファイルを 含むイメージを作って動かしたらどうなるか  dockerでgolangの実行ファイル1個だけを 含むイメージを作って動かす  https://github.com/tetsu-koba/minimumgo 
  25. 25. 25 Q & A @tetsu_koba Thank you for listening!

×