コンテナ実行環境#
LXD は実行する全てのコンテナに一貫性のある環境を提供しようとします。
正確な環境はカーネルの機能やユーザーの設定によって若干異なりますが、それ以外は全てのコンテナに対して同一です。
ファイルシステム#
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コンテナはネットワークデバイスをいくつでもアタッチできます。
これらの名前はユーザーにオーバーライドされない限りはethX
でX
は連番です。
コンテナからホストへのコミュニケーション#
LXDは/dev/lxd/sock
にソケットをセットアップし、コンテナ内のrootユーザーはこれを使ってホストのLXDとコミュニケーションできます。
APIドキュメントはインスタンス〜ホスト間の通信を参照してください。
マウント#
以下のマウントがデフォルトでセットアップされます。
/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ポリシーによってブロックされます。
LXCFS#
ホストに LXCFS がある場合は、コンテナ用に自動的にセットアップされます。
これは通常いくつかの/proc
ファイルになり、それらは bind mount を通してオーバーライドされます。
古いカーネルでは/sys/fs/cgroup
の仮想バージョンもLXCFSによりセットアップされるかもしれません。
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が起動される前に閉じられます。