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)
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!
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