コンテナ実行環境#
LXD は実行するコンテナに一貫性のある環境を提供しようとします。
正確な環境はカーネルの機能やユーザーの設定によって若干異なりますが、それ以外は 全てのコンテナに対して同一です。
PID1#
LXD は何であれ /sbin/init
に置かれているものをコンテナの初期プロセス (PID 1) として起動します。
このバイナリは親が変更されたプロセス (訳注: ゾンビプロセスなど) の処理を含めて適切な init
システムとして振る舞う必要があります。
LXD がコンテナの PID1 とコミュニケーションするのは以下の2つのシグナルだけです。
SIGINT
コンテナのリブートをトリガーするSIGPWR
(かあるいはSIGRTMIN
+3) コンテナのクリーンなシャットダウンをトリガーする
PID1 の初期環境は container=lxc
以外は空です。 init システムは container=lxc
をランタイムを検出する (訳注: lxc で動いていることを知る) ために使用できます。
デフォルトの 3 個 (訳注: stdin, stdout, stderr) より上の全てのファイルディスクリプタは PID1 が起動される前に閉じられます。
ファイルシステム#
LXD は使用するどのイメージから生成する新規のコンテナは少なくとも以下のファイルシステムを 含むことを前提とします。
/dev
(空のディレクトリ)/proc
(空のディレクトリ)/sbin/init
(実行ファイル)/sys
(空のディレクトリ)
デバイス#
LXD のコンテナは tmpfs
ファイルシステムをベースとする最低限で一時的な /dev
を
持ちます。これは tmpfs
であって devtmpfs
ではないので、デバイスノードは手動で作成
されたときのみ現れます。
デバイスノードの標準セットでは以下のデバイスがセットアップされます。
/dev/console
/dev/fd
/dev/full
/dev/log
/dev/null
/dev/ptmx
/dev/random
/dev/stdin
/dev/stderr
/dev/stdout
/dev/tty
/dev/urandom
/dev/zero
標準セットのデバイスに加えて、以下のデバイスも利便性のためにセットアップされます。
/dev/fuse
/dev/net/tun
/dev/mqueue
マウント#
LXD では以下のマウントがデフォルトでセットアップされます。
/proc
(proc
)/sys
(sysfs
)/sys/fs/cgroup/*
(cgroupfs
) (cgroup namespace サポートを欠くカーネルの場合のみ)
以下のパスがホスト上に存在する場合は自動的にマウントされます。
/proc/sys/fs/binfmt_misc
/sys/firmware/efi/efivars
/sys/fs/fuse/connections
/sys/fs/pstore
/sys/kernel/debug
/sys/kernel/security
これらを引き渡す理由は、これらがマウントされているか、コンテナ内でマウント できるようになっているかが必要とされているレガシーな init システムのためです。
これらのほとんどは非特権コンテナ内からは書き込み可能ではなく (あるいは読み取り可能 ですらなく)、特権コンテナ内では LXD の AppArmor ポリシーによってブロックされます。
ネットワーク#
LXD コンテナはネットワークデバイスをいくつでもアタッチできます。
これらの名前はユーザーにオーバーライドされない限りは ethX
で X は
連番です。
コンテナからホストへのコミュニケーション#
LXD は /dev/lxd/sock
にソケットをセットアップし、コンテナ内の root ユーザーはこれを使ってホストの
LXD とコミュニケーションできます。
API は ここにドキュメント化されています.
LXCFS#
ホストに LXCFS がある場合は、コンテナ用に自動的にセットアップされます。
これは通常いくつかの /proc
ファイルになり、それらは bind mount を通してオーバーライド
されます。古いカーネルでは /sys/fs/cgroup
の仮想バージョンも LXCFS によりセットアップ
されるかもしれません。