コンテナー実行環境
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 によりセットアップ
されるかもしれません。