Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
LEADING
COLLABORATION
IN THE ARM
ECOSYSTEM
MINCSでLinuxコンテナを作ろう
- The Container in the Shell (script) -
Masami Hiramatsu <m...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
発表者
@mhiramat
- Linux kernel kprobes maintainer
- 最近レビューとか指摘受けて修正とかが多くて・・・
- Li...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
デモ
簡単に動かしてみる
# minc top
# minc -r /opt/debian/x86_64
# minc -r /opt/debian/arm6...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
MINCSってなーに?
わーい!! たーの
しー!!!
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
MINCSとは?
Mini Container Shell Scripts の略(「みんくす」って読んでね)
- POSIXシェルスクリプトで実装したコンテナ...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
なんでシェルスクリプトなの?
単純に好きだから :-)
- *nix管理者にもわかりやすい
- コマンドの羅列が中心だし。
- 簡単に変更できる
- プロトタ...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
MINCSの利用例
教育用コンテナエンジンとして
- Dockerや他のコンテナエンジンとMINCSの関係は*nixとMINIXのような関係
- コメントをつ...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
MINCS Internal
MINCS Design
Minc boot process step by step
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
概要
MINCSはフロントエンドとバックエンドのスクリプトで構成
- フロントエンドツールはオプションの解析など
- Minc
- Marten
- Pole...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Mincのブートプロセス
以下の順序でコンテナを設定・起動する
1. ネットワーク設定
2. リソース制限の付与
3. 名前空間の変更
4. 新しい名前空間の...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Mincのブートプロセス
以下の順序でコンテナを設定・起動する
minc
minc-cage
minc-dens
minc-core
minc-coat
mi...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
パフェを作る要領で下から作り上げる
コンテナの起動
Namespace
& cgroups
Layered filesystem
Pidfile
Device...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Code commentary of MINCS
実際にMINCSの起動を見てみよう
- シェルスクリプトではあるが、スクリプトではなくて起動ログを追いかける...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Step 0
Parse parameters and setup temporary working directory as below;
+ expor...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Step 1 & 2
Setup netns and outside resource limitation (normally, minc does not...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Step 3
unshareコマンドで新しい名前空間に入る
この時点でのプロセスの親子関係は以下の通り
+ :
+ : Enter new namespace...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Step 4
このステップはブートプロセス中でもっとも大きい
1. PIDの取得と保存
2. mnt名前空間のprivate化
3. 新しいrootfsをマウ...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Step 4 - 1 Save PID in Pidfile
Access /proc/self to get self PID of outside of ...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Step 4 - 2 Make mount namespace private
Mount operation is shared across namesp...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Step 4 - 3 Mount Layered Root Filesystem
Mount new rootfs under working directo...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Step 4 - 4 Setup New Rootfs (1)
Setup /dev directory
+ :
+ : Prepare root direc...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Step 4 - 4 Setup New Rootfs (2)
Setup /proc, /sys, /tmp and kick the minc-leash...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Step 5 Dive Into the New World (1)
Preparing Capsh (or chroot) options
+ which ...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Step 5 Dive Into the New World (2)
Cleanup environment variables, and launch it...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
その他のオプション
よく使われるオプション
--root DIR
- rootfsのディレクトリを指定する(なければ’/’を使う)
--direct
- ov...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Options: cgroupsを使ったリソース制限
minc-cage を使ってCPU/memoryのCgroupsを作る
# minc --debug -...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Options: Background実行
“--background” オプション:コンテナをバックグラウンド実行
- Minc-execスクリプトごとバッ...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Options: --cross (or --arch)
qemu-user-staticを使って別アーキテクチャのコンテナを起動する
- Ex) aarch...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Ermine: --qemu and --um options
コンテナをQemuやUML上で動作させる(Clear Containerっぽい機能)
Step...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Ermineの構造
ErmineのFSオーバレイはホスト側で実装
- 9pfs(virtio-9p)を使い、ホスト側のoverlayfsをqemu内部のコンテ...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
なぜErmine(オコジョ)?
オコジョは季節に応じて毛を換える
Moult(換毛)
Summer Winter
By Steve Hillebrand, U...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Ermine in MINCS
カーネルを状況に応じて換える(例えばx86とarmなど)
minc-moult
X86
(host)
Arm
(Guest q...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
ermine-breeder
最小コンテナOS(Ermine-OS)のビルドスクリプト
- Qemu用のrootfs(initramfs) + kernel
...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
MINCSのネットワーク事情
かいつまんで説明すると、基本はDockerと同じ
- デフォルトではnetnsは使わない(ホストと同じnetnsで動作)
- n...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Options: --ftrace
コンテナプロセスをftraceでトレースするための拡張機能
- 自動でコンテナのPIDだけをフィルタするように設定してくれ...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Other tools in MINCS
- marten
- Docker-like image management
- polecat
- Make a...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
marten
Marten : Manager of image archives and temporary-containers
- Dockerライクに...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
polecat
Polecat: Portable Container’ed Application
- コンテナイメージをファイルの依存関係などを使って縮小...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Checkpoint restart (CRIU)
CRIUを使うことで実行中のコマンドのダンプと復帰が可能
- “criu dump” dumps proc...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Badger(アナグマ): CRIUのminc用ラッパーコマンド
“badger sleep”でコンテナをダンプ(冬眠)させる
minc-exec
(gran...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Badger Wake
また”badger wake” で冬眠したコンテナを起こす。
- Pidfileの監視のため、minc-execから呼び出しを行う
-...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Badgerの制限
最近開発を始めたので未解決の課題が多い
- Netns対応:多分特殊なやり方がいるっぽい
- Mntns対応:コンテナ内部で2重マウント状...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Random talks
- Ermine-breederでカーネルデバッグ
- Pivot_rootとChroot
- Libcap問題
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Kernel configuration for Ermine-breeder
Ermine-breeder as kernel builder
- --co...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Kernel testing with Ermine-breeder
Ermine-breederコマンドでカーネルのテストを実行
- Ermine-bree...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Pivot_rootとchroot
MINCSで分かったシェルスクリプトコンテナの限界
- Q: なぜ他のコンテナエンジンみたく(デフォルトで)pivot_r...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Libcapの改善
MINCSのサポートを改善するため、libcap(capsh)にいくつか改善パッチを作った
- /bin/bashの代わりに$SHELL ...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
おわりに
- MINCSはポータブルで小さいコンテナエンジン
- だけどいろんなことに使える
- Dockerhubからイメージファイルだけ取ってきたい
- ...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
今後の予定
- Checkpoint restart (In progress)
- CRIUの解析を進めたい
- Capshの改善(と引き続きupstrea...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Thank you!
Please visit https://github.com/mhiramat/mincs and fork it!
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Questions?
Backup slides
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Additional script: build-debian-rootfs.sh
Shell-script to install debian rootfs...
Prochain SlideShare
Chargement dans…5
×
Prochain SlideShare
MINCS – containers in the shell script
Suivant
Télécharger pour lire hors ligne et voir en mode plein écran

Partager

Mincs 日本語版

Télécharger pour lire hors ligne

シェルスクリプト製コンテナエンジンMINCSの紹介スライドです。第13回kernel/vmの資料です。

Livres associés

Gratuit avec un essai de 30 jours de Scribd

Tout voir

Mincs 日本語版

  1. 1. LEADING COLLABORATION IN THE ARM ECOSYSTEM MINCSでLinuxコンテナを作ろう - The Container in the Shell (script) - Masami Hiramatsu <masami.hiramatsu@linaro.org> Tech Lead, Linaro Ltd.
  2. 2. LEADING COLLABORATION IN THE ARM ECOSYSTEM 発表者 @mhiramat - Linux kernel kprobes maintainer - 最近レビューとか指摘受けて修正とかが多くて・・・ - Linaro Ltd. のTech Lead /* ステマ * 7/26の昼間にLinaroのワークショップを開催します * 「Linaro 汐留」でググッてね * https://connpass.com/event/61092/ */
  3. 3. LEADING COLLABORATION IN THE ARM ECOSYSTEM デモ 簡単に動かしてみる # minc top # minc -r /opt/debian/x86_64 # minc -r /opt/debian/arm64 --arch arm64 ちょっとDockerっぽくしてみる # minc --port 2022:22 sshd -D -o “UsePrivilegeSeparation=no” 仮想マシン+コンテナ # minc -r /opt/debian/arm64 --arch arm64 --qemu
  4. 4. LEADING COLLABORATION IN THE ARM ECOSYSTEM MINCSってなーに? わーい!! たーの しー!!!
  5. 5. LEADING COLLABORATION IN THE ARM ECOSYSTEM MINCSとは? Mini Container Shell Scripts の略(「みんくす」って読んでね) - POSIXシェルスクリプトで実装したコンテナエンジン - 小さい (~60KB, ~2KLOC) (最小で~20KB) - busyboxで動かせる - アーキテクチャ非依存(* qemu/um対応を除く) - 特別なバイナリは不要(* libcapを除く) - 主な機能 - Namespaces (Mount, PID, User, UTS, Net) - Cgroups (CPU, Memory) - Capabilities対応 - Overlay filesystem対応 - クロスアーキテクチャのコンテナ対応 - Dockerhubのイメージインポート対応 - Ftrace対応 - 最小のコンテナ用OS - チェックポイントリスタート(対応中)
  6. 6. LEADING COLLABORATION IN THE ARM ECOSYSTEM なんでシェルスクリプトなの? 単純に好きだから :-) - *nix管理者にもわかりやすい - コマンドの羅列が中心だし。 - 簡単に変更できる - プロトタイピングに向いている - デプロイも簡単 - アーキ依存性がない - とても小さい - コピーするだけでいい
  7. 7. LEADING COLLABORATION IN THE ARM ECOSYSTEM MINCSの利用例 教育用コンテナエンジンとして - Dockerや他のコンテナエンジンとMINCSの関係は*nixとMINIXのような関係 - コメントをつけながら動作を見て書き換えられる - まあ、ほとんどの実装が OSSの今、あまり意味はない テストベッドとして - Linuxのコンテナ関連機能がどう動くかをテストする - シェルスクリプトの練習台 - Linuxカーネルのテスト環境(後述) あるいは趣味の一品
  8. 8. LEADING COLLABORATION IN THE ARM ECOSYSTEM MINCS Internal MINCS Design Minc boot process step by step
  9. 9. LEADING COLLABORATION IN THE ARM ECOSYSTEM 概要 MINCSはフロントエンドとバックエンドのスクリプトで構成 - フロントエンドツールはオプションの解析など - Minc - Marten - Polecat - バックエンドライブラリが実際の処理を行う - libexec/ 以下に格納(直接呼び出しはしない) minc marten polecat minc-cage minc-leash minc-coat minc-farm Frontends Backends call etc...
  10. 10. LEADING COLLABORATION IN THE ARM ECOSYSTEM Mincのブートプロセス 以下の順序でコンテナを設定・起動する 1. ネットワーク設定 2. リソース制限の付与 3. 名前空間の変更 4. 新しい名前空間の設定 5. 新しい名前空間内でコマンド実行 0. オプションの解析
  11. 11. LEADING COLLABORATION IN THE ARM ECOSYSTEM Mincのブートプロセス 以下の順序でコンテナを設定・起動する minc minc-cage minc-dens minc-core minc-coat minc-leash 各ステップに関連 するスクリプト 1. ネットワーク設定 2. リソース制限の付与 3. 名前空間の変更 4. 新しい名前空間の設定 5. 新しい名前空間内でコマンド実行 0. オプションの解析 minc-exec
  12. 12. LEADING COLLABORATION IN THE ARM ECOSYSTEM パフェを作る要領で下から作り上げる コンテナの起動 Namespace & cgroups Layered filesystem Pidfile Device files procfs Sysfs & tmpfs Your application Chroot/Capsh
  13. 13. LEADING COLLABORATION IN THE ARM ECOSYSTEM Code commentary of MINCS 実際にMINCSの起動を見てみよう - シェルスクリプトではあるが、スクリプトではなくて起動ログを追いかける $ sudo minc --debug echo “hello mincs” + export MINC_DEBUG=1 + [ 2 -ne 0 ] + cmd=echo + break + TRAPCMD= + [ -z ] + : + : Setup temporary working directory for this container + : + [ -z ] + mktemp -d /tmp/minc1505-XXXXXX + export MINC_TMPDIR=/tmp/minc1505-EaRzSD + : + : Trap the program exit and remove the working directory + : こんな感じでコメントが 表示される
  14. 14. LEADING COLLABORATION IN THE ARM ECOSYSTEM Step 0 Parse parameters and setup temporary working directory as below; + export MINC_DEBUG=1 + [ 2 -ne 0 ] + cmd=echo + break + TRAPCMD= + [ -z ] + : + : Setup temporary working directory for this container + : + [ -z ] + mktemp -d /tmp/minc2798-XXXXXX + export MINC_TMPDIR=/tmp/minc2798-ZtvWh7 + : + : Trap the program exit and remove the working directory + : + [ 0 -eq 0 ] + TRAPCMD=rm -rf /tmp/minc2798-ZtvWh7 + trap rm -rf /tmp/minc2798-ZtvWh7 EXIT + trap INT + /usr/local/libexec/minc-exec echo hello mincs Make a directory and remove it when exit. And call minc-exec as a child process
  15. 15. LEADING COLLABORATION IN THE ARM ECOSYSTEM Step 1 & 2 Setup netns and outside resource limitation (normally, minc does nothing.) + : + : Ensure parameters are set + : + test / -a -d /tmp/minc2798-ZtvWh7 + [ ] + TRAPCMD= + IP_NETNS= + [ ] + /usr/local/libexec/minc-cage --prepare 2803 + CAGECMD= + [ ] + : + : Prepare cleanup commands + : + trap INT + trap rm -f /tmp/minc2798-ZtvWh7/pid; EXIT Remove pid file after exit (pid file will be made in phase4)
  16. 16. LEADING COLLABORATION IN THE ARM ECOSYSTEM Step 3 unshareコマンドで新しい名前空間に入る この時点でのプロセスの親子関係は以下の通り + : + : Enter new namespace and execute command + : + UNSHARE_OPT=-iumpf + [ ] + unshare -iumpf /usr/local/libexec/minc-core echo hello mincs Invoke unshare with minc-core as a child process Minc (grand/grand parent) Cleanup tempdir minc-exec (grand parent) Cleanup pidfile minc-core Fork & wait (current) PID=1 in this namespace unshare (parent) Wait for quit
  17. 17. LEADING COLLABORATION IN THE ARM ECOSYSTEM Step 4 このステップはブートプロセス中でもっとも大きい 1. PIDの取得と保存 2. mnt名前空間のprivate化 3. 新しいrootfsをマウント 4. rootfsの準備 a. /devの準備 b. /procの準備 c. sysfs and tmpfsの準備 5. minc-leashをキックして次のステップへ
  18. 18. LEADING COLLABORATION IN THE ARM ECOSYSTEM Step 4 - 1 Save PID in Pidfile Access /proc/self to get self PID of outside of namespace (since $$ is 1) NOTE: Until remounting /proc, original procfs instance is shown in new PID namespace. + : + : Get the PID in parent namespace from procfs + : (At this point, we still have the procfs in original namespace) + : + cut -f 4 -d /proc/self/stat + export MINC_PID=2810 + echo 2810 Get the PPID of ‘cut’ command == PID of this script
  19. 19. LEADING COLLABORATION IN THE ARM ECOSYSTEM Step 4 - 2 Make mount namespace private Mount operation is shared across namespaces by default - --make-rprivate makes it private recursively under given mountpoint LIBMOUNT_MTAB env-var is used for updating mtab file, so it also should be hidden. + : + : Make current mount namespace private + : + mount --make-rprivate / + : + : Do not update /etc/mtab since the mount is private + : + export LIBMOUNT_MTAB=/proc/mounts
  20. 20. LEADING COLLABORATION IN THE ARM ECOSYSTEM Step 4 - 3 Mount Layered Root Filesystem Mount new rootfs under working directory using overlayfs + : + : Setup overlay rootfs by minc-coat + : + /usr/local/libexec/minc-coat bind /tmp/minc2798-ZtvWh7 / [...] + : + : Make working sub-directories + : RD is mountpoint, UD is for upper layer, WD is working space + : + RD=/tmp/minc2798-ZtvWh7/root + UD=/tmp/minc2798-ZtvWh7/storage + WD=/tmp/minc2798-ZtvWh7/work + mkdir -p /tmp/minc2798-ZtvWh7/root /tmp/minc2798-ZtvWh7/storage /tmp/minc2798-ZtvWh7/work + : + : Mount overlayed root directory + : + mount -t overlay -o upperdir=/tmp/minc2798-ZtvWh7/storage,lowerdir=/,workdir=/tmp/minc2798-ZtvWh7/work overlayfs /tmp/minc2798-ZtvWh7/root Overlayfs requires upper, lower and workdir Tempdir Rootdir Mounts given rootfs on tempdir/root
  21. 21. LEADING COLLABORATION IN THE ARM ECOSYSTEM Step 4 - 4 Setup New Rootfs (1) Setup /dev directory + : + : Prepare root directory + : + RD=/tmp/minc2798-ZtvWh7/root [...] + : + : Make a fake /dev directory + : + mount -t tmpfs tmpfs /tmp/minc2798-ZtvWh7/root/dev + mkdir /tmp/minc2798-ZtvWh7/root/dev/pts [...] (このあたりでTTYの処理→/dev/consoleにつけかえ) [...] + mount devpts -t devpts -onoexec,nosuid,gid=5,mode=0620,newinstance,ptmxmode=0666 /tmp/minc2798-ZtvWh7/root/dev/pts + ln -s /dev/pts/ptmx /tmp/minc2798-ZtvWh7/root/dev/ptmx + : + : Bind fundamental device files to new /dev + : + bindmounts /dev/null /dev/zero /dev/random /dev/urandom Mount devpts for hide host pty
  22. 22. LEADING COLLABORATION IN THE ARM ECOSYSTEM Step 4 - 4 Setup New Rootfs (2) Setup /proc, /sys, /tmp and kick the minc-leash + : + : Do not bind procfs, since it shows outside pids + : + mount -t proc -o ro,nosuid,nodev,noexec proc /proc + mount -t proc -o rw,nosuid,nodev,noexec,relatime proc /tmp/minc2798-ZtvWh7/root/proc + bindmounts /proc/sys /proc/sysrq-trigger /proc/irq /proc/bus [...] + [ -z ] + bindmount /sys + test -e /sys + touch /tmp/minc2798-ZtvWh7/root/sys + mount --bind /sys /tmp/minc2798-ZtvWh7/root/sys + : + : /tmp is used for application working area in container + : + mount -t tmpfs tmpfs /tmp/minc2798-ZtvWh7/root/tmp + : + : Exec leash (chroot/capsh) to run command in new rootfs + : + exec /usr/local/libexec/minc-leash /tmp/minc2798-ZtvWh7/root echo hello mincs These files are read-only Make original procfs readonly
  23. 23. LEADING COLLABORATION IN THE ARM ECOSYSTEM Step 5 Dive Into the New World (1) Preparing Capsh (or chroot) options + which capsh + : + : Drop cap_sys_chroot to prohibit chroot-breakout + : + MINC_DROPCAPS=,cap_sys_chroot + : + : Check capsh --exec is supported + : + CAPSH_EXEC= + capsh -h + grep -q ^ *--exec [...] + [ -z ,cap_sys_chroot ] + : + : If we need to drop capabilities, use capsh to run given command + : + RUN= capsh --chroot=/tmp/minc2798-ZtvWh7/root --drop=,cap_sys_chroot -- Root user can break out chroot easily with chroot http://pentestmonkey.net/blog/chroot-breakout-perl
  24. 24. LEADING COLLABORATION IN THE ARM ECOSYSTEM Step 5 Dive Into the New World (2) Cleanup environment variables, and launch it - Capsh (capability shell wrapper) is the key to “cap” the container (Not to escape outside) + : + : Wash out the environment variables for MINCS + : + wash ^MINC_ + env + + grep ^MINC_ cut -f 1 -d= + unset MINC_DEBUG_PREFIX [...] + unset MINC_DIRECT + : + : If capsh does not support --exec, run it with sh -c + : + exec capsh --chroot=/tmp/minc2798-ZtvWh7/root --drop=,cap_sys_chroot -- -c exec echo hello mincs hello mincs “exec” makes “echo” PID = 1
  25. 25. LEADING COLLABORATION IN THE ARM ECOSYSTEM その他のオプション よく使われるオプション --root DIR - rootfsのディレクトリを指定する(なければ’/’を使う) --direct - overlayfsを使わず、直に指定したrootfsを書き換える --tempdir DIR - 一時ディレクトリを作らず、指定されたディレクトリを使う(--keepの意味も含む) --keep - コンテナ終了時に一時ディレクトリを消さない --bind DIR1:DIR2 - ホストディレクトリ (DIR1) をコンテナのパス (DIR2)にバインドする
  26. 26. LEADING COLLABORATION IN THE ARM ECOSYSTEM Options: cgroupsを使ったリソース制限 minc-cage を使ってCPU/memoryのCgroupsを作る # minc --debug --mem-limit 512M echo hello minc [...] + /usr/local/libexec/minc-exec echo hello minc [...] + /usr/local/libexec/minc-cage --prepare 32547 [...] + TRAPCMD=cleanup_cages /sys/fs/cgroup/memory/mincs/minc32544-F8yU4K; + : + : Setup a "cage" for the container + : + . /usr/local/libexec/minc-cage [...] + : + : Set cgroups memory limit + : + test -d /sys/fs/cgroup/memory/mincs/minc32544-F8yU4K + echo 512M + [ ] + echo 32547 Written to $MEMCG/memory.limit_in_bytes Written to $MEMCG/tasks 使い終わったcgroupsを消すためのコ マンドを用意しておく
  27. 27. LEADING COLLABORATION IN THE ARM ECOSYSTEM Options: Background実行 “--background” オプション:コンテナをバックグラウンド実行 - Minc-execスクリプトごとバックグラウンド実行 - コンテナ終了時にpidfileやtempdirなどを消す - スクリプトでデーモン化 - stdout/stderrはtempdir/logに出力(コンテナからは/dev/consoleに見える) - setsidしているのでminc-exec自体がセッションリーダになる Minc (grand/grand parent) minc-exec (grand parent) Cleanup pidfile & tempdir command Setsid & exit (current) PID=1 in this namespace unshare (parent) Wait for quit New session New namespace
  28. 28. LEADING COLLABORATION IN THE ARM ECOSYSTEM Options: --cross (or --arch) qemu-user-staticを使って別アーキテクチャのコンテナを起動する - Ex) aarch64 rootfsを x86_64で動作 # minc --debug -r /opt/debian/arm64 --cross arm64 echo hello minc [...] + export MINC_ARCH=aarch64 + grep interpreter /proc/sys/fs/binfmt_misc/qemu-aarch64 + cut -f 2 -d + export MINC_CROSS_QEMU=/usr/bin/qemu-aarch64-static [...] + : + : Bind qemu-user-mode for cross-arch container + : + mkdir -p /tmp/minc625-8ug6g3/root/usr/bin/ + [ -x /tmp/minc625-8ug6g3/root//usr/bin/qemu-aarch64-static ] + bindmount /usr/bin/qemu-aarch64-static + test -e /usr/bin/qemu-aarch64-static + touch /tmp/minc625-8ug6g3/root/usr/bin/qemu-aarch64-static + mount --bind /usr/bin/qemu-aarch64-static /tmp/minc625-8ug6g3/root/usr/bin/qemu-aarch64-static In minc, find appropriate qemu-user-static from binfmt_misc In minc-core, bind the interpreter binary on new rootfs (not copy)
  29. 29. LEADING COLLABORATION IN THE ARM ECOSYSTEM Ermine: --qemu and --um options コンテナをQemuやUML上で動作させる(Clear Containerっぽい機能) Step 4 - 3 (mount layered filesystem)の直後にqemu起動 + : + : Enter qemu-system or user-mode-linux container (ermine) + : + . /usr/local/libexec/minc-moult + hostname + MINC_GUEST_OPT=-r /mnt/root --name devnote + : + : Since host mounts overlayfs on rootfs, guest skips it. + : + MINC_GUEST_OPT=-r /mnt/root --name devnote -D --debug + : + : Prepare run.sh for qemu/um internal container + : + echo #!/bin/sh + tput lines + tput cols + echo stty rows 24; stty cols 80 + echo minc -r /mnt/root --name devnote -D --debug "echo hello world" + minc_moult x86_64 /tmp/minc2798-ZtvWh7 ro quiet Qemu内部でmincを再度起動する
  30. 30. LEADING COLLABORATION IN THE ARM ECOSYSTEM Ermineの構造 ErmineのFSオーバレイはホスト側で実装 - 9pfs(virtio-9p)を使い、ホスト側のoverlayfsをqemu内部のコンテナに渡している - このため、同一のrootfsを使ったコンテナを--qemuなしでも実行できる Overlayfs Ermine-OS . Root directory Tempdir bind-mount Container App minc --direct Qemu minc --qemu 9pfs Overlayfs Root directory Tempdir Container App minc 同一のrootfsを再利用可能 →イメージの新規作成は不要
  31. 31. LEADING COLLABORATION IN THE ARM ECOSYSTEM なぜErmine(オコジョ)? オコジョは季節に応じて毛を換える Moult(換毛) Summer Winter By Steve Hillebrand, USFWS [Public domain], via Wikimedia Commons By 4028mdk09 (Own work) [CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0)], via Wikimedia Commons
  32. 32. LEADING COLLABORATION IN THE ARM ECOSYSTEM Ermine in MINCS カーネルを状況に応じて換える(例えばx86とarmなど) minc-moult X86 (host) Arm (Guest qemu) By Steve Hillebrand, USFWS [Public domain], via Wikimedia Commons By 4028mdk09 (Own work) [CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0)], via Wikimedia Commons
  33. 33. LEADING COLLABORATION IN THE ARM ECOSYSTEM ermine-breeder 最小コンテナOS(Ermine-OS)のビルドスクリプト - Qemu用のrootfs(initramfs) + kernel - Linux + Busybox + libcap (capsh) + MINCS - コマンド一発でダウンロードからビルド・インストールまで実行 - 例)arm64向けのErmineOSを作る - # ermine-breeder build --arch arm64 - X86-64, i386, arm, arm64, um (user-mode linux) - x86の事例だが、samples/ermine/tinyconfigを使えばOSのサイズは 4MB未満 - コンテナ専用組込みDistro? - コンテナ使うならDistroは要らない(コンテナのrootfsを使えばいい) - デバイスファイルもスクリプトを変更すれば作り放題なので。 - Meta-mincsぐらいなら用意できる
  34. 34. LEADING COLLABORATION IN THE ARM ECOSYSTEM MINCSのネットワーク事情 かいつまんで説明すると、基本はDockerと同じ - デフォルトではnetnsは使わない(ホストと同じnetnsで動作) - netnsを有効にすると、ブリッジとip masqueradeを使ったNATを作る - TCP/UDP Portのマッピングをサポート - Ermineコンテナの場合、デフォルトで NATが有効になる - IPアドレスはテキストファイル(/var/run/minc.lease)で管理 mincbr0Host IF veth1-XXX veth0-XXX tapN eth0 iptables NAT/DNAT virtio-net Ermine container Minc container
  35. 35. LEADING COLLABORATION IN THE ARM ECOSYSTEM Options: --ftrace コンテナプロセスをftraceでトレースするための拡張機能 - 自動でコンテナのPIDだけをフィルタするように設定してくれる - --ftrace <トレーススクリプト> - トレーススクリプトはシェルスクリプトで記述 - 普段ftraceを使い慣れていれば問題ない。 - samples/ftrace/ 以下に一応サンプルがある - トレース結果の読み出しはホスト側から行う - いずれにしても管理者権限がないと読み出せない
  36. 36. LEADING COLLABORATION IN THE ARM ECOSYSTEM Other tools in MINCS - marten - Docker-like image management - polecat - Make a minimum application container - Badger (開発中) - Container checkpoint-restart tool
  37. 37. LEADING COLLABORATION IN THE ARM ECOSYSTEM marten Marten : Manager of image archives and temporary-containers - Dockerライクにコンテナイメージ(rootfs)とコンテナ(tempdir)をUUIDや名前で管理す るためのツール - Dockerhubからコンテナイメージのpullやimportも可能 - この方が簡単にいろんなディストロのイメージを試せる - mincコマンドからUUIDや名前でコンテナを起動できる 例: # marten pull fedora Pulled. Importing image: library/fedora 691bc14ee27487db536172a1fcdbbf956f460d1e1e1b201828e3a2bab81c5ec8 # marten li 691bc14ee274 249M fedora # minc -r fedora e46748c6b2c6196e426601de4650f0f76d8df0ad9c1a32eafdb8618162161412 bash-4.3# cat /etc/fedora-release Fedora release 25 (Twenty Five)
  38. 38. LEADING COLLABORATION IN THE ARM ECOSYSTEM polecat Polecat: Portable Container’ed Application - コンテナイメージをファイルの依存関係などを使って縮小する - さらにsquashfsでMINCSごとパッケージング、実行可能なスクリプトヘッダを追加 - MINCSをインストールしていないシステムでもコンテナ実行が可能に! Example: # polecat -o top.sh /opt/debian/x86_64 top (hit ‘q’ to quit top) Install /sbin/capsh ... Done:1.6M /home/mhiramat/ksrc/mincs/top.sh # ./top.sh
  39. 39. LEADING COLLABORATION IN THE ARM ECOSYSTEM Checkpoint restart (CRIU) CRIUを使うことで実行中のコマンドのダンプと復帰が可能 - “criu dump” dumps process (tree) images and filehandles, namespaces etc. - “criu restore” restores process tree from dump image ただしいくつかの前提条件がある - ターゲットになるプロセスはセッションリーダでなければならない - ターゲットプロセスツリーは複数の名前空間には所属できない(多分) - 名前空間は自己完結していないといけない - chrootではなくpivot_rootでなければならない (?) - 外部ディレクトリのバインドマウントなどが邪魔をする  →ちょっと現在のmincの実装と違う
  40. 40. LEADING COLLABORATION IN THE ARM ECOSYSTEM Badger(アナグマ): CRIUのminc用ラッパーコマンド “badger sleep”でコンテナをダンプ(冬眠)させる minc-exec (grand parent) Cleanup pidfile command (current) PID=1 in this namespace unshare (parent) Wait for quit New session New namespace & new session プロセスイメージを tmpdir/criuに保存 badger sleep CRIU対応のため - 新規セッション開始 - --pivotオプション必須 - --keepオプション必須 - バックグラウンド必須
  41. 41. LEADING COLLABORATION IN THE ARM ECOSYSTEM Badger Wake また”badger wake” で冬眠したコンテナを起こす。 - Pidfileの監視のため、minc-execから呼び出しを行う - 名前空間の復帰のためにCRIUからminc-coreを呼び出し、名前空間の設定をし直 す minc-exec (grand parent) Cleanup pidfile command (current) PID=1 in this namespace (parent) Wait for quit New session New namespace & new session badger wake
  42. 42. LEADING COLLABORATION IN THE ARM ECOSYSTEM Badgerの制限 最近開発を始めたので未解決の課題が多い - Netns対応:多分特殊なやり方がいるっぽい - Mntns対応:コンテナ内部で2重マウント状態になっている模様 - このため、一度復帰させたコンテナを再度ダンプできない - コードが汚い - お察し・・・  試してみたい場合はcriuブランチをcheckout
  43. 43. LEADING COLLABORATION IN THE ARM ECOSYSTEM Random talks - Ermine-breederでカーネルデバッグ - Pivot_rootとChroot - Libcap問題
  44. 44. LEADING COLLABORATION IN THE ARM ECOSYSTEM Kernel configuration for Ermine-breeder Ermine-breeder as kernel builder - --configオプションでErmine OSのkconfigのカスタマイズが可能 - シェルスクリプト形式の設定ファイルで、 DLパラメタとカスタマイズ関数の定義を行う URLにはfile://, http://, ftp://, https://, git://などが利用可 能 カーネルのコンフィグ設定を 行う(基本的に必要なもの は自動選択される) busyboxのコンフィグ設定を 行う(同上)
  45. 45. LEADING COLLABORATION IN THE ARM ECOSYSTEM Kernel testing with Ermine-breeder Ermine-breederコマンドでカーネルのテストを実行 - Ermine-breeder testrun コマンドは起動後に./workディレクトリをマウントしてrun.sh を実行する - ./work/run.shにテストコマンドを書いておけばいいんじゃね? - ちなみにftracetestは最近これで実行しています E.g. # ermine-breeder build --config samples/ermine/ftracetest.config # cp -r work/linux/linux*/tools/testing/selftests/ftrace work/ # cp samples/run/ftracetest.sh work/run.sh # ermine-breeder testrun
  46. 46. LEADING COLLABORATION IN THE ARM ECOSYSTEM Pivot_rootとchroot MINCSで分かったシェルスクリプトコンテナの限界 - Q: なぜ他のコンテナエンジンみたく(デフォルトで)pivot_rootを使わないの? - A: pivot_rootには致命的な問題があるので・・・。 - Chrootはただのsyscallだがpivot_rootは他の処理を組み合わせないといけない → つまりchrootコマンド(+umountコマンド)がないrootfsでは使えない - Pivot_rootはinitramfsでは使えない。さらに initrdはほぼ絶滅(ubuntuはinitrdって言いつつ initramfs) → ermineで使えない・・・。 - 解決するには--pivot-rootオプションをcapshに実装するしか・・・ Note that chroot must be available under the old root and under the new root, because pivot_root may or may not have implicitly changed the root directory of the shell.
  47. 47. LEADING COLLABORATION IN THE ARM ECOSYSTEM Libcapの改善 MINCSのサポートを改善するため、libcap(capsh)にいくつか改善パッチを作った - /bin/bashの代わりに$SHELL 環境変数を参照する - dashとかshしかない環境がありまして・・・。 - --execオプションを追加して、直接コマンドを実行する - これでshもないrootfs上でアプリを実行できる 下記のレポジトリで公開済み - https://github.com/mhiramat/libcap Upstream化したい - 既にlibcapの作者には投げているんだけれども、返答がない・・・。もしかして dead projectなのか??? - pivot-rootオプションも追加したいのにどうすれば・・・。
  48. 48. LEADING COLLABORATION IN THE ARM ECOSYSTEM おわりに - MINCSはポータブルで小さいコンテナエンジン - だけどいろんなことに使える - Dockerhubからイメージファイルだけ取ってきたい - カーネルビルド(クロスビルド)やテスト環境を手軽に揃えたい - クロスアーキのrootfs環境を作りたい - CRIUでチェックポイントリスタートを試してみたい - 手軽にuser-mode-linuxを試したい - 拡張性は無限大 - シェルスクリプトさえ書ければ拡張できる
  49. 49. LEADING COLLABORATION IN THE ARM ECOSYSTEM 今後の予定 - Checkpoint restart (In progress) - CRIUの解析を進めたい - Capshの改善(と引き続きupstream化) - Pivot_root support - Seccomp support - Non-x86 host --qemu mode (Aarch64) - 動作確認だけだとは思うが・・・。 - Btrfs snapshot support - satさんに任せたい - Support new arch - OpenRISC? MIPS? POWER? - qemuがvirtioをサポートしていないと Ermineは動かない - selinux/AppArmor support - サンドボックス化の技術を知りたい - OCI standard support - Container package encrypt/signing Interesting Less-Interesting 個人的な興味 レベル
  50. 50. LEADING COLLABORATION IN THE ARM ECOSYSTEM Thank you! Please visit https://github.com/mhiramat/mincs and fork it!
  51. 51. LEADING COLLABORATION IN THE ARM ECOSYSTEM Questions?
  52. 52. Backup slides
  53. 53. LEADING COLLABORATION IN THE ARM ECOSYSTEM Additional script: build-debian-rootfs.sh Shell-script to install debian rootfs using debootstrap - This supports cross-arch (arm, arm64, i386, ppc64) install - Also supports debian version and additional package Example: # mkdir -p /opt/debian/arm64 # samples/scripts/build-debian-rootfs.sh /opt/debian/arm64 --arch arm64 --deb stretch I: Keyring file not available at /usr/share/keyrings/debian-archive-keyring.gpg; switching to https mirror https://mirrors.kernel.org/debian … I: Configuring ca-certificates... I: Base system installed successfully. # ls /opt/debian/arm64/ bin dev home media opt root sbin sys usr boot etc lib mnt proc run srv tmp var # minc -r /opt/debian/arm64 --cross arm64 uname -a Linux devnote 4.10.6 #40 SMP Wed Mar 29 16:43:19 JST 2017 aarch64 GNU/Linux
  • imurata8203

    Apr. 20, 2021
  • albatross0

    Jul. 28, 2017

シェルスクリプト製コンテナエンジンMINCSの紹介スライドです。第13回kernel/vmの資料です。

Vues

Nombre de vues

1 781

Sur Slideshare

0

À partir des intégrations

0

Nombre d'intégrations

29

Actions

Téléchargements

8

Partages

0

Commentaires

0

Mentions J'aime

2

×