SlideShare a Scribd company logo
1 of 53
Download to read offline
LEADING
COLLABORATION
IN THE ARM
ECOSYSTEM
MINCSでLinuxコンテナを作ろう
- The Container in the Shell (script) -
Masami Hiramatsu <masami.hiramatsu@linaro.org>
Tech Lead, Linaro Ltd.
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
発表者
@mhiramat
- Linux kernel kprobes maintainer
- 最近レビューとか指摘受けて修正とかが多くて・・・
- Linaro Ltd. のTech Lead
/* ステマ
* 7/26の昼間にLinaroのワークショップを開催します
* 「Linaro 汐留」でググッてね
* https://connpass.com/event/61092/
*/
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
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
MINCSってなーに?
わーい!! たーの
しー!!!
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
- チェックポイントリスタート(対応中)
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
なんでシェルスクリプトなの?
単純に好きだから :-)
- *nix管理者にもわかりやすい
- コマンドの羅列が中心だし。
- 簡単に変更できる
- プロトタイピングに向いている
- デプロイも簡単
- アーキ依存性がない
- とても小さい
- コピーするだけでいい
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
MINCSの利用例
教育用コンテナエンジンとして
- Dockerや他のコンテナエンジンとMINCSの関係は*nixとMINIXのような関係
- コメントをつけながら動作を見て書き換えられる
- まあ、ほとんどの実装が OSSの今、あまり意味はない
テストベッドとして
- Linuxのコンテナ関連機能がどう動くかをテストする
- シェルスクリプトの練習台
- Linuxカーネルのテスト環境(後述)
あるいは趣味の一品
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
- Polecat
- バックエンドライブラリが実際の処理を行う
- libexec/ 以下に格納(直接呼び出しはしない)
minc
marten
polecat
minc-cage
minc-leash
minc-coat
minc-farm
Frontends Backends
call
etc...
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Mincのブートプロセス
以下の順序でコンテナを設定・起動する
1. ネットワーク設定
2. リソース制限の付与
3. 名前空間の変更
4. 新しい名前空間の設定
5. 新しい名前空間内でコマンド実行
0. オプションの解析
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
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
パフェを作る要領で下から作り上げる
コンテナの起動
Namespace
& cgroups
Layered filesystem
Pidfile
Device files
procfs
Sysfs & tmpfs
Your application
Chroot/Capsh
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
+ :
こんな感じでコメントが
表示される
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
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)
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
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をキックして次のステップへ
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
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
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
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
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
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
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
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
その他のオプション
よく使われるオプション
--root DIR
- rootfsのディレクトリを指定する(なければ’/’を使う)
--direct
- overlayfsを使わず、直に指定したrootfsを書き換える
--tempdir DIR
- 一時ディレクトリを作らず、指定されたディレクトリを使う(--keepの意味も含む)
--keep
- コンテナ終了時に一時ディレクトリを消さない
--bind DIR1:DIR2
- ホストディレクトリ (DIR1) をコンテナのパス (DIR2)にバインドする
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を消すためのコ
マンドを用意しておく
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
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)
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を再度起動する
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を再利用可能
→イメージの新規作成は不要
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
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
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ぐらいなら用意できる
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
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Options: --ftrace
コンテナプロセスをftraceでトレースするための拡張機能
- 自動でコンテナのPIDだけをフィルタするように設定してくれる
- --ftrace <トレーススクリプト>
- トレーススクリプトはシェルスクリプトで記述
- 普段ftraceを使い慣れていれば問題ない。
- samples/ftrace/ 以下に一応サンプルがある
- トレース結果の読み出しはホスト側から行う
- いずれにしても管理者権限がないと読み出せない
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
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)
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
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の実装と違う
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オプション必須
- バックグラウンド必須
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
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
Badgerの制限
最近開発を始めたので未解決の課題が多い
- Netns対応:多分特殊なやり方がいるっぽい
- Mntns対応:コンテナ内部で2重マウント状態になっている模様
- このため、一度復帰させたコンテナを再度ダンプできない
- コードが汚い
- お察し・・・
 試してみたい場合はcriuブランチをcheckout
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
- --configオプションでErmine OSのkconfigのカスタマイズが可能
- シェルスクリプト形式の設定ファイルで、 DLパラメタとカスタマイズ関数の定義を行う
URLにはfile://, http://, ftp://,
https://, git://などが利用可
能
カーネルのコンフィグ設定を
行う(基本的に必要なもの
は自動選択される)
busyboxのコンフィグ設定を
行う(同上)
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
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.
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オプションも追加したいのにどうすれば・・・。
LEADING COLLABORATION
IN THE ARM ECOSYSTEM
おわりに
- MINCSはポータブルで小さいコンテナエンジン
- だけどいろんなことに使える
- Dockerhubからイメージファイルだけ取ってきたい
- カーネルビルド(クロスビルド)やテスト環境を手軽に揃えたい
- クロスアーキのrootfs環境を作りたい
- CRIUでチェックポイントリスタートを試してみたい
- 手軽にuser-mode-linuxを試したい
- 拡張性は無限大
- シェルスクリプトさえ書ければ拡張できる
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
個人的な興味
レベル
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 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

More Related Content

What's hot

PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~
PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~
PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~Preferred Networks
 
Ubuntuで始めるコンテナ技術入門
Ubuntuで始めるコンテナ技術入門Ubuntuで始めるコンテナ技術入門
Ubuntuで始めるコンテナ技術入門Takenori Matsumoto
 
Lxc cf201207-presen
Lxc cf201207-presenLxc cf201207-presen
Lxc cf201207-presenKouhei Maeda
 
ラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよnpsg
 
Trema での Open vSwitch
Trema での Open vSwitchTrema での Open vSwitch
Trema での Open vSwitchkazuyas
 
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
 ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイドEtsuji Nakai
 
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチプロセスとコンテキストスイッチ
プロセスとコンテキストスイッチKazuki Onishi
 
Kernel vm study_2_xv6_scheduler_part1_revised
Kernel vm study_2_xv6_scheduler_part1_revisedKernel vm study_2_xv6_scheduler_part1_revised
Kernel vm study_2_xv6_scheduler_part1_revisedToshiaki Nozawa
 
GoogleのSHA-1のはなし
GoogleのSHA-1のはなしGoogleのSHA-1のはなし
GoogleのSHA-1のはなしMITSUNARI Shigeo
 
Tricky implementation of Go ARM soft float
Tricky implementation of Go ARM soft floatTricky implementation of Go ARM soft float
Tricky implementation of Go ARM soft floatTetsuyuki Kobayashi
 
Open vSwitchソースコードの全体像
Open vSwitchソースコードの全体像 Open vSwitchソースコードの全体像
Open vSwitchソースコードの全体像 Sho Shimizu
 
hpingで作るパケット
hpingで作るパケットhpingで作るパケット
hpingで作るパケットTakaaki Hoyo
 
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタDRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ株式会社サードウェア
 
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係Altera SDK for OpenCL解体新書 : ホストとデバイスの関係
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係Mr. Vengineer
 
UEFI時代のブートローダ
UEFI時代のブートローダUEFI時代のブートローダ
UEFI時代のブートローダTakuya ASADA
 

What's hot (20)

PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~
PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~
PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~
 
Ubuntuで始めるコンテナ技術入門
Ubuntuで始めるコンテナ技術入門Ubuntuで始めるコンテナ技術入門
Ubuntuで始めるコンテナ技術入門
 
Hello, systemd
Hello, systemdHello, systemd
Hello, systemd
 
Lxc cf201207-presen
Lxc cf201207-presenLxc cf201207-presen
Lxc cf201207-presen
 
ラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよ
 
Trema での Open vSwitch
Trema での Open vSwitchTrema での Open vSwitch
Trema での Open vSwitch
 
Free bsd jail入門
Free bsd jail入門Free bsd jail入門
Free bsd jail入門
 
OpenvswitchでVPS
OpenvswitchでVPSOpenvswitchでVPS
OpenvswitchでVPS
 
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
 ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
 
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチプロセスとコンテキストスイッチ
プロセスとコンテキストスイッチ
 
Kernel vm study_2_xv6_scheduler_part1_revised
Kernel vm study_2_xv6_scheduler_part1_revisedKernel vm study_2_xv6_scheduler_part1_revised
Kernel vm study_2_xv6_scheduler_part1_revised
 
GoogleのSHA-1のはなし
GoogleのSHA-1のはなしGoogleのSHA-1のはなし
GoogleのSHA-1のはなし
 
Tricky implementation of Go ARM soft float
Tricky implementation of Go ARM soft floatTricky implementation of Go ARM soft float
Tricky implementation of Go ARM soft float
 
Minix smp
Minix smpMinix smp
Minix smp
 
Open vSwitchソースコードの全体像
Open vSwitchソースコードの全体像 Open vSwitchソースコードの全体像
Open vSwitchソースコードの全体像
 
hpingで作るパケット
hpingで作るパケットhpingで作るパケット
hpingで作るパケット
 
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタDRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
 
Memory sanitizer
Memory sanitizerMemory sanitizer
Memory sanitizer
 
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係Altera SDK for OpenCL解体新書 : ホストとデバイスの関係
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係
 
UEFI時代のブートローダ
UEFI時代のブートローダUEFI時代のブートローダ
UEFI時代のブートローダ
 

Similar to Mincs 日本語版

Docker & Kubernetes基礎
Docker & Kubernetes基礎Docker & Kubernetes基礎
Docker & Kubernetes基礎Daisuke Hiraoka
 
今さら聞けない人のためのDocker超入門
今さら聞けない人のためのDocker超入門今さら聞けない人のためのDocker超入門
今さら聞けない人のためのDocker超入門Toru Miyahara
 
Dockerを支える技術
Dockerを支える技術Dockerを支える技術
Dockerを支える技術Etsuji Nakai
 
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINARVirtualTech Japan Inc.
 
今さら聞けない人のためのDocker超入門 CentOS 7.2対応版
今さら聞けない人のためのDocker超入門 CentOS 7.2対応版今さら聞けない人のためのDocker超入門 CentOS 7.2対応版
今さら聞けない人のためのDocker超入門 CentOS 7.2対応版VirtualTech Japan Inc.
 
Dockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックDockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックEmma Haruka Iwao
 
今さら聞けない人のためのDocker超入門 - KOF
今さら聞けない人のためのDocker超入門 - KOF今さら聞けない人のためのDocker超入門 - KOF
今さら聞けない人のためのDocker超入門 - KOFVirtualTech Japan Inc.
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on dockerHiroshi Miura
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on dockerHiroshi Miura
 
20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_BetaKohei KaiGai
 
Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話Masahito Zembutsu
 
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月VirtualTech Japan Inc.
 
A_road_to_AMBER_simulations_ver_1.0
A_road_to_AMBER_simulations_ver_1.0A_road_to_AMBER_simulations_ver_1.0
A_road_to_AMBER_simulations_ver_1.0Satoshi Kume
 
もしCloudStackのKVMホストでPCIパススルーできるようになったら
もしCloudStackのKVMホストでPCIパススルーできるようになったらもしCloudStackのKVMホストでPCIパススルーできるようになったら
もしCloudStackのKVMホストでPCIパススルーできるようになったらTakuma Nakajima
 
コンテナ情報交換会2
コンテナ情報交換会2コンテナ情報交換会2
コンテナ情報交換会2Masahide Yamamoto
 
最低限の開発環境を整えるには
最低限の開発環境を整えるには最低限の開発環境を整えるには
最低限の開発環境を整えるにはvi-iv
 
Docker調査20150704
Docker調査20150704Docker調査20150704
Docker調査20150704HommasSlide
 
Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Masahito Zembutsu
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Masahito Zembutsu
 

Similar to Mincs 日本語版 (20)

Docker & Kubernetes基礎
Docker & Kubernetes基礎Docker & Kubernetes基礎
Docker & Kubernetes基礎
 
今さら聞けない人のためのDocker超入門
今さら聞けない人のためのDocker超入門今さら聞けない人のためのDocker超入門
今さら聞けない人のためのDocker超入門
 
Dockerを支える技術
Dockerを支える技術Dockerを支える技術
Dockerを支える技術
 
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR
仮想化技術として注目されているDocker入門 - PASONATECH ADVANTAGE SEMINAR
 
今さら聞けない人のためのDocker超入門 CentOS 7.2対応版
今さら聞けない人のためのDocker超入門 CentOS 7.2対応版今さら聞けない人のためのDocker超入門 CentOS 7.2対応版
今さら聞けない人のためのDocker超入門 CentOS 7.2対応版
 
Dockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックDockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニック
 
今さら聞けない人のためのDocker超入門
今さら聞けない人のためのDocker超入門今さら聞けない人のためのDocker超入門
今さら聞けない人のためのDocker超入門
 
今さら聞けない人のためのDocker超入門 - KOF
今さら聞けない人のためのDocker超入門 - KOF今さら聞けない人のためのDocker超入門 - KOF
今さら聞けない人のためのDocker超入門 - KOF
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 
20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta
 
Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話
 
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
 
A_road_to_AMBER_simulations_ver_1.0
A_road_to_AMBER_simulations_ver_1.0A_road_to_AMBER_simulations_ver_1.0
A_road_to_AMBER_simulations_ver_1.0
 
もしCloudStackのKVMホストでPCIパススルーできるようになったら
もしCloudStackのKVMホストでPCIパススルーできるようになったらもしCloudStackのKVMホストでPCIパススルーできるようになったら
もしCloudStackのKVMホストでPCIパススルーできるようになったら
 
コンテナ情報交換会2
コンテナ情報交換会2コンテナ情報交換会2
コンテナ情報交換会2
 
最低限の開発環境を整えるには
最低限の開発環境を整えるには最低限の開発環境を整えるには
最低限の開発環境を整えるには
 
Docker調査20150704
Docker調査20150704Docker調査20150704
Docker調査20150704
 
Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
 

Mincs 日本語版

  • 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. 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. 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. LEADING COLLABORATION IN THE ARM ECOSYSTEM MINCSってなーに? わーい!! たーの しー!!!
  • 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. LEADING COLLABORATION IN THE ARM ECOSYSTEM なんでシェルスクリプトなの? 単純に好きだから :-) - *nix管理者にもわかりやすい - コマンドの羅列が中心だし。 - 簡単に変更できる - プロトタイピングに向いている - デプロイも簡単 - アーキ依存性がない - とても小さい - コピーするだけでいい
  • 7. LEADING COLLABORATION IN THE ARM ECOSYSTEM MINCSの利用例 教育用コンテナエンジンとして - Dockerや他のコンテナエンジンとMINCSの関係は*nixとMINIXのような関係 - コメントをつけながら動作を見て書き換えられる - まあ、ほとんどの実装が OSSの今、あまり意味はない テストベッドとして - Linuxのコンテナ関連機能がどう動くかをテストする - シェルスクリプトの練習台 - Linuxカーネルのテスト環境(後述) あるいは趣味の一品
  • 8. LEADING COLLABORATION IN THE ARM ECOSYSTEM MINCS Internal MINCS Design Minc boot process step by step
  • 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. LEADING COLLABORATION IN THE ARM ECOSYSTEM Mincのブートプロセス 以下の順序でコンテナを設定・起動する 1. ネットワーク設定 2. リソース制限の付与 3. 名前空間の変更 4. 新しい名前空間の設定 5. 新しい名前空間内でコマンド実行 0. オプションの解析
  • 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. LEADING COLLABORATION IN THE ARM ECOSYSTEM パフェを作る要領で下から作り上げる コンテナの起動 Namespace & cgroups Layered filesystem Pidfile Device files procfs Sysfs & tmpfs Your application Chroot/Capsh
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. LEADING COLLABORATION IN THE ARM ECOSYSTEM その他のオプション よく使われるオプション --root DIR - rootfsのディレクトリを指定する(なければ’/’を使う) --direct - overlayfsを使わず、直に指定したrootfsを書き換える --tempdir DIR - 一時ディレクトリを作らず、指定されたディレクトリを使う(--keepの意味も含む) --keep - コンテナ終了時に一時ディレクトリを消さない --bind DIR1:DIR2 - ホストディレクトリ (DIR1) をコンテナのパス (DIR2)にバインドする
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. LEADING COLLABORATION IN THE ARM ECOSYSTEM Options: --ftrace コンテナプロセスをftraceでトレースするための拡張機能 - 自動でコンテナのPIDだけをフィルタするように設定してくれる - --ftrace <トレーススクリプト> - トレーススクリプトはシェルスクリプトで記述 - 普段ftraceを使い慣れていれば問題ない。 - samples/ftrace/ 以下に一応サンプルがある - トレース結果の読み出しはホスト側から行う - いずれにしても管理者権限がないと読み出せない
  • 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. 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. 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. 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. 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. 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. LEADING COLLABORATION IN THE ARM ECOSYSTEM Badgerの制限 最近開発を始めたので未解決の課題が多い - Netns対応:多分特殊なやり方がいるっぽい - Mntns対応:コンテナ内部で2重マウント状態になっている模様 - このため、一度復帰させたコンテナを再度ダンプできない - コードが汚い - お察し・・・  試してみたい場合はcriuブランチをcheckout
  • 43. LEADING COLLABORATION IN THE ARM ECOSYSTEM Random talks - Ermine-breederでカーネルデバッグ - Pivot_rootとChroot - Libcap問題
  • 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. 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. 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. 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. LEADING COLLABORATION IN THE ARM ECOSYSTEM おわりに - MINCSはポータブルで小さいコンテナエンジン - だけどいろんなことに使える - Dockerhubからイメージファイルだけ取ってきたい - カーネルビルド(クロスビルド)やテスト環境を手軽に揃えたい - クロスアーキのrootfs環境を作りたい - CRIUでチェックポイントリスタートを試してみたい - 手軽にuser-mode-linuxを試したい - 拡張性は無限大 - シェルスクリプトさえ書ければ拡張できる
  • 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. LEADING COLLABORATION IN THE ARM ECOSYSTEM Thank you! Please visit https://github.com/mhiramat/mincs and fork it!
  • 51. LEADING COLLABORATION IN THE ARM ECOSYSTEM Questions?
  • 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