lxc.container.conf(5)

NAME
lxc.container.conf - LXC コンテナ設定ファイル

説明
LXC は良く知られた、多くのテストが行われた Linux コンテナのランタイムです。LXC は、2008 年以来アクティブに開発されており、世界中の重要な本番環境で実証されています。開発への貢献者の中には、Linux カーネル内の良く知られた様々なコンテナ機能の実装に貢献した人と同じ人もいます。

LXC は主にシステムコンテナにフォーカスを当てています。つまり、VM で得られる環境と可能な限り近い環境を提供を提供するにも関わらず、別々のカーネルを実行したり、ハードウェアをすべてシミュレートしたりすることによるオーバーヘッドがないコンテナのことです。

このような環境は、名前空間 (namespace)、強制アクセスコントロール、cgroup といったカーネルのセキュリティ機能の組み合わせで実現しています。

LXC は非特権コンテナをサポートしています。非特権コンテナは、いかなる特権も持たずに実行するコンテナです。非特権コンテナの実行には、コンテナを実行しているカーネルにユーザ名前空間 (user namespace) のサポートが必要です。LXC は、ユーザ名前空間がメインラインカーネルにマージされてから、初めて非特権コンテナをサポートしたランタイムです。

本質的には、ユーザ名前空間は与えられた UID、GID の組を隔離します。ユーザ名前空間は、ホスト上の UID、GID のある範囲を、それとは異なるコンテナ上の UID、GID の範囲へマッピングすることで実現します。カーネルは、ホスト上では実際には UID、GID は特権を持たないにも関わらず、コンテナ内ではすべての UID、GID が期待されるように見えるように変換を行います。 例えば、コンテナ内では UID、GID が 0 として実行中のプロセスは、ホスト上では UID、GID が 100000 として見えるでしょう。実装と動作の詳細は、ユーザ名前空間の man ページから得られます。UID と GID のマッピングは \FClxc.id_map\F[] を使って定義できます。

Linux コンテナは、簡単な設定ファイルで定義します。設定ファイル中のオプションは key = value の形で一行で表します。'#' は、その行はコメントであることを示します。ケーパビリティや cgroup のオプションのような、リスト形式で指定するオプションでは、value がない形式で指定でき、そのように使うと、それ以前に定義した値をすべてクリアします。

LXC は、シングルドットを使って設定キーの名前空間を表します。\FClxc.network\F[] のような複雑な設定キーは、\FClxc.network.type\F[]、\FClxc.network.link\F[]、\FClxc.network.ipv6\F[] や、さらに細分化された設定向けの色々なサブキーを持つことを意味します。

  設定
複数の関係するコンテナの管理を容易にするために、コンテナの設定ファイルに別のファイルをロードすることが可能です。 例えば、ネットワークの設定を、複数のコンテナから include させるように 1 つのファ�\x82\xA4ルに定義することが可能です。 その場合、コンテナが他のホストに移動すると、そのファイルだけを更新する必要があるかもしれません。

\FClxc.include\F[]
    include させたいファイルを指定します。 include するファイルは、lxc 設定ファイルのフォーマットとして有効でなければいけません。

  アーキテクチャ
コンテナに対してアーキテクチャを設定することが可能です。 例えば、64 ビットのホスト上で 32 ビットのバイナリを動かすために 32 ビットアーキテクチャを設定することが可能です。 この設定を行うことにより、パッケージのダウンロードを行うなどの作業のうち、アーキテクチャ名に依存するような作業を行うコンテナスクリプトの修正を行います。

\FClxc.arch\F[]
    コンテナに設定するアーキテクチャを指定します。 有効なオプションには以下のようなものがあります。 \FCx86\F[], \FCi686\F[], \FCx86_64\F[], \FCamd64\F[]

  ホスト名
utsname セクションは、コンテナに設定されるホスト名を定義します。 コンテナは、システムのホスト名を変えることなく、自身のホスト名を持つ事が可能です。 このことにより、ホスト名はコンテナ専用となります。

\FClxc.utsname\F[]
    コンテナのホスト名を指定します。

  クリーンなシャットダウン時のシグナル
コンテナをクリーンにシャットダウンするためにコンテナの init プロセスに送るシグナル名か番号を指定できます。init システムによって、クリーンなシャットダウンを行うために使うシグナルは異なります。このオプションではシグナルとして kill(1) で使う形式を指定できます。 例えば SIGKILL, SIGRTMIN+14, SIGRTMAX-10 のような形式、もしくは数字を指定します。デフォルトのシグナルは SIGPWR です。

\FClxc.haltsignal\F[]
    コンテナをシャットダウンするために使うシグナルを指定します。

  リブート時のシグナル
コンテナをリブートするために送るシグナル名か番号を指定できます。このオプションではシグナルとして kill(1) で使う形式を指定できます。 例えば SIGKILL, SIGRTMIN+14, SIGRTMAX-10 のような形式、もしくは数字を指定します。デフォルトのシグナルは SIGINT です。

\FClxc.rebootsignal\F[]
    コンテナをリブートするために使うシグナルを指定します。

  強制停止時のシグナル
コンテナを強制的にシャットダウンするために送るシグナル名か番号を指定できます。このオプションではシグナルとして kill(1) で使う形式を指定できます。 例えば SIGKILL, SIGRTMIN+14, SIGRTMAX-10 のような形式、もしくは数字を指定します。デフォルトのシグナルは SIGKILL です。

\FClxc.stopsignal\F[]
    コンテナを停止するのに使用するシグナルを指定します。

  INIT コマンド
コンテナの init として使うコマンドを設定します。 このオプションは lxc-execute では無視されます。 デフォルトは /sbin/init です。

\FClxc.init_cmd\F[]
    init として使うバイナリの、コンテナの rootfs からの絶対パスを指定します。

  INIT が使う ID
init と後続のコマンドが使う UID/GID を設定します。システムコンテナを起動するのに非 root な UID を使うと、特権がないために動作しないでしょう。UID/GID の指定は、通常はアプリケーションコンテナの動作の際に役に立ちます。 デフォルト値: UID(0)、GID(0)

\FClxc.init_uid\F[]
    init が使う UID です。

\FClxc.init_gid\F[]
    init が使う GID です。

  一時的なコンテナ
シャットダウン後にコンテナを削除するかどうかを指定できます。

\FClxc.ephemeral\F[]
    指定できる値は 0 または 1 のみです。この値を 1 に設定すると、シャットダウン後にコンテナを削除します。

  ネットワーク
ネットワークセクションは、コンテナ内でどのようにネットワークを仮想化するかを定義します。 ネットワークの仮想化はレイヤー 2 で作動します。 ネットワークの仮想化を使用するためには、コンテナのネットワークインターフェースを定義しなければなりません。 いくつかの仮想インターフェースをアサインすることができます。 そして、仮に物理ネットワークインターフェースが一つしかなくても、コンテナ内でいくつもの仮想インターフェースを使うことができます。

\FClxc.network\F[]
    値を指定せずに使い、それ以前に定義されたすべてのネットワークオプションをクリアできます。

\FClxc.network.[i].type\F[]
    コンテナがどの種類のネットワーク仮想化を使うかを指定します。すべての \FClxc.network.*\F[] キーに、追加のインデックス \FCi\F[] を使うと、複数のネットワークを指定できます。例えば、\FClxc.network.0.type = veth\F[] と \FClxc.network.1.type = veth\F[] は、同じタイプの異なるネットワークを 2 つ指定します。 同じインデックスを指定したキーはすべて同じネットワークの指定になります。例えば、\FClxc.network.0.link = br0\F[] は \FClxc.network.0.type\F[] と同じネットワークの設定になります。 現時点では、以下のネットワーク仮想化のタイプが使えます: \FCnone:\F[] ホストのネットワーク名前空間を共有します。 これにより、ホストのネットワークデバイスをコンテナ内で使うことが可能になります。 もしコンテナもホストも init として upstart を使っている場合、(例えば) コンテナ内で 'halt' を実行すると、ホストがシャットダウンしてしまうことにもなります。 \FCempty:\F[] ループバックインターフェースだけを作成します。 \FCveth:\F[] 一方がコンテナに、もう一方が \FClxc.network.link\F[] オプションで指定されたブリッジに接続されるペアの仮想イーサネットデバイスを作成します。 もし、ブリッジが指定されていない場合、veth ペアデバイスは作成されますが、ブリッジには接続されません。 ブリッジはコンテナが開始する前にシステムで事前に設定しておく必要があります。 lxc はコンテナ外の設定を扱うことはありません。 デフォルトでは、lxc がコンテナの外部に属するネットワークデバイスに対する名前を決定します。 しかし、もしこの名前を自分で指定したい場合、\FClxc.network.veth.pair\F[] オプションを使って名前を設定し、lxc に対して指定をすることができます (非特権コンテナの場合をのぞきます。セキュリティ上の理由からこのオプションは無視されます)。 \FCvlan:\F[] vlan インターフェースは \FClxc.network.link\F[] で指定されたインターフェースとリンクし、コンテナに割り当てられます。 vlan の指定は \FClxc.network.vlan.id\F[] オプションで指定します。 \FCmacvlan:\F[] macvlan インターフェースは \FClxc.network.link\F[] により指定されるインターフェースとリンクし、コンテナに割り当てられます。 \FClxc.network.macvlan.mode\F[] でモードを指定すると、その macvlan の指定を、同じ上位デバイスで異なる macvlan の間の通信をする時に使います。 指定できるモードは \FCprivate\F[]、\FCvepa\F[]、\FCbridge\F[]、\FCpassthru\F[] のいずれかです。 \FCprivate\F[] モードの場合、デバイスは同じ上位デバイスの他のデバイスとの通信を行いません (デフォルト)。 新しい仮想イーサネットポート集約モード (Virtual Ethernet Port Aggregator (VEPA)) である \FCvepa\F[] モードの場合、隣接したポートが、ソースとデスティネーションの両方が macvlan ポートに対してローカルであるフレームを全て返すと仮定します。 すなわち、ブリッジが reflective relay として設定されているということです。 上位デバイスから入ってくるブロードキャストフレームは、VEPA モードである全ての macvlan インターフェースに送りつけられます。 ローカルのフレームはローカルには配送されません。 \FCbridge\F[] モードの場合、同じポートの異なる macvlan インターフェースの間のシンプルなブリッジとして動作します。 あるインターフェースから他のインターフェースへのフレームは、直接配送され、外部には送出されません。 ブロードキャストフレームは、全ての他のブリッジと外部のインターフェースに対して送られます。 しかし、reflective relay からフレームが返ってきたときは、再度それを配送することはしません。 全ての MAC アドレスを知っているので、ブリッジモジュールのように、macvlan ブリッジモードは学習や STP の必要はありません。 \FCpassthru\F[] モードの場合、物理インターフェースで受け取った全てのフレームは macvlan インターフェースに転送されます。\FCpassthru\F[] モードの場合、ひとつの macvlan インターフェースだけが、ひとつの物理インターフェースに対して設定できます。 \FCphys:\F[] \FClxc.network.link\F[] で指定された、すでに存在しているインターフェースがコンテナに割り当てられます。

\FClxc.network.[i].flags\F[]
    ネットワークに対して行うアクションを指定します。 \FCup:\F[] インターフェースを起動させます。

\FClxc.network.[i].link\F[]
    実際のネットワークトラフィックに使うインターフェースを指定します。

\FClxc.network.[i].mtu\F[]
    インターフェースに対する MTU を指定します。

\FClxc.network.[i].name\F[]
    インターフェース名は動的に割り当てられます。しかし、もしコンテナが使用する設定ファイルが一般的な名前を使用するために、他の特定の名前が必要であれば (例えば eth0 など)、コンテナ内のインターフェースは、このオプションで指定した名前にリネームされます。

\FClxc.network.[i].hwaddr\F[]
    仮想インターフェースの MAC アドレスは、デフォルトでは動的に割り当てられます。しかし、MAC アドレスの衝突や、リンクローカルIPv6 アドレスを常に同じにした場合などは、このオプションが必要です。アドレス中の "x" という文字は、ランダムな値に置き換えられます。これによりテンプレートに hwaddr を設定することが可能になります。

\FClxc.network.[i].ipv4\F[]
    仮想インターフェースに割り当てる ipv4 アドレスを指定します。複数行により複数の ipv4 アドレスを指定します。このアドレスは x.y.z.t/m というフォーマットで指定します。例) 192.168.1.123/24

\FClxc.network.[i].ipv4.gateway\F[]
    コンテナでゲートウェイとして使う IPv4 アドレスを指定します。アドレスは x.y.z.t というフォーマットです。例) 192.168.1.123 \FCauto\F[] という特別な値を指定できます。これは (\FClxc.network.link\F[] で指定した) ブリッジインターフェースの最初のアドレスを使用し、それをゲートウェイに使うという意味になります。\FCauto\F[] はネットワークタイプとして \FCveth\F[] と \FCmacvlan\F[] を指定している時だけ有効となります。

\FClxc.network.[i].ipv6\F[]
    仮想インターフェースに割り当てる ipv6 アドレスを指定します。複数行により複数の ipv6 アドレスを指定します。このアドレスは x::y/m というフォーマットで指定します。例) 2003:db8:1:0:214:1234:fe0b:3596/64

\FClxc.network.[i].ipv6.gateway\F[]
    コンテナでゲートウェイとして使う IPv6 アドレスを指定します。アドレスは x::y というフォーマットです。例) 2003:db8:1:0::1 \FCauto\F[] という特別な値を記述する事も可能です。これは (\FClxc.network.link\F[] で指定した) ブリッジインターフェースの最初のアドレスを使用し、それをゲートウェイに使うという意味になります。\FCauto\F[] はネットワークタイプとして \FCveth\F[] と \FCmacvlan\F[] を指定している時だけ有効となります。

\FClxc.network.[i].script.up\F[]
    ホスト側から使われる、ネットワークの作成と設定が済んだ後に実行するスクリプトを指定します。以下の引数がスクリプトに渡されます: コンテナ名、設定セクション名(net)。 その後の引数はスクリプトのフックで使われる設定セクションに依存します。以下がネットワークシステムによって使われます: 実行コンテキスト (up)、ネットワークのタイプ (empty/veth/macvlan/phys) ネットワークのタイプによっては、更に別の引数が渡されるかもしれません: veth/macvlan/phys の場合 (ホスト側の) デバイス名 スクリプトからの標準出力は debug レベルでロギングされます。標準エラー出力はロギングされません。しかし、フックの標準エラー出力を標準出力にリダイレクトすることにより保存することは可能です。

\FClxc.network.[i].script.down\F[]
    ホスト側から使われる、ネットワークを破壊する前に実行するスクリプトを指定します。以下の引数がスクリプトに渡されます: コンテナ名、設定セクション名(net)。 その後の引数はスクリプトのフックで使われる設定セクションに依存します。以下がネットワークシステムによって使われます: 実行コンテキスト (up)、ネットワークのタイプ (empty/veth/macvlan/phys)。 ネットワークのタイプによっては、更に別の引数が渡されるかもしれません: veth/macvlan/phys。そして最後に (ホスト側の) デバイス名が渡されます。 スクリプトからの標準出力は debug レベルでロギングされます。標準エラー出力はロギングされません。しかし、フックの標準エラー出力を標準出力にリダイレクトすることにより保存することは可能です。

  新しい擬似端末のインスタンス (DEVPTS)
さらに厳しい隔離のために、コンテナは自身のプライベートな pseudo tty (擬似端末) を持つことが可能です。

\FClxc.pts\F[]
    もし設定された場合、コンテナは新しい pseudo tty インスタンスを持ち、それを自身のプライベートとします。 この値は pts インスタンスに許可される pseudo tty の最大数を指定します (この制限はまだ実装されていません)。

  コンテナのシステムコンソール
コンテナでルートファイルシステムを持つように設定されており、inittab ファイルでコンソールの使用が設定されている場合、このコンソールの出力がどこになされるのかを指定したいと思うでしょう。

\FClxc.console.logfile\F[]
    コンソール出力を書き込むファイルのパスを指定します。

\FClxc.console\F[]
    コンソールを割り当てるデバイスのパスを指定します。'none' というキーワードは、単純にコンソールを無効にします。 'none' を指定し、コンテナ内のコンソールに対するデバイスノードを /dev/console に作成するか、もしくはホストの /dev/console をコンテナ内の /dev/console に bind mount する場合、そのコンテナはホストの /dev/console へ直接アクセスを行うことに注意が必要です。 そのコンテナがデバイスへの書き込み権を持っている場合は危険ですので、注意してこの指定を使用する必要があります。

  TTY を通したコンソール
このオプションはコンテナが root ファイルシステムを持つように設定されており、inittab ファイルで tty 上に getty の起動が設定されている場合に役に立ちます。 このオプションはコンテナで利用できる tty の数を指定します。 inittab ファイルに設定する getty の数は、このオプションの指定する tty の数より大きくしてはいけません。 さもなければ、超過した分の getty セッションはコンソールか /var/log/messages にうっとうしいメッセージを生死を表示しながら、永久に生死を繰り返すでしょう。

\FClxc.tty\F[]
    コンテナに作成出来る tty の数を指定します。

  コンソールデバイスの位置
LXC のコンソールはホストによって作られ、コンテナ内で要求されたデバイスに bind マウントされた Unix98 PTY 経由で提供されます。 デフォルトでは \FC/dev/console\F[] と \FC/dev/ttyN\F[] に bind マウントされます。 これはゲスト内でのパッケージのアップグレードを妨げる可能性があります。 なので \FC/dev\F[] 以下のディレクトリを指定することができます。 LXC はこのディレクトリ以下にファイルを作成し、これらのファイルを bind マウントします。 そして、これらの (作成された) ファイルは \FC/dev/console\F[] と \FC/dev/ttyN\F[] にシンボリックリンクされます。 シンボリックリンクを消去したり置き換えたりすることは可能ですから、パッケージのアップグレードは成功します。

\FClxc.devttydir\F[]
    コンテナのコンソールデバイスを作成するための \FC/dev\F[] 以下のディレクトリを指定します。 LXC は /dev/console に対する bind mount や /dev/console デバイスノードをこのディレクトリ以下に移動することに注意が必要です。

  /DEV ディレクトリ
デフォルトでは、lxc はコンテナの \FC/dev\F[] 以下に fd, stdin, stdout, stderr のシンボリックリンクを作成しますが、自動的にはデバイスノードのエントリは作成しません。 これは、コンテナの rootfs で必要な設定を行えるようにするものです。 lxc.autodev が 1 に設定されている場合、コンテナの rootfs をマウントした後、LXC は新しい tmpfs を \FC/dev\F[] 以下にマウントします (500k 制限の)。 そして初期デバイスの最小限のセットを作成します。 これは、"systemd" ベースの "init" 環境のコンテナを起動する時に通常必要ですが、他の環境の場合はオプショナルなものです。 コンテナの /dev ディレクトリ内の追加デバイスは \FClxc.hook.autodev\F[] フックを使用して作成されます。

\FClxc.autodev\F[]
    コンテナの起動時に LXC が /dev をマウントして最小限の /dev を作成するのを止めるには、この値を 0 に設定してください。

  KMSG のシンボリックリンクの有効化
/dev/console へのシンボリックリンクとして /dev/kmsg を作成することを有効にします。デフォルトは 0 です。

\FClxc.kmsg\F[]
    /dev/kmsg へのシンボリックリンクを有効にするには 1 を設定してください。

  マウントポイント
マウントポイントセクションは、マウントするための区別された場所を指定します。 これらのマウントポイントは、コンテナだけに見え、コンテナ外で実行されるプロセスから見えることはありません。 例えば、/etc や /var や /home をマウントするときに役に立つでしょう。

注意: 通常 LXC は、マウント対象と相対パス指定のバインドマウントを、適切にコンテナルート以下に閉じ込めます。 これは、ホストのディレクトリやファイルに対して重ね合わせを行うようなマウントによる攻撃を防ぎます。(絶対パス指定のマウントソース中の各パスがシンボリックリンクである場合は無視されます。) しかし、もしコンテナの設定が最初に、/home/joe のようなコンテナユーザのコントロール配下にあるディレクトリを、コンテナ中のある \FCpath\F[] にマウントし、その後 \FCpath\F[] 以下でマウントが行われるような場合、コンテナユーザがタイミングを見計らって自身のホームディレクトリ以下でシンボリックリンクを操作するような TOCTTOU 攻撃が成立する可能性があります。

\FClxc.mount\F[]
    マウント情報の書かれた \FCfstab\F[] フォーマットで書かれたファイルの場所を指定します。 マウントする場所は相対バスで書くことができます。そして、ほとんどの場合にコンテナの root からの相対パスとなるはずです。例えば、以下のように書きます。
    \FC
                 proc proc proc nodev,noexec,nosuid 0 0
                 \F[]
    この例は、root ファイルシステムがどこにあっても、コンテナの /proc 以下に proc ファイルシステムをマウントします。これは、ブロックデバイスがバックエンドのファイルシステムだけでなく、コンテナのクローンにも柔軟に対応できます。 ファイルシステムがイメージファイルやブロックデバイスからマウントされている場合、3 つ目のフィールド (fs_vfstype) は mount(8) のように auto を指定することはできず、明確に指定しなければいけません。

\FClxc.mount.entry\F[]
    fstab フォーマットの一行と同じフォーマットのマウントポイントの指定をします。 fstab フォーマットに加えて、LXC ではマウントに対して独自の 2 つのオプションが使えます。 \FCoptional\F[] は、マウントが失敗しても失敗を返さずに無視します。 \FCcreate=dir\F[] と \FCcreate=file\F[] は、マウントポイントをマウントする際にディレクトリもしくはファイルを作成します。

\FClxc.mount.auto\F[]
    標準のカーネルファイルシステムで自動的にマウントするものを指定します。 これは劇的に設定を容易にする可能性があります。

    •   \FCproc:mixed\F[] (or \FCproc\F[]): \FC/proc\F[] を読み書き可能でマウントします。 ただし、\FC/proc/sys\F[] と \FC/proc/sysrq-trigger\F[] は、セキュリティとコンテナの隔離の目的でリードオンリーで再マウントされます。

    •   \FCproc:rw\F[]: \FC/proc\F[] を読み書き可能でマウントします。

    •   \FCsys:mixed\F[] (or \FCsys\F[]): /sys/devices/virtual/net のみ書き込み可能で、その他の \FC/sys\F[] はリードオンリーでマウントします。

    •   \FCsys:ro\F[]: \FC/sys\F[] を、セキュリティとコンテナの隔離の目的でリードオンリーでマウントします。

    •   \FCsys:rw\F[]: \FC/sys\F[] を読み書き可能でマウントします。

    •   \FCcgroup:mixed\F[]: \FC/sys/fs/cgroup\F[] を tmpfs でマウントし、そのコンテナの追加が行われた全ての階層構造に対するディレクトリを作製し、その cgroup の名前でその中にサブディレクトリを作製し、そのコンテナ自身の cgroup をそのディレクトリにバインドマウントします。 コンテナは自身の cgroup ディレクトリに書き込みが可能ですが、親ディレクトリはリードオンリーで再マウントされているため書き込めません。

    •   \FCcgroup:ro\F[]: \FCcgroup:mixed\F[] と同様にマウントされますが、全てリードオンリーでマウントされます。

    •   \FCcgroup:rw\F[]: \FCcgroup:mixed\F[] と同様にマウントされますが、全て読み書き可能でマウントされます。 コンテナ自身の cgroup に至るまでのパスも書き込み可能になることに注意が必要ですが、cgroup ファイルシステムにはならず、 \FC/sys/fs/cgroup\F[] の tmpfs の一部分になるでしょう。

    •   \FCcgroup\F[] (マウントオプションなしの場合): コンテナが CAP_SYS_ADMIN ケーパビリティを保持している場合、\FCcgroup:rw\F[] となります。保持していない場合、\FCcgroup:mixed\F[] となります。

    •   \FCcgroup-full:mixed\F[]: \FC/sys/fs/cgroup\F[] を tmpfs でマウントし、そのコンテナの追加が行われた全ての階層構造に対するディレクトリを作製し、ホストからコンテナまでの階層構造を全てバインドマウントし、コンテナ自身の cgroup を除いてリードオンリーにします。 \FCcgroup\F[] と比べると、コンテナ自身の cgroup に至るまでの全てのパスが tmpfs の下層のシンプルなディレクトリとなり、コンテナ自身の cgroup の外ではリードオンリーになりますが、\FC/sys/fs/cgroup/$hierarchy\F[] はホストの全ての cgroup 階層構造を含みます。 これにより、コンテナにはかなりの情報が漏洩します。

    •   \FCcgroup-full:ro\F[]: \FCcgroup-full:mixed\F[] と同様にマウントされますが、全てリードオンリーでマウントされます。

    •   \FCcgroup-full:rw\F[]: \FCcgroup-full:mixed\F[]と同様にマウントされますが、全て読み書き可能でマウントされます。 この場合、コンテナは自身の cgroup から脱出する可能性があることに注意してください (コンテナが CAP_SYS_ADMIN を持ち、自身で cgroup ファイルシステムをマウント可能なら、いずれにせよそのようにするかもしれないことにも注意してください)。

    •   \FCcgroup-full\F[] (マウントオプションなしの場合): コンテナが CAP_SYS_ADMIN ケーパビリティを保持している場合、\FCcgroup-full:rw\F[] となります。保持していない場合、\FCcgroup-full:mixed\F[] となります。
cgroup 名前空間が有効の場合、\FCcgroup\F[] の自動マウントの指定はどれも無視されます。これは、コンテナが自身でファイルシステムをマウントするため、自動マウントがコンテナの init を混乱させる可能性があるためです。 cgroup ファイルシステムの自動マウントが有効の場合、\FC/sys/fs/cgroup\F[] 以下の tmpfs は常に読み書き可能でマウントされることに注意が必要です (しかし \FC:mixed\F[] と \FC:ro\F[] の場合は、個々の階層の \FC/sys/fs/cgroup/$hierarchy\F[] は読み込み専用となるでしょう)。これは Ubuntu の mountall(8) コマンドの特異な動きに対処するためのものです。特異な動きとは、\FC/sys/fs/cgroup\F[] が読み込み専用でマウントされた状態で、コンテナが CAP_SYS_ADMIN を持たない場合、/sys/fs/cgroup を読み書き可能で再マウントしようとしてできないため、コンテナのブート時にユーザからの入力を待ってしまうというものです。 例:
\FC
              lxc.mount.auto = proc sys cgroup
              lxc.mount.auto = proc:rw sys:rw cgroup-full:rw
            \F[]

  ルートファイルシステム
コンテナのルートファイルシステムは、ホストのルートファイルシステムと異なるようにすることも可能です。

\FClxc.rootfs\F[]
    コンテナのルートファイルシステムを指定します。 この値はイメージファイル、ディレクトリ、ブロックデバイスのどれかを取ることができます。 もし指定されない場合、コンテナはホストとルートファイルシステムを共有します。 ディレクトリ、単純なブロックデバイスのバックエンドを持つコンテナの場合、パス名を使うことができます。 もし rootfs が nbd デバイスの場合、\FCnbd:file:1\F[] という指定は \FCfile\F[] を nbd デバイスとして使用し、その 1 番目のパーティションが rootfs としてマウントされます。 \FCnbd:file\F[] という指定は、nbd デバイス自身をマウントします。 \FCoverlayfs:/lower:/upper\F[] という指定は、rootfs は \FC/lower\F[] という読み込み専用でマウントされるディレクトリの上に、\FC/upper\F[] というディレクトリを読み書き可能で重ね合わせてマウントします。 \FCaufs:/lower:/upper\F[] は overlayfs で指定している部分を aufs と指定すれば同じことになります。\FCoverlayfs\F[] と \FCaufs\F[] は両方とも、複数の \FC/lower\F[] ディレクトリを指定できます。 \FCloop:/file\F[] は \FC/file\F[] を loop デバイスとして使用し、loop デバイスをマウントします。

\FClxc.rootfs.mount\F[]
    root ファイルシステムの変更の前に、\FClxc.rootfs\F[] を再帰的にどこにバインドするのかを指定します。これは pivot_root(8) システムコールが確実に成功する事を保証します。 どんなディレクトリでも良く、デフォルトでも通常は動くはずです。

\FClxc.rootfs.options\F[]
    rootfs をマウントするときに追加したいマウントオプション。

\FClxc.rootfs.backend\F[]
    使用するバックエンドのタイプを、例えば 'dir' や 'zfs' のように指定します。 コンテナ起動時に LXC が推測できますが、時間がかかります。これを指定すると、余分な処理を避けられます。

  CONTROL GROUP
CONTROL GROUP セクションは、(lxc とは) 別のサブシステムの設定を含みます。 lxc は、このサブシステム名の正しさはチェックしません。 実行時のエラーを検出するのに不便ですが、別の将来のサブシステムをサポート出来るという有利な点もあります。

\FClxc.cgroup.[subsystem name]\F[]
    設定する control group の値を指定します。 サブシステム名は、control group のそのままの名前です。 許される名前や値の書式は LXC が指示することはなく、コンテナが実行された時に実行されている Linux カーネルの機能に依存します。 例えば \FClxc.cgroup.cpuset.cpus\F[]

  ケーパビリティ
コンテナが root 権限で実行されていても、コンテナ内ではケーパビリティ (capabilities) を削除する事は可能です。

\FClxc.cap.drop\F[]
    コンテナ内で削除するケーパビリティ (capability) を指定します。 一行でスペース区切りで複数のケーパビリティを指定することも可能です。 指定は、"CAP_" というプレフィックスなしで、小文字でケーパビリティを指定します。 例えば、CAP_SYS_MODULE というケーパビリティは sys_module と指定する必要があります。 詳しくは以下を参照してください。 capabilities(7) この設定を、値を指定しない状態で使った場合、それ以前に指定された削除対象のケーパビリティの指定をすべてクリアします (lxc.cap.drop に何も指定しない状態になります)。

\FClxc.cap.keep\F[]
    コンテナ内で維持するケーパビリティを指定します。指定した以外の全てのケーパビリティはドロップされます。 特別な値 "none" が指定されている時点で、lxc はこの時点で保持することになっている全てのケーパビリティをクリアします。"none" を単独で使用するとすべてのケーパビリティを削除できます。

  APPARMOR プロファイル
lxc が apparmor サポートでコンパイルされ、インストールされている場合で、ホストで apparmor が有効な場合、コンテナが従って動くべき apparmor プロファイルは、コンテナの設定で指定することが可能です。 デフォルトは、ホストのカーネルで cgroup 名前空間が使える場合は lxc-container-default-cgnsです。使えない場合は lxc-container-default です。

\FClxc.aa_profile\F[]
    コンテナが従うべき apparmor プロファイルを指定します。 コンテナが apparmor による制限を受けないように設定するには、以下のように設定します。
    \FClxc.aa_profile = unconfined\F[]
    もし apparmor プロファイルが変更されないままでなくてはならない場合 (ネストしたコンテナである場合や、すでに confined されている場合) は以下のように設定します。
    \FClxc.aa_profile = unchanged\F[]

\FClxc.aa_allow_incomplete\F[]
    apparmor プロファイルはパス名ベースですので、多数のファイルの制限を行う際、執念深い攻撃者に対して効果的であるためにはマウントの制限が必要です。 しかし、これらのマウントの制限は upstream のカーネルではまだ実装されていません。マウントの制限なしでも、apparmor プロファイルによって予想外のダメージに対する保護が可能です。 このフラグが 0 の場合 (デフォルト)、カーネルが apparmor のマウント機能をサポートしていない場合にコンテナが起動しません。これはカーネルを更新した後に機能が退行したことが検出できるようにするためです。 不完全な apparmor の保護の下でコンテナを起動するためには、このフラグを 1 に設定してください。

  SELINUX コンテキスト
lxc が SELinux サポートでコンパイルされ、インストールされている場合で、ホストで SELinux が有効な場合、コンテナが従って動くべき SELinux コンテキストは、コンテナの設定で指定することが可能です。 デフォルトは unconfined_t であり、これは lxc がコンテキストを変えないという意味になります。 ポリシーの例と追加の情報は /usr/share/lxc/selinux/lxc.te ファイルを参照してください。

\FClxc.se_context\F[]
    コンテナが従うべき SELinux コンテキストを指定するか、unconfined_t を指定します。例えば以下のように設定します。
    \FClxc.se_context = system_u:system_r:lxc_t:s0:c22\F[]

  SECCOMP の設定
コンテナは、起動時に seccomp プロファイルをロードすることで、利用可能なシステムコールを減らして起動することが可能です。 seccomp の設定ファイルは、1 行目がバージョン番号、2 行目がポリシーのタイプで始まる必要があり、その後に設定を書きます。

現時点では、バージョン番号は 1 と 2 をサポートしています。バージョン 1 では、ポリシーはシンプルなホワイトリストですので、2 行目は "whitelist" でなければなりません。 そして残りの行には 1 行に 1 つずつ、システムコール番号を書きます。各行のシステムコール番号がホワイトリスト化され、リストにない番号は、そのコンテナではブラックリストに入ります。

バージョン 2 では、ポリシーはブラックリストもしくはホワイトリストで表され、ルールごとのアクションと、ポリシーごとのデフォルトのアクションを設定できます。そして、アーキテクチャごとの設定と、テキストで書かれたシステムコール名での設定が可能です。

以下にブラックリストのポリシーの例を示します。これは mknod 以外の全てのシステムコールが許可され、mknod が呼ばれると、何もせずに単に 0(成功) を返します。

\FC
      2
      blacklist
      mknod errno 0
      \F[]

\FClxc.seccomp\F[]
    コンテナがスタートする前にロードする seccomp の設定を含むファイルを指定します。

  UID のマッピング
コンテナは、ユーザとグループの id のマッピングを持った専用のユーザ名前空間で起動することが可能です。 たとえば、コンテナ内のユーザ id 0 を、ホストのユーザ id 200000 にマッピングすることが可能です。 コンテナの root ユーザはコンテナ内では特権を持ちますが、ホストでは特権を持ちません。 通常は、システムコンテナは id の範囲を要求し、それをマッピングします。 例えば、コンテナ内のユーザとグループの id 0 から 20,000 を 200,000 から 220,000 にマッピングします。

\FClxc.id_map\F[]
    4 つの値を記述する必要があります。 最初の文字は 'u' か 'g' のどちらかで、ユーザかグループの ID のどちらをマッピングするかを指定します。 次はコンテナのユーザ名前空間内に現れる最初のユーザ ID です。 その次は、そのユーザ ID のホスト上での値です。 最後は、ID のマッピングをいくつ連続して行うかの数を指定します。

  コンテナのフック
コンテナのフックは、コンテナの存続期間の色々な場面で実行することのできるプログラムやスクリプトです。

コンテナのフックが実行されるとき、情報がコマンドライン引数と環境変数の両方を通して渡されます。引数は:

•   コンテナ名

•   セクション (常に 'lxc')

•   フックのタイプ ('clone' や 'pre-mount' など)

•   追加の引数。clone フックの場合、lxc-clone に渡される追加の引数は、フックへの引数として追加されます。stop フックの場合は、コンテナの名前空間のそれぞれに対するファイルディスクリプタへのパスが、名前空間名とともに渡されます。

以下の環境変数がセットされます。

•   LXC_NAME: コンテナ名

•   LXC_ROOTFS_MOUNT: マウントされた root ファイルシステムへのパス

•   LXC_CONFIG_FILE: コンテナの設定ファイルのパス

•   LXC_SRC_NAME: clone フックの場合、元のコンテナの名前

•   LXC_ROOTFS_PATH: コンテナの lxc.rootfs エントリ。これはマウントされた rootfs が存在する場所にはならないでしょう。それには LXC_ROOTFS_MOUNT を使用してください。

スクリプトからの標準出力は debug レベルでロギングされます。 標準エラー出力はロギングされません。 しかし、フックの標準エラー出力を標準出力にリダイレクトすることにより保存することは可能です。

\FClxc.hook.pre-start\F[]
    コンテナの tty、コンソールの作成、マウントが実行される前に、ホストの名前空間内で実行するフック。

\FClxc.hook.pre-mount\F[]
    コンテナのファイルシステムの名前空間で実行されますが、rootfs が設定される前に実行するフック。 これにより rootfs の操作が可能になります。 例えば、暗号化されたファイルシステムのマウントなどです。 このフック内でなされるマウントはホストには影響しません (mounts propagation を除いて)。 なので、それらはコンテナがシャットダウンする時に自動的にクリーンアップされます。

\FClxc.hook.mount\F[]
    マウントが完了した後ですが、pivot_root の前にコンテナの名前空間で実行されるフック。

\FClxc.hook.autodev\F[]
    \FClxc.autodev\F[] == 1 が設定されている場合で、マウントが完了し、マウント時のフックも実行された後ですが、pivot_root の前にコンテナの名前空間で実行するフック。 このフックの目的は、systemd ベースのコンテナ向けの autodev オプションが設定されている時に、コンテナの /dev ディレクトリを設定するのを支援することです。コンテナの /dev ディレクトリは、このフックが実行される時有効な ${\FCLXC_ROOTFS_MOUNT\F[]} 環境変数からの相対パスとなります。

\FClxc.hook.start\F[]
    コンテナの init が実行される直前にコンテナの名前空間で実行されるフック。 コンテナ内で利用可能なプログラムである必要があります。

\FClxc.hook.stop\F[]
    コンテナのシャットダウン後、コンテナの名前空間への参照とともに、ホストの名前空間で実行されるフックです。 それぞれの名前空間に対応する追加の引数がフックに渡されます。その引数にはコロンで区切られた名前空間のタイプ名とファイル名が含まれており、ファイル名は名前空間に対するファイルディスクリプタを取得するのに使えます。 タイプ名は \FC/proc/PID/ns\F[] ディレクトリ内のファイル名です。 例えば、マウント名前空間に対応する引数は通常は \FCmnt:/proc/PID/fd/12\F[] のようになります。

\FClxc.hook.post-stop\F[]
    コンテナがシャットダウンされた後にホストの名前空間で実行するフック。

\FClxc.hook.clone\F[]
    コンテナが新しいコンテナにクローンされる際に実行されるフック。詳しくは lxc-clone(1) を参照してください。

\FClxc.hook.destroy\F[]
    コンテナを破壊する際に実行されるフックです。

  コンテナのフックで使える環境変数
起動時のフックに設定情報を提供し、フックの機能を助けるための環境変数がいくつか利用可能です。 全ての変数が全てのコンテキストで利用可能なわけではありません。 具体的には、全てのパスはホストシステム上のパスであり、そのため、\FClxc.hook.start\F[] フックの時点では使用できません。

\FCLXC_NAME\F[]
    LXC コンテナの名前。共通のログ環境内でのログメッセージに使うときに便利です。[\FC-n\F[]]

\FCLXC_CONFIG_FILE\F[]
    コンテナの設定ファイルのホスト上でのパス。 これは、他の方法では得られない追加の設定情報を見つけるために、コンテナに、元の、トップレベルの設定ファイルの位置を与えるものです。 [\FC-f\F[]]

\FCLXC_CONSOLE\F[]
    設定されている場合のコンテナのコンソール出力のパス。 [\FC-c\F[]] [\FClxc.console\F[]]

\FCLXC_CONSOLE_LOGPATH\F[]
    設定されている場合のコンテナのコンソールログ出力のパス。 [\FC-L\F[]]

\FCLXC_ROOTFS_MOUNT\F[]
    初期にコンテナがマウントされる場所。 これは、コンテナインスタンスが起動するためのコンテナの rootfs へのホスト上のパスであり、インスタンスのための移行が行われる場所です。 [\FClxc.rootfs.mount\F[]]

\FCLXC_ROOTFS_PATH\F[]
    rootfs.mount へマウントされるコンテナのルートへのホスト上のパスです。 [\FClxc.rootfs\F[]]

\FCLXC_SRC_NAME\F[]
    clone フックの場合のみ使われます。クローン元のコンテナ名が設定されます。

\FCLXC_TARGET\F[]
    stop フックの場合のみ使われます。コンテナのシャットダウンの場合は "stop"、リブートの場合は "reboot" が設定されます。

\FCLXC_CGNS_AWARE\F[]
    この変数が設定されていない場合、お使いのバージョンの LXC は cgroup 名前空間を扱えません。設定されている場合、この値は 1 に設定されています。そして、cgroup 名前空間を扱えます。 この変数はカーネルで cgroup 名前空間が有効であることは保証しません。この変数は lxcfs のマウントフックが使います。

  ロギング
ロギングはコンテナごとに設定することが可能です。 デフォルトでは、lxc パッケージのコンパイル条件に依存し、コンテナのスタートアップは ERROR レベルでのみロギングされ、コンテナのパス以下か、/var/log/lxc 以下のどちらかにコンテナ名 (の後に '.log' が付与される) をもとにした名前でロギングされます。

デフォルトのログレベルとログファイルは両方とも、コンテナの設定ファイル内で指定され、デフォルトの値を上書きします。 同様に、設定ファイルのエントリは lxc-start のコマンドラインオプションで上書きすることも可能です。

\FClxc.loglevel\F[]
    ログを取得するレベル。 ログレベルは 0..8 の範囲の整数です。 数字が小さいほど冗長なデバッグを意味します。 具体的には、0 = trace, 1 = debug, 2 = info, 3 = notice, 4 = warn, 5 = error, 6 = critical, 7 = alert, and 8 = fatal です。 指定されない場合、レベルのデフォルトは 5 (error) で、それ以上のエラーがロギングされます。 (フックスクリプトやネットワークインターフェースの起動、停止時のスクリプトのような) スクリプトが呼ばれた時、スクリプトの標準出力は level 1 の debug でロギングされます。

\FClxc.logfile\F[]
    ログ情報を書き込むファイル。

  自動起動
自動起動オプションでは、自動起動させるコンテナと順番の設定が可能です。 このオプションは LXC ツールが直接使用するか、ディストリビューションが提供する外部ツールが使用するかもしれません。

\FClxc.start.auto\F[]
    コンテナを自動起動させるかどうかを設定します。 有効な値は 0(オフ) か 1(オン) です。

\FClxc.start.delay\F[]
    コンテナを起動させた後、次のコンテナを起動させるまでにどれくらい (秒) 待つかを設定します。

\FClxc.start.order\F[]
    多数の自動起動させるコンテナがある場合のコンテナの起動順を決めるのに使う整数を指定します。

\FClxc.monitor.unshare\F[]
    この値が 0 でない場合、コンテナが初期化される前 (pre-start フックが実行される前) にマウント名前空間がホストから unshare されます。この機能を使う場合、スタート時に CAP_SYS_ADMIN ケーパビリティが必要です。デフォルト値は 0 です。

\FClxc.group\F[]
    コンテナを追加したいコンテナグループ名を指定します。 複数の値を設定でき、複数回指定することもできます。 設定されたグループは、関連する一連のコンテナを起動させるために使われます。

  自動起動とシステムブート
コンテナはいくつでもグループに属することができ、全く属さないことも可能です。特別なグループが 2 つ存在します。1 つは NULL グループです。これはどのグループにも属さないコンテナです。もう 1 つは "onboot" グループです。

LXC サービスが有効になった状態でシステムがブートすると、最初に "onboot" グループのメンバーである lxc.start.auto == 1 が設定されたコンテナを起動しようとします。起動は lxc.start.order の順に起動します。 lxc.start.delay が指定されている場合、現在対象となっているコンテナに初期化の時間を与え、ホストシステムの負荷を低減するために、次のコンテナを開始させるまでに遅延時間を与えます。 "onboot" グループのメンバーが開始した後、LXC システムは lxc.start.auto == 1 が設定された、どのグループのメンバーでもない (NULL グループの) コンテナのブートを onboot グループのコンテナと同様に開始します。

  コンテナの環境変数
コンテナに環境変数を渡したい場合 (環境変数はコンテナの init とその子孫全てで利用可能です)、lxc.environment パラメータがその用途に使えます。 機微 (センシティブ) な情報を渡さないように注意が必要です。そのような情報を持たないコンテナ内のプロセスでこれらの環境変数が利用可能になってしまいます。環境変数は常に /proc/PID/environ 経由で利用可能になります。

この設定項目は、設定したい環境変数ごとに 1 度ずつ、何度でも指定できます。

\FClxc.environment\F[]
    コンテナに渡したい環境変数を指定します。 例:
    \FC
                  lxc.environment = APP_ENV=production
                  lxc.environment = SYSLOG_SERVER=192.0.2.42
                \F[]

例
以下に紹介するいくつかの例に加えて、他の設定例が /usr/doc/lxc-2.0.11_fad08f383/examples にあります。

  ネットワーク
この設定は、片方をブリッジである br0 と接続される veth ペアデバイスを使うコンテナを設定します (ブリッジは管理者によりあらかじめシステム上に設定済みである必要があります)。 仮想ネットワークデバイスは、コンテナ内では eth0 とリネームされます。

\FC
        lxc.utsname = myhostname
        lxc.network.type = veth
        lxc.network.flags = up
        lxc.network.link = br0
        lxc.network.name = eth0
        lxc.network.hwaddr = 4a:49:43:49:79:bf
        lxc.network.ipv4 = 1.2.3.5/24 1.2.3.255
        lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3597
      \F[]

  UID/GID のマッピング
この設定は、コンテナ内のユーザとグループ両方の id 0-9999 の範囲を、ホスト上の 100000-109999 へマッピングします。

\FC
        lxc.id_map = u 0 100000 10000
        lxc.id_map = g 0 100000 10000
      \F[]

  CONTROL GROUP
この設定は、アプリケーションのための control group をいくつか設定します。 cpuset.cpus は定義された cpu のみ使用できるように制限します。 cpus.share は、control group の (cpu) 優先度を指定します。 devices.allow は、特定のデバイスを使用可能にします。

\FC
        lxc.cgroup.cpuset.cpus = 0,1
        lxc.cgroup.cpu.shares = 1234
        lxc.cgroup.devices.deny = a
        lxc.cgroup.devices.allow = c 1:3 rw
        lxc.cgroup.devices.allow = b 8:0 rw
      \F[]

  複雑な設定
この例は、control group を使って、複雑なネットワークスタックを作成し、新しいホスト名を指定し、いくつかの場所をマウントし、ルートファイルシステムを変更するような複雑な設定を示します。

\FC
        lxc.utsname = complex
        lxc.network.0.type = veth
        lxc.network.0.flags = up
        lxc.network.0.link = br0
        lxc.network.0.hwaddr = 4a:49:43:49:79:bf
        lxc.network.0.ipv4 = 10.2.3.5/24 10.2.3.255
        lxc.network.0.ipv6 = 2003:db8:1:0:214:1234:fe0b:3597
        lxc.network.0.ipv6 = 2003:db8:1:0:214:5432:feab:3588
        lxc.network.1.type = macvlan
        lxc.network.1.flags = up
        lxc.network.1.link = eth0
        lxc.network.1.hwaddr = 4a:49:43:49:79:bd
        lxc.network.1.ipv4 = 10.2.3.4/24
        lxc.network.1.ipv4 = 192.168.10.125/24
        lxc.network.1.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596
        lxc.network.2.type = phys
        lxc.network.2.flags = up
        lxc.network.2.link = dummy0
        lxc.network.2.hwaddr = 4a:49:43:49:79:ff
        lxc.network.2.ipv4 = 10.2.3.6/24
        lxc.network.2.ipv6 = 2003:db8:1:0:214:1234:fe0b:3297
        lxc.cgroup.cpuset.cpus = 0,1
        lxc.cgroup.cpu.shares = 1234
        lxc.cgroup.devices.deny = a
        lxc.cgroup.devices.allow = c 1:3 rw
        lxc.cgroup.devices.allow = b 8:0 rw
        lxc.mount = /etc/fstab.complex
        lxc.mount.entry = /lib /root/myrootfs/lib none ro,bind 0 0
        lxc.rootfs = /mnt/rootfs.complex
        lxc.cap.drop = sys_module mknod setuid net_raw
        lxc.cap.drop = mac_override
      \F[]

SEE ALSO
chroot(1), pivot_root(8), \FCfstab\F[](5) \FCcapabilities\F[](7)

SEE ALSO
lxc(7), lxc-create(1), lxc-copy(1), lxc-destroy(1), lxc-start(1), lxc-stop(1), lxc-execute(1), lxc-console(1), lxc-monitor(1), lxc-wait(1), lxc-cgroup(1), lxc-ls(1), lxc-info(1), lxc-freeze(1), lxc-unfreeze(1), lxc-attach(1), lxc.conf(5)

作者
Daniel Lezcano <\FCdaniel.lezcano@free.fr\F[]>