コンテナ実行環境#

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コンテナはネットワークデバイスをいくつでもアタッチできます。 これらの名前はユーザーにオーバーライドされない限りはethXXは連番です。

コンテナからホストへのコミュニケーション#

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が起動される前に閉じられます。