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 のマッピングは
lxc.idmap
を使って定義できます。
Linux
コンテナは、簡単な設定ファイルで定義します。設定ファイル中のオプションは
key = value
の形で一行で表します。'#'
は、その行はコメントであることを示します。ケーパビリティや
cgroup
のオプションのような、リスト形式で指定するオプションでは、value
がない形式で指定でき、そのように使うと、それ以前に定義した値をすべてクリアします。
LXC
は、シングルドットを使って設定キーの名前空間を表します。
lxc.net.0
のような複雑な設定キーは、
lxc.net.0.type、
lxc.net.0.link、
lxc.net.0.ipv6.address
や、さらに細分化された設定向けの色々なサブキーを持つことを意味します。
複数の関係するコンテナの管理を容易にするために、コンテナの設定ファイルに別のファイルをロードすることが可能です。
例えば、ネットワークの設定を、複数のコンテナから
include させるように 1
つのファイルに定義することが可能です。
その場合、コンテナが他のホストに移動すると、そのファイルだけを更新する必要があるかもしれません。
- lxc.include
- include
させたいファイルを指定します。
include
するファイルは、lxc
設定ファイルのフォーマットとして有効でなければいけません。
コンテナに対してアーキテクチャを設定することが可能です。
例えば、64
ビットのホスト上で 32
ビットのバイナリを動かすために
32
ビットアーキテクチャを設定することが可能です。
この設定を行うことにより、パッケージのダウンロードを行うなどの作業のうち、アーキテクチャ名に依存するような作業を行うコンテナスクリプトの修正を行います。
- lxc.arch
- コンテナに設定するアーキテクチャを指定します。
有効なオプションには以下のようなものがあります。
x86, i686, x86_64, amd64
utsname
セクションは、コンテナに設定されるホスト名を定義します。
コンテナは、システムのホスト名を変えることなく、自身のホスト名を持つ事が可能です。
このことにより、ホスト名はコンテナ専用となります。
- lxc.uts.name
- コンテナのホスト名を指定します。
コンテナをクリーンにシャットダウンするためにコンテナの
init
プロセスに送るシグナル名か番号を指定できます。init
システムによって、クリーンなシャットダウンを行うために使うシグナルは異なります。このオプションではシグナルとして
kill(1)
で使う形式を指定できます。
例えば SIGKILL, SIGRTMIN+14, SIGRTMAX-10
のような形式、もしくは数字を指定します。デフォルトのシグナルは
SIGPWR です。
- lxc.signal.halt
- コンテナをシャットダウンするために使うシグナルを指定します。
コンテナをリブートするために送るシグナル名か番号を指定できます。このオプションではシグナルとして
kill(1)
で使う形式を指定できます。
例えば SIGKILL, SIGRTMIN+14, SIGRTMAX-10
のような形式、もしくは数字を指定します。デフォルトのシグナルは
SIGINT です。
- lxc.signal.reboot
- コンテナをリブートするために使うシグナルを指定します。
コンテナを強制的にシャットダウンするために送るシグナル名か番号を指定できます。このオプションではシグナルとして
kill(1)
で使う形式を指定できます。
例えば SIGKILL, SIGRTMIN+14, SIGRTMAX-10
のような形式、もしくは数字を指定します。デフォルトのシグナルは
SIGKILL です。
- lxc.signal.stop
- コンテナを停止するのに使用するシグナルを指定します。
コンテナの init
として使うコマンドを設定します。
- lxc.execute.cmd
- デフォルトで実行するバイナリのコンテナの
root
からの絶対パスを指定します。これは
lxc-execute
のための設定です。
- lxc.init.cmd
- init
として使うバイナリの、コンテナの
root
からの絶対パスを指定します。これは
lxc-start
のための設定です。デフォルトは
/sbin/init です。
コンテナのワーキングディレクトリとして、コンテナ内の絶対パスを設定します。LXC
は init
を実行する前に、このディレクトリに移動します。
- lxc.init.cwd
- ワーキングディレクトリとして使うコンテナ内の絶対パス
init
と後続のコマンドが使う
UID/GID
を設定します。システムコンテナを起動するのに非
root な UID
を使うと、特権がないために動作しないでしょう。UID/GID
の指定は、通常はアプリケーションコンテナの動作の際に役に立ちます。
デフォルト値:
UID(0)、
GID(0)
- lxc.init.uid
- init が使う UID
です。
- lxc.init.gid
- init が使う GID
です。
コアスケジューリングは、コンテナのペイロードが同じコアでスケジュール可能であるとマークするかどうかを指定します。
これによりカーネルスケジューラーは、同じグループに属さないタスクが同一コア上で同時に実行されないようにします。
これは、コンテナペイロードがクロスハイパースレッド攻撃を受けることを防ぐための、追加のセキュリティ対策として機能させることができます。
- lxc.sched.core
- 0 または 1
のみ指定できます。1
を設定すると、コンテナに対するコアスケジューリングドメインを作成し、0
を設定すると作成しません。
明示的に指定していない場合は、コンテナに対するコアスケジューリングドメインは作成されません。
コンテナ内の proc
ファイルシステムで設定できるパラメータを設定します。
- lxc.proc.[proc file name]
- 設定したい proc
ファイルシステムのファイル名を指定します。指定できるファイル名は
/proc/PID/
以下に存在するものです。
例:
lxc.proc.oom_score_adj = 10
シャットダウン後にコンテナを削除するかどうかを指定できます。
- lxc.ephemeral
- 指定できる値は 0
または 1
のみです。この値を 1
に設定すると、シャットダウン後にコンテナを削除します。
ネットワークセクションは、コンテナ内でどのようにネットワークを仮想化するかを定義します。
ネットワークの仮想化はレイヤー
2 で作動します。
ネットワークの仮想化を使用するためには、コンテナのネットワークインターフェースを定義しなければなりません。
いくつかの仮想インターフェースをアサインすることができます。
そして、仮に物理ネットワークインターフェースが一つしかなくても、コンテナ内でいくつもの仮想インターフェースを使うことができます。
- lxc.net
- 値を指定せずに使い、それ以前に定義されたすべてのネットワークオプションをクリアできます。
- lxc.net.[i].type
- コンテナがどの種類のネットワーク仮想化を使うかを指定します。ネットワークデバイスの他のオプションを設定する前に指定しなければいけません。
すべての lxc.net.*
キーに、追加のインデックス
i
を使うと、複数のネットワークを指定できます。例えば、
lxc.net.0.type = veth と lxc.net.1.type = veth
は、同じタイプの異なるネットワークを
2 つ指定します。
同じインデックスを指定したキーはすべて同じネットワークの指定になります。例えば、
lxc.net.0.link = br0 は lxc.net.0.type
と同じネットワークの設定になります。
現時点では、以下のネットワーク仮想化のタイプが使えます:
none:
ホストのネットワーク名前空間を共有します。
これにより、ホストのネットワークデバイスをコンテナ内で使うことが可能になります。
もしコンテナもホストも
init として upstart
を使っている場合、(例えば)
コンテナ内で 'halt'
を実行すると、ホストがシャットダウンしてしまうことにもなります。
非特権コンテナでは、sysfs
をマウントできないので、この設定は動作しません。この問題に対する回避策は、ホストの
sysfs を bind
マウントすることです。ただしこの回避策は安全ではありません。
empty:
ループバックインターフェースだけを作成します。
veth:
一方がコンテナに、もう一方がホストに接続されるペアの仮想イーサネットデバイスを作成します。
lxc.net.[i].veth.mode は、veth
の親(ホスト側)がホスト上で使うモードを指定します。
指定できるモードは
bridge と router です。
指定しない場合のデフォルトのモードは
bridge です。 bridge
モードでは、ホスト側は、
lxc.net.[i].link
オプションで指定したブリッジに接続されます。
もし、ブリッジが指定されていない場合、veth
ペアデバイスは作成されますが、ブリッジには接続されません。
ブリッジはコンテナが開始する前にシステムで事前に設定しておく必要があります。
lxc
はコンテナ外の設定を扱うことはありません。
router
モードでは、ホスト側の
veth
インターフェースを指すコンテナの
IP
アドレスに対して、ホスト上でスタティックルートが作成されます。
加えて、コンテナがホストに到達できるために、コンテナ内で定義されたゲートウェイの
IP
アドレスに対して、Proxy
ARP と Proxy NDP
エントリがホスト側の
veth
インターフェースに追加されます。
デフォルトでは、
lxc
がコンテナの外部に属するネットワークデバイスに対する名前を決定します。
しかし、もしこの名前を自分で指定したい場合、
lxc.net.[i].veth.pair
オプションを使って名前を設定し、lxc
に対して指定をすることができます
(非特権コンテナの場合をのぞきます。セキュリティ上の理由からこのオプションは無視されます)。
lxc.net.[i].veth.ipv4.route、lxc.net.[i].veth.ipv6.route
オプションを使って、静的ルーティングをコンテナを指し示すホスト上に追加できます。
複数のルートがある場合は複数の設定を指定します。
ルートは x.y.z.t/m
の形式です。例: 192.168.1.0/24
bridge
モードでは、タグなし
VLAN は lxc.net.[i].veth.vlan.id
で設定できます。このオプションでは、コンテナポートをブリッジのデフォルトのタグなし
VLAN
から削除するための特別な値
'none'
が指定できます。コンテナのブリッジポートを複数のタグ付き
VLAN
に所属させるために、
lxc.net.[i].veth.vlan.tagged.id
を複数回指定できます。
vlan: vlan
インターフェースは
lxc.net.[i].link
で指定されたインターフェースとリンクし、コンテナに割り当てられます。
vlan の指定は lxc.net.[i].vlan.id
オプションで指定します。
macvlan: macvlan
インターフェースは
lxc.net.[i].link
により指定されるインターフェースとリンクし、コンテナに割り当てられます。
lxc.net.[i].macvlan.mode
でモードを指定すると、その
macvlan
の指定を、同じ上位デバイスで異なる
macvlan
間の通信をする時に使います。
指定できるモードは
private、vepa、bridge、passthru
のいずれかです。
private
モードの場合、デバイスは同じ上位デバイスの他のデバイスとの通信を行いません
(デフォルト)。
新しい仮想イーサネットポート集約モード
(Virtual Ethernet Port Aggregator (VEPA)) である
vepa
モードの場合、隣接したポートが、ソースとデスティネーションの両方が
macvlan
ポートに対してローカルであるフレームを全て返すと仮定します。
すなわち、ブリッジが
reflective relay
として設定されているということです。
上位デバイスから入ってくるブロードキャストフレームは、VEPA
モードである全ての
macvlan
インターフェースに送りつけられます。
ローカルのフレームはローカルには配送されません。
bridge
モードの場合、同じポートの異なる
macvlan
インターフェースの間のシンプルなブリッジとして動作します。
あるインターフェースから他のインターフェースへのフレームは、直接配送され、外部には送出されません。
ブロードキャストフレームは、全ての他のブリッジと外部のインターフェースに対して送られます。
しかし、reflective relay
からフレームが返ってきたときは、再度それを配送することはしません。
全ての MAC
アドレスを知っているので、ブリッジモジュールのように、macvlan
ブリッジモードは学習や
STP
の必要はありません。
passthru
モードの場合、物理インターフェースで受け取った全てのフレームは
macvlan
インターフェースに転送されます。
passthru
モードの場合、ひとつの
macvlan
インターフェースだけが、ひとつの物理インターフェースに対して設定できます。
ipvlan: ipvlan
インターフェースは
lxc.net.[i].link
により指定されるインターフェースとリンクし、コンテナに割り当てられます。
lxc.net.[i].ipvlan.mode
でモードを指定すると、その
ipvlan
の指定を、同じ上位デバイスで異なる
ipvlan
間の通信をする時に使います。
指定できるモードは
l3、l3s、l2
で、デフォルトは l3
モードです。 l3
モードでは、L3
までの TX (送信)
処理はスレーブデバイスにアタッチされたスタックインスタンス上で行われます。
そしてパケットは、L2
処理のためにマスターデバイスのスタックインスタンスにスイッチされます。このインスタンスからのルーティングは、発信デバイス上でキューに入る前に使われます。
このモードでは、スレーブはマルチキャスト・ブロードキャストのトラフィックを受信しませんし、送信もできません。
l3s モードは、TX (送信)
処理は L3
モードと非常に似ていますが、iptables
(conn-tracking)
がこのモードで動作します。
それゆえに L3対称 (symmetric)
(L3s)
です。このモードは若干パフォーマンスが低下しますが、conn-tracking
(接続追跡)
が動作するように、普通の
L3
モードの代わりにこのモードを選んでいるので問題にはならないはずです。
l2 モードでは、TX
(送信)
処理はスレーブデバイスにアタッチされたスタックインスンタンス上で行われます。
パケットは送信のため、マスターデバイスにスイッチされ、マスターデバイス上でキューに入ります。このモードでは、スレーブはマルチキャストも(該当する場合)ブロードキャストも
RX/TX (送受信)
処理します。
lxc.net.[i].ipvlan.isolation
は隔離モードを指定します。隔離モードには
bridge、private、vepa
が指定できます。デフォルトは
bridge モードです。
bridge
隔離モードでは、スレーブはマスターデバイス経由の通信とは別に、スレーブ同士で通信できます。
private
隔離モードでは、ポートはプライベートに設定されます。つまり、スレーブ間の通信はできません。
vepa
隔離モードでは、ポートは
VEPA
モードに設定されます。つまり、802.1Qbg
で説明されているように、ポートはスイッチング機能を外部エンティティにオフロードします。
phys: lxc.net.[i].link
で指定された、すでに存在しているインターフェースがコンテナに割り当てられます。
- lxc.net.[i].flags
- ネットワークに対して行うアクションを指定します。
up:
インターフェースを起動させます。
- lxc.net.[i].link
- 実際のネットワークトラフィックに使うインターフェースを指定します。
- lxc.net.[i].l2proxy
- レイヤ 2 IP
近隣プロキシエントリを、コンテナの
IP
アドレスに対応する
lxc.net.[i].link
インターフェースに追加するかどうかを制御します。0
か 1
が設定でき、デフォルトは
0 です。 IPv4
アドレスで使う場合は、次の
sysctl 設定が必要です:
net.ipv4.conf.[link].forwarding=1 IPv6
アドレスで使う場合は、次の
sysctl 設定が必要です:
net.ipv6.conf.[link].proxy_ndp=1 net.ipv6.conf.[link].forwarding=1
- lxc.net.[i].mtu
- インターフェースに対する
MTU を指定します。
- lxc.net.[i].name
- インターフェース名は動的に割り当てられます。しかし、もしコンテナが使用する設定ファイルが一般的な名前を使用するために、他の特定の名前が必要であれば
(例えば eth0
など)、コンテナ内のインターフェースは、このオプションで指定した名前にリネームされます。
- lxc.net.[i].hwaddr
- 仮想インターフェースの
MAC
アドレスは、デフォルトでは動的に割り当てられます。しかし、MAC
アドレスの衝突や、リンクローカルIPv6
アドレスを常に同じにした場合などは、このオプションが必要です。アドレス中の
"x"
という文字は、ランダムな値に置き換えられます。これによりテンプレートに
hwaddr
を設定することが可能になります。
- lxc.net.[i].ipv4.address
- 仮想インターフェースに割り当てる
ipv4
アドレスを指定します。複数行により複数の
ipv4
アドレスを指定します。このアドレスは
x.y.z.t/m
というフォーマットで指定します。例)
192.168.1.123/24 IP
アドレスのあとにオプションでブロードキャストアドレスを指定できます。例)192.168.1.123/24
255.255.255.255 指定しなければ
IP
アドレスから自動的に計算されます。
- lxc.net.[i].ipv4.gateway
- コンテナでゲートウェイとして使う
IPv4
アドレスを指定します。アドレスは
x.y.z.t
というフォーマットです。例)
192.168.1.123 auto
という特別な値を指定できます。これは
( lxc.net.[i].link で指定した)
ブリッジインターフェースの最初のアドレスを使用し、それをゲートウェイに使うという意味になります。
auto
はネットワークタイプとして
veth、macvlan、ipvlan
を指定している時だけ有効となります。
特別な値である dev
も設定できます。これはデバイスのルートとしてデフォルトゲートウェイを設定するという意味です。これは主に、IPVLAN
のようなレイヤ 3
のネットワークモードで使用します。
- lxc.net.[i].ipv6.address
- 仮想インターフェースに割り当てる
ipv6
アドレスを指定します。複数行により複数の
ipv6
アドレスを指定します。このアドレスは
x::y/m
というフォーマットで指定します。例)
2003:db8:1:0:214:1234:fe0b:3596/64
- lxc.net.[i].ipv6.gateway
- コンテナでゲートウェイとして使う
IPv6
アドレスを指定します。アドレスは
x::y
というフォーマットです。例)
2003:db8:1:0::1 auto
という特別な値を記述する事も可能です。これは
( lxc.net.[i].link で指定した)
ブリッジインターフェースの最初のアドレスを使用し、それをゲートウェイに使うという意味になります。
auto
はネットワークタイプとして
veth、macvlan、ipvlan
を指定している時だけ有効となります。
特別な値である dev
も設定できます。これはデバイスのルートとしてデフォルトゲートウェイを設定するという意味です。これは主に、IPVLAN
のようなレイヤ 3
のネットワークモードで使用します。
- lxc.net.[i].script.up
- ホスト側から使われる、ネットワークの作成と設定が済んだ後に実行するスクリプトを指定します。
すべてのフックで追加の情報が使えます。以下の情報がスクリプトに提供されます:
- •
- LXC_HOOK_TYPE:
フックタイプ。'up' か
'down' のいずれかです
- •
- LXC_HOOK_SECTION:
セクションタイプとして
'net' が設定されます
- •
- LXC_NET_TYPE:
ネットワークタイプ。有効なネットワークタイプのうちのひとつです
(例: 'vlan', 'macvlan', 'ipvlan', 'veth')
- •
- LXC_NET_PARENT:
ホスト上の親デバイス名。これはネットワークタイプが
'macvlan'、'veth'、'phys'
のどれかのときだけ設定されます
- •
- LXC_NET_PEER:
ホスト上のピアデバイス名。これはネットワークタイプが
'veth'
の場合のみ設定されます。この情報は
lxc.hook.version が 1
に設定されている場合のみ設定されます
この情報が環境変数の形で提供されるか、スクリプトへの引数の形で提供されるかは
lxc.hook.version
の値によって決まります。もし
lxc.hook.version が 1
に設定されている場合は、環境変数の形で提供されます。もし
0
が設定されている場合は、スクリプトへの引数として提供されます。
スクリプトからの標準出力は
debug
レベルでロギングされます。標準エラー出力はロギングされません。しかし、フックの標準エラー出力を標準出力にリダイレクトすることにより保存することは可能です。
- lxc.net.[i].script.down
- ホスト側から使われる、ネットワークを破壊する前に実行するスクリプトを指定します。
すべてのフックで追加の情報が使えます。以下の情報がスクリプトに提供されます:
- •
- LXC_HOOK_TYPE:
フックタイプ。'up' か
'down' のいずれかです
- •
- LXC_HOOK_SECTION:
セクションタイプとして
'net' が設定されます
- •
- LXC_NET_TYPE:
ネットワークタイプ。有効なネットワークタイプのうちのひとつです
(例: 'vlan', 'macvlan', 'ipvlan', 'veth')
- •
- LXC_NET_PARENT:
ホスト上の親デバイス名。これはネットワークタイプが
'macvlan'、'veth'、'phys'
のどれかのときだけ設定されます
- •
- LXC_NET_PEER:
ホスト上のピアデバイス名。これはネットワークタイプが
'veth'
の場合のみ設定されます。この情報は
lxc.hook.version が 1
に設定されている場合のみ設定されます
この情報が環境変数の形で提供されるか、スクリプトへの引数の形で提供されるかは
lxc.hook.version
の値によって決まります。もし
lxc.hook.version が 1
に設定されている場合は、環境変数の形で提供されます。もし
0
が設定されている場合は、スクリプトへの引数として提供されます。
スクリプトからの標準出力は
debug
レベルでロギングされます。標準エラー出力はロギングされません。しかし、フックの標準エラー出力を標準出力にリダイレクトすることにより保存することは可能です。
さらに厳しい隔離のために、コンテナは自身のプライベートな
pseudo tty (擬似端末)
を持つことが可能です。
- lxc.pty.max
- もし設定された場合、コンテナは新しい
pseudo tty
インスタンスを持ち、それを自身のプライベートとします。
この値は pty
インスタンスに許可される
pseudo tty
の最大数を指定します
(この制限はまだ実装されていません)。
コンテナでルートファイルシステムを持つように設定されており、inittab
ファイルでコンソールの使用が設定されている場合、このコンソールの出力がどこになされるのかを指定したいと思うでしょう。
- lxc.console.buffer.size
- このオプションを設定すると、liblxc
はインメモリのリングバッファを割り当てます。コンテナのコンソールはリングバッファに出力されます。リングバッファは少なくとも標準ページサイズの大きさでなければなりません。ページサイズより小さい値を与えた場合は、liblxc
はページサイズのリングバッファを割り当てます。ページサイズは通常は
4KB です。 'auto'
を指定すると、liblxc は
128KB
のリングバッファを割り当てます。
リングバッファサイズを数値指定する場合、値がバイトに変換されるときに
2
の累乗になります。サイズ接頭辞付きの単位として
'KB'、'MB'、'GB'
が使えます。(この場合の変換は
1024
の倍数に基づいています。つまり
'KB' == 'KiB'、'MB' == 'MiB'、'GB' == 'GiB'
という意味です。加えて、単位の大文字小文字は無視されます。すなわち
'kB'、'KB'、'Kb'
は同一に扱われます。)
- lxc.console.size
- liblxc は lxc.console.logfile
で指定したコンソールログのサイズを、このオプションで設定した値に制限します。ログファイルのサイズは少なくとも標準ページサイズでなければなりません。ページサイズ以下の値を設定した場合は、liblxc
はログファイルのサイズをページサイズに設定します。ページサイズは通常は
4KB です。 'auto'
を指定すると、liblxc
はログファイルのサイズを
128KB に制限します。
ログファイルサイズの値を数値指定する場合、値がバイトに変換されるときに
2
の累乗になります。サイズ接頭辞付きの単位として
'kB'、'MB'、'GB'
が使えます。(この場合の変換は
1024
の倍数に基づいています。つまり
'kB' == 'KiB'、'MB' == 'MiB'、'GB' == 'GiB'
という意味です。加えて、単位の大文字小文字は無視されます。すなわち
'kB'、'KB'、'Kb'
は同一に扱われます。)
ディスク上のコンソールリングバッファとミラーになるようにしたい場合は、
lxc.console.size と lxc.console.buffer.size
の値を同じ値に設定します。
- lxc.console.logfile
- コンソール出力を書き込むファイルのパスを指定します。ディスクに保存されるリングバッファログと異なり、このファイルはサイズが大きくなり続けるので、ファイルがローテートや削除されない限りは、ユーザのディスクをいっぱいにしてしまう可能性があります。この問題は、インメモリのリングバッファオプションである、lxc.console.buffer.size
と lxc.console.buffer.logfile
を使うことでも回避できます。
- lxc.console.rotate
-
lxc.console.logfile
で指定したコンソールログファイルをローテートするかどうかを指定します。ユーザはログファイルをローテートするように
API
リクエストを送ることができます。古いログファイルは、元のファイル名と同じ名前のファイルに
".1"
というサフィックスが付け加わります。
ユーザがコンソールログでディスクがいっぱいになるのを防ぐには、ログファイルをローテートし、不要なログファイルを削除してください。この問題はインメモリのリングバッファオプションである
lxc.console.buffer.size と lxc.console.buffer.logfile
を使うことでも防げます。
- lxc.console.path
- コンソールを割り当てるデバイスのパスを指定します。'none'
というキーワードは、単純にコンソールを無効にします。
'none'
を指定し、コンテナ内のコンソールに対するデバイスノードを
/dev/console
に作成するか、もしくはホストの
/dev/console をコンテナ内の
/dev/console に bind mount
する場合、そのコンテナはホストの
/dev/console
へ直接アクセスを行うことに注意が必要です。
そのコンテナがデバイスへの書き込み権を持っている場合は危険ですので、注意してこの指定を使用する必要があります。
このオプションはコンテナが
root
ファイルシステムを持つように設定されており、inittab
ファイルで tty 上に getty
の起動が設定されている場合に役に立ちます。
このオプションはコンテナで利用できる
tty の数を指定します。
inittab
ファイルに設定する getty
の数は、このオプションの指定する
tty
の数より大きくしてはいけません。
さもなければ、超過した分の
getty
セッションはコンソールか
/var/log/messages
にうっとうしいメッセージを生死を表示しながら、永久に生死を繰り返すでしょう。
- lxc.tty.max
- コンテナに作成出来る
tty
の数を指定します。
LXC
のコンソールはホストによって作られ、コンテナ内で要求されたデバイスに
bind マウントされた Unix98 PTY
経由で提供されます。
デフォルトでは
/dev/console
と
/dev/ttyN に bind
マウントされます。
これはゲスト内でのパッケージのアップグレードを妨げる可能性があります。
なので
/dev
以下のディレクトリを指定することができます。
LXC
はこのディレクトリ以下にファイルを作成し、これらのファイルを
bind マウントします。
そして、これらの
(作成された)
ファイルは
/dev/console と
/dev/ttyN
にシンボリックリンクされます。
シンボリックリンクを消去したり置き換えたりすることは可能ですから、パッケージのアップグレードは成功します。
- lxc.tty.dir
- コンテナのコンソールデバイスを作成するための
/dev
以下のディレクトリを指定します。
LXC は /dev/console に対する bind mount
や /dev/console
デバイスノードをこのディレクトリ以下に移動することに注意が必要です。
デフォルトでは、lxc
はコンテナの
/dev
以下に fd, stdin, stdout, stderr
のシンボリックリンクを作成しますが、自動的にはデバイスノードのエントリは作成しません。
これは、コンテナの
rootfs
で必要な設定を行えるようにするものです。
lxc.autodev が 1
に設定されている場合、コンテナの
rootfs
をマウントした後、LXC
は新しい tmpfs を
/dev
以下にマウントします
(デフォルトでは 500k
制限でマウント、lxc.autodev.tmpfs.size
で指定可能)。
そして初期デバイスの最小限のセットを作成します。
これは、"systemd"
ベースの "init"
環境のコンテナを起動する時に通常必要ですが、他の環境の場合はオプショナルなものです。
コンテナの /dev
ディレクトリ内の追加デバイスは
lxc.hook.autodev
フックを使用して作成されます。
- lxc.autodev
- コンテナの起動時に
LXC が /dev
をマウントして最小限の
/dev
を作成するのを止めるには、この値を
0
に設定してください。
- lxc.autodev.tmpfs.size
- この設定で /dev tmpfs
のサイズを指定します。
デフォルト値は 500000 (500K)
です。このパラメータを値なしで使うと、デフォルト値が使われます。
マウントポイントセクションは、マウントするための区別された場所を指定します。
これらのマウントポイントは、コンテナだけに見え、コンテナ外で実行されるプロセスから見えることはありません。
例えば、/etc や /var や /home
をマウントするときに役に立つでしょう。
注意: 通常 LXC
は、マウント対象と相対パス指定のバインドマウントを、適切にコンテナルート以下に閉じ込めます。
これは、ホストのディレクトリやファイルに対して重ね合わせを行うようなマウントによる攻撃を防ぎます。(絶対パス指定のマウントソース中の各パスがシンボリックリンクである場合は無視されます。)
しかし、もしコンテナの設定が最初に、/home/joe
のようなコンテナユーザのコントロール配下にあるディレクトリを、コンテナ中のある
path
にマウントし、その後
path
以下でマウントが行われるような場合、コンテナユーザがタイミングを見計らって自身のホームディレクトリ以下でシンボリックリンクを操作するような
TOCTTOU
攻撃が成立する可能性があります。
- lxc.mount.fstab
- マウント情報の書かれた
fstab
フォーマットで書かれたファイルの場所を指定します。
マウントする場所は相対バスで書くことができます。そして、ほとんどの場合にコンテナの
root
からの相対パスとなるはずです。例えば、以下のように書きます。
proc proc proc nodev,noexec,nosuid 0 0
この例は、root
ファイルシステムがどこにあっても、コンテナの
/proc 以下に proc
ファイルシステムをマウントします。これは、ブロックデバイスがバックエンドのファイルシステムだけでなく、コンテナのクローンにも柔軟に対応できます。
ファイルシステムがイメージファイルやブロックデバイスからマウントされている場合、3
つ目のフィールド
(fs_vfstype) は mount(8) のように
auto
を指定することはできず、明確に指定しなければいけません。
- lxc.mount.entry
- fstab
フォーマットの一行と同じフォーマットのマウントポイントの指定をします。
加えて、LXC では rshared や
rprivate
といったマウント・プロパゲーションオプションと、独自の
3
つのマウントオプションが使えます。
optional
は、マウントが失敗しても失敗を返さずに無視します。
create=dir と create=file
は、マウントポイントをマウントする際にディレクトリもしくはファイルを作成します。
relative
を指定すると、マウントされたコンテナルートからの相対パスとして取得されます。
dev/null proc/kcore none bind,relative 0 0
は dev/null を ${ LXC_ROOTFS_MOUNT}/dev/null
と展開し、コンテナ内の
proc/kcore
にマウントします。
- lxc.mount.auto
- 標準のカーネルファイルシステムで自動的にマウントするものを指定します。
これは劇的に設定を容易にする可能性があります。
- •
-
proc:mixed (or proc): /proc
を読み書き可能でマウントします。
ただし、 /proc/sys と
/proc/sysrq-trigger
は、セキュリティとコンテナの隔離の目的でリードオンリーで再マウントされます。
- •
-
proc:rw: /proc
を読み書き可能でマウントします。
- •
-
sys:mixed (or sys): /sys/devices/virtual/net
のみ書き込み可能で、その他の
/sys
はリードオンリーでマウントします。
- •
-
sys:ro: /sys
を、セキュリティとコンテナの隔離の目的でリードオンリーでマウントします。
- •
-
sys:rw: /sys
を読み書き可能でマウントします。
- •
-
cgroup:mixed: /sys/fs/cgroup を tmpfs
でマウントし、そのコンテナの追加が行われた全ての階層に対するディレクトリを作成し、それらの階層内に
cgroup
名でサブディレクトリを作成し、そのコンテナ自身の
cgroup
をそのディレクトリにバインドマウントします。コンテナは自身の
cgroup
ディレクトリに書き込みが可能ですが、親ディレクトリはリードオンリーで再マウントされているため書き込めません。
- •
-
cgroup:mixed:force: force
を指定すると、LXC
はあらゆる状況でコンテナのための
cgroup
マウントを実行します。それ以外は
cgroup:mixed
と同様です。これは主に
cgroup
名前空間が有効な場合に便利です。この場合は完全に安全ですので、LXC
は通常コンテナの init
バイナリが cgroup
をマウントしたままの状態にしておきます。
- •
-
cgroup:ro: cgroup:mixed
と同様にマウントされますが、全てリードオンリーでマウントされます。
- •
-
cgroup:ro:force: force
を指定すると、LXC
はあらゆる状況でコンテナのための
cgroup
マウントを実行します。それ以外は
cgroup:ro
と同様です。これは主に
cgroup
名前空間が有効な場合に便利です。この場合は完全に安全ですので、LXC
は通常コンテナの init
バイナリが cgroup
をマウントしたままの状態にしておきます。
- •
-
cgroup:rw: cgroup:mixed
と同様にマウントされますが、全て読み書き可能でマウントされます。
コンテナ自身の cgroup
に至るまでのパスも書き込み可能になることに注意が必要ですが、cgroup
ファイルシステムにはならず、
/sys/fs/cgroup の tmpfs
の一部分になるでしょう。
- •
-
cgroup:rw:force: force
を指定すると、LXC
はあらゆる状況でコンテナのための
cgroup
マウントを実行します。それ以外は
cgroup:rw
と同様です。これは主に
cgroup
名前空間が有効な場合に便利です。この場合は完全に安全ですので、LXC
は通常コンテナの init
バイナリが cgroup
をマウントしたままの状態にしておきます。
- •
-
cgroup
(マウントオプションなしの場合):
コンテナが CAP_SYS_ADMIN
ケーパビリティを保持している場合、
cgroup:rw
となります。保持していない場合、
cgroup:mixed となります。
- •
-
cgroup-full:mixed: /sys/fs/cgroup を
tmpfs
でマウントし、そのコンテナの追加が行われた全ての階層構造に対するディレクトリを作製し、ホストからコンテナまでの階層構造を全てバインドマウントし、コンテナ自身の
cgroup
を除いてリードオンリーにします。
cgroup
と比べると、コンテナ自身の
cgroup
に至るまでの全てのパスが
tmpfs
の下層のシンプルなディレクトリとなり、コンテナ自身の
cgroup
の外ではリードオンリーになりますが、
/sys/fs/cgroup/$hierarchy
はホストの全ての cgroup
階層構造を含みます。
これにより、コンテナにはかなりの情報が漏洩します。
- •
-
cgroup-full:mixed:force: force
を指定すると、LXC
はあらゆる状況でコンテナのための
cgroup
マウントを実行します。それ以外は
cgroup-full:mixed
と同様です。これは主に
cgroup
名前空間が有効な場合に便利です。この場合は完全に安全ですので、LXC
は通常コンテナの init
バイナリが cgroup
をマウントしたままの状態にしておきます。
- •
-
cgroup-full:ro: cgroup-full:mixed
と同様にマウントされますが、全てリードオンリーでマウントされます。
- •
-
cgroup-full:ro:force: force
を指定すると、LXC
はあらゆる状況でコンテナのための
cgroup
マウントを実行します。それ以外は
cgroup-full:ro
と同様です。これは主に
cgroup
名前空間が有効な場合に便利です。この場合は完全に安全ですので、LXC
は通常コンテナの init
バイナリが cgroup
をマウントしたままの状態にしておきます。
- •
-
cgroup-full:rw:
cgroup-full:mixedと同様にマウントされますが、全て読み書き可能でマウントされます。
この場合、コンテナは自身の
cgroup
から脱出する可能性があることに注意してください
(コンテナが CAP_SYS_ADMIN
を持ち、自身で cgroup
ファイルシステムをマウント可能なら、いずれにせよそのようにするかもしれないことにも注意してください)。
- •
-
cgroup-full:rw:force: force
を指定すると、LXC
はあらゆる状況でコンテナのための
cgroup
マウントを実行します。それ以外は
cgroup-full:rw
と同様です。これは主に
cgroup
名前空間が有効な場合に便利です。この場合は完全に安全ですので、LXC
は通常コンテナの init
バイナリが cgroup
をマウントしたままの状態にしておきます。
- •
-
cgroup-full
(マウントオプションなしの場合):
コンテナが CAP_SYS_ADMIN
ケーパビリティを保持している場合、
cgroup-full:rw
となります。保持していない場合、
cgroup-full:mixed
となります。
cgroup
名前空間が有効の場合、
cgroup
の自動マウントの指定はどれも無視されます。これは、コンテナが自身でファイルシステムをマウントするため、自動マウントがコンテナの
init
を混乱させる可能性があるためです。
cgroup
ファイルシステムの自動マウントが有効の場合、
/sys/fs/cgroup 以下の tmpfs
は常に読み書き可能でマウントされることに注意が必要です
(しかし
:mixed と
:ro
の場合は、個々の階層の
/sys/fs/cgroup/$hierarchy
は読み込み専用となるでしょう)。これは
Ubuntu の
mountall(8)
コマンドの特異な動きに対処するためのものです。特異な動きとは、
/sys/fs/cgroup
が読み込み専用でマウントされた状態で、コンテナが
CAP_SYS_ADMIN
を持たない場合、/sys/fs/cgroup
を読み書き可能で再マウントしようとしてできないため、コンテナのブート時にユーザからの入力を待ってしまうというものです。
例:
lxc.mount.auto = proc sys cgroup
lxc.mount.auto = proc:rw sys:rw cgroup-full:rw
コンテナのルートファイルシステムは、ホストのルートファイルシステムと異なるようにすることも可能です。
- lxc.rootfs.path
- コンテナのルートファイルシステムを指定します。
この値はイメージファイル、ディレクトリ、ブロックデバイスのどれかを取ることができます。
もし指定されない場合、コンテナはホストとルートファイルシステムを共有します。
ディレクトリ、単純なブロックデバイスのバックエンドを持つコンテナの場合、パス名を使うことができます。
もし rootfs が nbd
デバイスの場合、
nbd:file:1 という指定は
file を nbd
デバイスとして使用し、その
1
番目のパーティションが
rootfs
としてマウントされます。
nbd:file
という指定は、nbd
デバイス自身をマウントします。
overlayfs:/lower:/upper
という指定は、rootfs は
/lower
という読み込み専用でマウントされるディレクトリの上に、
/upper
というディレクトリを読み書き可能で重ね合わせてマウントします。
overlayfs は、複数の /lower
ディレクトリを指定できます。
loop:/file は /file を loop
デバイスとして使用し、loop
デバイスをマウントします。
- lxc.rootfs.mount
- root
ファイルシステムの変更の前に、
lxc.rootfs.path
を再帰的にどこにバインドするのかを指定します。これは
pivot_root(8)
システムコールが確実に成功する事を保証します。
どんなディレクトリでも良く、デフォルトでも通常は動くはずです。
- lxc.rootfs.options
- rootfs
をマウントするときに使うマウントオプション。マウントオプションのフォーマットは
fstab
で使うフォーマットと同じです。
加えて、LXC
では独自の idmap=
マウントオプションが使えます。このオプションを使うと、LXC
に対してコンテナの
rootfs を idmapped
マウントするように指示できます。
これは、コンテナが使うユーザー名前空間の
ID
マッピングと一致させるために、コンテナの
rootfs を再帰的に chown
したくない場合に役に立ちます。代わりに
idmapped
マウントが使えます。
idmap= の引数は、LXC
が開いて rootfs を idmap
するのに使うユーザー名前空間ファイルを指すパス、もしくは
"container"
という特別な値のどちらかです。"container"
という値は、コンテナのユーザー名前空間を使って
rootfs を idmap するように LXC
に指示します。
- lxc.rootfs.managed
- LXC
がコンテナのストレージを管理していない場合は、この値を
0 に設定します。 0
に設定すると、LXC
はコンテナのストレージを変更しません。デフォルト値は
1 です。
CONTROL GROUP セクションは、(lxc
とは)
別のサブシステムの設定を含みます。
lxc
は、このサブシステム名の正しさはチェックしません。
実行時のエラーを検出するのに不便ですが、別の将来のサブシステムをサポート出来るという有利な点もあります。
カーネルにおける cgroup
実装は長年にわたって大きく変化してきました。
Linux 4.5 で新しい cgroup
ファイルシステムのサポートが追加されました。通常は
"cgroup2" や "unified
hierarchy"(単一階層構造)
と呼ばれています。
それ以来、通常は古い
cgroup
ファイルシステムは
"cgroup1" や "legacy
hierarchies"(レガシー階層構造)と呼ばれています。
この 2
つのバージョンの違いについての詳細な説明は、cgroup
のマニュアルページをご覧ください。
LXC は
cgroup1(レガシー階層構造)と
cgroup2(単一階層構造)に対する設定を、異なる設定プレフィックスを使って区別しています。
cgroup1
に対する設定を変更するには
lxc.cgroup.
というプレフィックスを使う必要があり、cgroup2
の設定を変更するには
lxc.cgroup2.
を使う必要があります。
LXC は、cgroup2
だけが使われているシステム上の
lxc.cgroup.
を無視します。逆に
cgroup1
だけが使われているシステム上の
lxc.cgroup2. を無視します。
cgroup
階層の本質は、プロセスを階層的に構造化する方法です。通常は、cgroup
階層では 1
つ以上の「コントローラー」が有効になっています。
通常、cgroup
階層の「コントローラー」は階層に従って特定のタイプのシステムリソースを分配する役割を果たします。
コントローラーには
"pids"
コントローラー、"cpu"
コントローラー、"memory"
コントローラーなどがあります。
しかし、システムリソースの分配するという役割に該当しないコントローラーもあります。このようなコントローラーは「ユーティリティー」コントローラーと呼ばれたりします。
ユーティリティーコントローラーの
1
つにデバイスコントローラーがあります。このコントローラーはシステムリソースを分配する代わりにデバイスへのアクセスを管理できます。
cgroup1
では、デバイスコントローラーは他の多くのコントローラーと同様に、書き込みできるファイルのセットとして実装されていました。
これらのファイルは
"devices.allow" と "devices.deny"
という名前のファイルでした。レガシーデバイスコントローラーは「許可リスト(allowlists)」と「拒否リスト(denylists)」の両方を実装できました。
許可リスト(allowlist)とは、すべてのデバイスへのアクセスをブロックするデバイスプログラムです。特定のデバイスへのアクセスを行うには、特定のデバイスもしくはデバイスクラスに対する「許可ルール(allow
rules)」を指定する必要があります。
一方、拒否リスト(denylist)はデフォルトですべてのデバイスへのアクセスを許可するデバイスプログラムです。特定のデバイスへのアクセスを拒否するには、特定のデバイスもしくはデバイスクラスに対する「拒否ルール(deny
rules)」を指定する必要があります。
cgroup2
では、デバイスコントローラーの実装が完全に変わりました。読み書きするファイルの代わりに、
BPF_PROG_TYPE_CGROUP_DEVICE の eBPF
プログラムを cgroup
にアタッチできます。
カーネルの実装が完全に変わったのにもかかわらず、LXC
は cgroup1
のデバイスコントローラーと
cgroup2 の eBPF
ベースのデバイスコントローラーで同じセマンティクスに従えるようにしています。
このあとの段落では、cgroup2
の eBPF
デバイスコントローラーに対するセマンティクスを説明します。
先に述べたように、cgroup2
の eBPF
ベースのデバイスコントローラーに対するデバイスルールを指定するフォーマットは、cgroup1
のデバイスコントローラーと同じです。ただし、設定キーのプレフィックスは変更されています。
具体的には、cgroup1
のデバイスコントローラーに対するデバイスルールは
lxc.cgroup.devices.allow と
lxc.cgroup.devices.deny
を使って指定します。一方、cgroup2
の eBPF
ベースのコントローラーでは
lxc.cgroup2.devices.allow と
lxc.cgroup2.devices.deny
を使わなければなりません。
- •
- 拒否リスト(denylist)のデバイスルール
lxc.cgroup2.devices.deny = a
は、カーネルに対してデフォルトですべてのデバイスへのアクセスをブロックするように
LXC が指示します。
デバイスへのアクセスを許可するには、デバイスに対する許可ルールを
lxc.cgroup2.devices.allow
を使って追加する必要があります。これは「許可リスト」デバイスプログラムとして参照されます。
- •
- 許可リスト(allowlist)のデバイスルール
lxc.cgroup2.devices.allow = a
は、カーネルに対してすべてのデバイスへのアクセスをデフォルトで許可するように
LXC が指示します。
デバイスへのアクセスを拒否するには、デバイスに対する拒否ルールを
lxc.cgroup2.devices.deny
を使って追加する必要があります。これは「拒否リスト」デバイスプログラムとして参照されます。
- •
- 前述の 2
つのルールのいずれかを指定すると、それ以前に指定していたルールがすべてクリアされます。つまり、デバイスリストがリセットされます。
- •
- 許可リストプログラムが要求される場合、つまりデフォルトですべてのデバイスへのアクセスがブロックされている場合、個別のデバイスやデバイスクラスへの拒否ルールを指定しても無視されます。
- •
- 拒否リストプログラムが要求される場合、つまりデフォルトですべてのデバイスへのアクセスが許可されている場合、個別のデバイスやデバイスクラスへの許可ルールを指定しても無視されます。
例えば、次のようなルールの組
lxc.cgroup2.devices.deny = a
lxc.cgroup2.devices.allow = c *:* m
lxc.cgroup2.devices.allow = b *:* m
lxc.cgroup2.devices.allow = c 1:3 rwm
は、許可リスト(allowlist)デバイスプログラムを実装します。つまり、カーネルはこのリストで許可されるように設定されていないすべてのデバイスへのアクセスをブロックします。
このプログラムでは、すべてのキャラクターデバイスとブロックデバイスが作成できますが、読み書きは
/dev/null
に対してしか行なえません。
代わりに先のルールから次のようなルールの組に変更したとすると、
lxc.cgroup2.devices.allow = a
lxc.cgroup2.devices.deny = c *:* m
lxc.cgroup2.devices.deny = b *:* m
lxc.cgroup2.devices.deny = c 1:3 rwm
LXC
はカーネルに拒否リスト(denylist)の実装を指示します。つまりカーネルはこのリストで拒否を指定していないすべてのデバイスへのアクセスを許可します。
このプログラムでは、キャラクターデバイスとブロックデバイスは作成できません。そして
/dev/null
の読み書きと作成は許可されません。
ここで、同じプログラムでも、前述のようにデバイスのプログラムタイプを決定するような「グローバルルール」が続いている場合を考えてみましょう。
lxc.cgroup2.devices.allow = a
lxc.cgroup2.devices.deny = c *:* m
lxc.cgroup2.devices.deny = b *:* m
lxc.cgroup2.devices.deny = c 1:3 rwm
lxc.cgroup2.devices.allow = a
最後の行は、デバイスプログラムのタイプを変更せずに、LXC
がデバイスリストをリセットしてしまいます。
次のように指定した場合、
lxc.cgroup2.devices.allow = a
lxc.cgroup2.devices.deny = c *:* m
lxc.cgroup2.devices.deny = b *:* m
lxc.cgroup2.devices.deny = c 1:3 rwm
lxc.cgroup2.devices.deny = a
前の例と違って最後の行によって、LXC
はデバイスリストをリセットし、許可リスト(allowlist)から拒否リスト(denylist)にプログラムを変更してしまいます。
- lxc.cgroup.[control name].[controller file]
- レガシー cgroup 階層
(cgroup v1)
に設定する値を指定します。コントローラー名は
control group
そのままの名前です。
許される名前や値の書式は
LXC
が指定することはなく、コンテナが実行された時に実行されている
Linux
カーネルの機能に依存します。
例えば lxc.cgroup.cpuset.cpus
のようになります。
- lxc.cgroup2.[controller name].[controller file]
- 単一の cgroup 階層 (cgroup
v2)
に設定する値を指定します。
許される名前や値の書式は
LXC
が指定することはなく、コンテナが実行された時に実行されている
Linux
カーネルの機能に依存します。
例えば lxc.cgroup2.memory.high
のようになります。
- lxc.cgroup.dir
- コンテナの cgroup
を作成するパスやディレクトリを指定します。
例えば、"c1"
という名前のコンテナで
lxc.cgroup.dir = my-cgroup/first
のように設定すると、"my-cgroup"
のサブ cgroup
のようにコンテナの
cgroup を作成します。
例えば、ユーザのカレントの
cgroup である "my-user" が cgroup v1
階層にある cpuset
コントローラの root cgroup
内に存在する場合、この設定は
"/sys/fs/cgroup/cpuset/my-user/my-cgroup/first/c1"
という cgroup
をこのコンテナ向けに作成します。
存在しない cgroup は LXC
が作成しますが、ユーザがカレントの
cgroup
に書き込み権を持っていることが前提となります。
- lxc.cgroup.dir.container
- これは lxc.cgroup.dir
と同様の設定ですが、かならず
lxc.cgroup.dir.monitor
と同時に使わなければなりません。そして、設定はコンテナの
cgroup
パスにのみ影響を与えます。このオプションは
lxc.cgroup.dir
と同時に設定できません。コンテナがアタッチされる最終的なパスは
lxc.cgroup.dir.container.inner
オプションによりさらに変更される可能性があります。
- lxc.cgroup.dir.monitor
- このオプションは、モニタプロセスに対してlxc.cgroup.dir.container
と同様の働きをします。
- lxc.cgroup.dir.monitor.pivot
- コンテナ終了時に、モニタープロセスの
PID がここで指定した
cgroup
にアタッチされます。
コンテナ終了時に、他の
cgroup
パスが確実に適切に削除されるように、ここに設定するパスは他で設定した
cgroup
ディレクトリのサブパスにすべきではありません。
- lxc.cgroup.dir.container.inner
- cgroup
名前空間が作られる追加のサブディレクトリを指定します。このオプションを使うと、cgroup
の制限は lxc.cgroup.dir.container
で指定した外部パスに適用されます。
lxc.cgroup.dir.container
はコンテナ内部からアクセスできないため、特権コンテナに対する制限を上書きできない方法でよりよい方法で強制できます。
このオプションは
lxc.cgroup.dir.container と lxc.cgroup.dir.monitor
と同時に指定したときのみ機能し、それ以外の場合は効果がありません。
- lxc.cgroup.relative
- LXC に root cgroup
へのエスケープを行わないように指示するには、この値を
1
に設定してください。
これにより、ユーザは
cgroup2 と systemd
が強制する制限を遵守するのが容易になります。
具体的には、これにより
LXC コンテナを systemd
のサービスとして実行できます。
コンテナが root
権限で実行されていても、コンテナ内ではケーパビリティ
(capabilities)
を削除する事は可能です。
- lxc.cap.drop
- コンテナ内で削除するケーパビリティ
(capability) を指定します。
一行でスペース区切りで複数のケーパビリティを指定することも可能です。
指定は、"CAP_"
というプレフィックスなしで、小文字でケーパビリティを指定します。
例えば、CAP_SYS_MODULE
というケーパビリティは
sys_module
と指定する必要があります。
詳しくは以下を参照してください。
capabilities(7)
この設定を、値を指定しない状態で使った場合、それ以前に指定された削除対象のケーパビリティの指定をすべてクリアします
(lxc.cap.drop
に何も指定しない状態になります)。
- lxc.cap.keep
- コンテナ内で維持するケーパビリティを指定します。指定した以外の全てのケーパビリティはドロップされます。
特別な値 "none"
が指定されている時点で、lxc
はこの時点で保持することになっている全てのケーパビリティをクリアします。"none"
を単独で使用するとすべてのケーパビリティを削除できます。
名前空間は clone したり (
lxc.namespace.clone)、keep したり (
lxc.namespace.keep)、share したり (
lxc.namespace.share.[namespace identifier])
できます。
- lxc.namespace.clone
- コンテナ作成時に作成する名前空間を指定します。作成する名前空間はスペース区切りのリストで指定します。指定する名前空間名は、/proc/PID/ns
ディレクトリ内に存在する標準の名前空間指示子でなければなりません。
lxc.namespace.clone
を明示的に設定していない場合は、カーネルがサポートするすべての名前空間と現在の設定が使われます。
新しいマウント、ネット、IPC
名前空間を作る場合は
lxc.namespace.clone=mount net ipc
と指定します。
- lxc.namespace.keep
- コンテナが、作成元のプロセスから継承する
(新しい名前空間を作らずに元のプロセスの名前空間のまま実行する)
名前空間を指定します。継承する名前空間はスペース区切りのリストで指定します。指定する名前空間名は、
/proc/PID/ns
ディレクトリ内に存在する標準の名前空間指示子でなければなりません。
lxc.namespace.keep
はブラックリストを指定するオプションです。つまり、コンテナに特定の名前空間を使い続けることを強制したい場合に便利です。
ネットワーク、ユーザ、IPC
名前空間を元のプロセスの名前空間のままで実行したい場合は
lxc.namespace.keep=user net ipc
と指定します。
PID
名前空間を共有すると、ほとんどの
init
で動作しない可能性があることに注意してください。
コンテナが新しいユーザ名前空間をリクエストし、そのコンテナがネットワーク名前空間は継承したい場合は、ユーザ名前空間も同様に継承する必要があることに注意してください。
- lxc.namespace.share.[namespace identifier]
- 他のコンテナやプロセスから継承する名前空間を指定します。[namespace
identifier] には、 /proc/PID/ns
ディレクトリ内に現れる名前空間のひとつが入ります。
他のプロセスから名前空間を継承するには、
lxc.namespace.share.[namespace identifier]
の値をプロセスの PID
に設定します。例えば
lxc.namespace.share.net=42
のようになります。
他のコンテナから名前空間を継承するには、
lxc.namespace.share.[namespace identifier]
の値をコンテナ名に設定します。例えば
lxc.namespace.share.pid=c3
のようになります。
標準の liblxc
のパスとは異なるコンテナパスに存在する他のコンテナから名前空間を継承するには、
lxc.namespace.share.[namespace identifier]
をそのコンテナのフルパスで指定します。例えば
lxc.namespace.share.user=/opt/c3
のようになります。
名前空間を継承するためには、呼び出し元が継承元のプロセスまたはコンテナに対して十分な権限を持っている必要があります。
システムコンテナ間での
PID
名前空間の共有は、ほとんどの
init
システムではうまく動作しない可能性があることに注意が必要です。
ふたつのプロセスが異なるユーザ名前空間に存在し、そのうちのひとつが他のネットワーク名前空間を継承したい場合、通常はユーザ名前空間も同様に継承する必要があることに注意が必要です。
LSM
で慎重に設定を追加しないで、タスクでユーザ
+ PID
名前空間を共有すると、そのタスクは
liblxc
を呼び出したタスクの権限に昇格できることに注意が必要です。
- lxc.time.offset.boot
- ブートタイム(boottime)クロックの正または負のオフセット値を指定します。フォーマットは、時(h)、分(m)、秒(s)、ミリ秒(ms)、マイクロ秒(us)、ナノ秒(ns)を指定できます。
- lxc.time.offset.monotonic
- monotonicクロックの正または負のオフセット値を指定します。フォーマットは、時(h)、分(m)、秒(s)、ミリ秒(ms)、マイクロ秒(us)、ナノ秒(ns)を指定できます。
コンテナに対するソフトもしくはハードリミットを変更できます。非特権コンテナでは、制限を下げることしかできません。明示的に指定されていないリソースは継承されます。
- lxc.prlimit.[limit name]
- 設定したいリソースと制限値を指定します。制限値はコロンで区切られた
2
つの値で指定します。値は数値もしくは
'unlimited'
で指定します。ソフトもハードも同じ値を指定する場合は単一の値を指定できます。指定できる名前は、"RLIMIT_"
接頭辞がなく小文字で書かれた、"RLIMIT_"
リソース名です。例えば、RLIMIT_NOFILE
は "nofile"
と指定します。詳しくは
setrlimit(2)
を参照してください。
値を指定せずに使用した場合、lxc
はこの指定以前に設定されたリソース制限をクリアします。明示的に制限が設定されていないリソースについては、コンテナを起動したプロセスから継承します。
コンテナ用のカーネルパラメータを設定します。
- lxc.sysctl.[kernel parameters name]
- 設定したいカーネルパラメータを指定します。指定できるパラメータは
/proc/sys
以下に存在するものです。
すべての sysctl
パラメータが仮想化(名前空間化)されているわけではないことに注意してください。仮想化されていない
sysctl
を設定すると、システムワイドで設定が変更されてしまいます。
sysctl(8).
値を指定しないでこの設定を指定した場合は、この設定より前に設定されたパラメータをクリアします。
lxc が apparmor
サポートでコンパイルされ、インストールされている場合で、ホストで
apparmor
が有効な場合、コンテナが従って動くべき
apparmor
プロファイルは、コンテナの設定で指定することが可能です。
デフォルトは、ホストのカーネルで
cgroup
名前空間が使える場合は
lxc-container-default-cgnsです。使えない場合は
lxc-container-default です。
- lxc.apparmor.profile
- コンテナが従うべき
apparmor
プロファイルを指定します。
コンテナが apparmor
による制限を受けないように設定するには、以下のように設定します。
lxc.apparmor.profile = unconfined
もし apparmor
プロファイルが変更されないままでなくてはならない場合
(ネストしたコンテナである場合や、すでに
confined されている場合)
は以下のように設定します。
lxc.apparmor.profile = unchanged
もし LXC に AppArmor
プロファイルを生成するように指示するには次のように設定します。
lxc.apparmor.profile = generated
- lxc.apparmor.allow_incomplete
- apparmor
プロファイルはパス名ベースですので、多数のファイルの制限を行う際、執念深い攻撃者に対して効果的であるためにはマウントの制限が必要です。
しかし、これらのマウントの制限は
upstream
のカーネルではまだ実装されていません。マウントの制限なしでも、apparmor
プロファイルによって予想外のダメージに対する保護が可能です。
このフラグが 0 の場合
(デフォルト)、カーネルが
apparmor
のマウント機能をサポートしていない場合にコンテナが起動しません。これはカーネルを更新した後に機能が退行したことが検出できるようにするためです。
不完全な apparmor
の保護の下でコンテナを起動するためには、このフラグを
1
に設定してください。
- lxc.apparmor.allow_nesting
- 1
に設定すると次のような変更が行われます。
generated な AppArmor
プロファイルが使われる場合、ネストしたコンテナを使うのに必要な変更が含まれます。通常のマウントポイントに加えて、lxcfs
のオーバーレイなしで、
/dev/.lxc/proc と /dev/.lxc/sys が procfs
と sysfs
のマウントポイントに含まれます。
generated な AppArmor
プロファイルが使われている場合は、直接読み書きはできません
- lxc.apparmor.raw
- プロファイルに加える、生の
AppArmor
プロファイル行のリストです。generated
なプロファイルを使っているときのみ有効です。
lxc が SELinux
サポートでコンパイルされ、インストールされている場合で、ホストで
SELinux
が有効な場合、コンテナが従って動くべき
SELinux
コンテキストは、コンテナの設定で指定することが可能です。
デフォルトは
unconfined_t
であり、これは lxc
がコンテキストを変えないという意味になります。
ポリシーの例と追加の情報は
/usr/share/lxc/selinux/lxc.te
ファイルを参照してください。
- lxc.selinux.context
- コンテナが従うべき
SELinux
コンテキストを指定するか、
unconfined_t
を指定します。例えば以下のように設定します。
lxc.selinux.context = system_u:system_r:lxc_t:s0:c22
- lxc.selinux.context.keyring
- コンテナのキーリングを作成する
SELinux
コンテキストを指定します。
デフォルトでは
lxc.selinux.context
と同じになります。
lxc.selinux.context
が設定されていない場合は、LXC
のコンテキストで実行されます。
lxc.selinux.context.keyring = system_u:system_r:lxc_t:s0:c22
Linux
キーリング機能は、さまざまなカーネルコンポーネントが、セキュリティーデータ、認証キー、暗号化キー、その他のデータをカーネルに保持またはキャッシュするための機能です。
デフォルトでは、LXC
は開始したアプリケーションのために、新しいセッションキーリングを作成します。
- lxc.keyring.session
- LXC
による新しいセッションキーリングの作成を無効にできます。その場合、開始したアプリケーションは、その時点のセッションキーリングを継承します。
デフォルトは 1 で、1
の場合は LXC
は新しいキーリングを作成します。
lxc.keyring.session = 0
コンテナは、起動時に
seccomp
プロファイルをロードすることで、利用可能なシステムコールを減らして起動することが可能です。
seccomp
の設定ファイルは、1
行目がバージョン番号、2
行目がポリシーのタイプで始まる必要があり、その後に設定を書きます。
現時点では、バージョン番号は
1 と 2
をサポートしています。バージョン
1
では、ポリシーはシンプルなホワイトリストですので、2
行目は "allowlist"
でなければなりません。
そして残りの行には 1
行に 1
つずつ、システムコール番号を書きます。各行のシステムコール番号がホワイトリスト化され、リストにない番号は、そのコンテナではブラックリストに入ります。
バージョン 2
では、ポリシーはブラックリストもしくはホワイトリストで表され、ルールごとのアクションと、ポリシーごとのデフォルトのアクションを設定できます。そして、アーキテクチャごとの設定と、テキストで書かれたシステムコール名での設定が可能です。
以下にブラックリストのポリシーの例を示します。これは
mknod
以外の全てのシステムコールが許可され、mknod
が呼ばれると、何もせずに単に
0(成功) を返します。
2
denylist
mknod errno 0
ioctl notify
アクションとして
"errno" を指定すると、LXC
は seccomp
フィルタを登録します。これにより、指定した
errno
を呼び出し元に返します。
errno の値は "errno"
という単語の後に指定します。
アクションとして
"notify" を指定すると、LXC
は seccomp
リスナーを登録し、カーネルからリスナーのファイルディスクリプタを取得します。
"notify"
として指定しているシステムコールが作成されると、カーネルは
poll
イベントを生成し、ファイルディスクリプタを通してメッセージを送信します。
呼び出し元はこのメッセージを読み、引数を含めてシステムコールを調査できます。
呼び出し元はこの情報に基づき、どのアクションを取るべきかをカーネルに知らせるメッセージを送り返すことが期待されます。
このメッセージが送られるまで、カーネルは呼び出し元のプロセスをブロックします。読み書きするメッセージのフォーマットは
seccomp
自身に記述されています。
- lxc.seccomp.profile
- コンテナがスタートする前にロードする
seccomp
の設定を含むファイルを指定します。
- lxc.seccomp.allow_nesting
- このオプションを
1
に設定すると、すでに
seccomp
プロファイルがロードされている、いないに関わらず、seccomp
フィルタが重ね合わせられます。
これにより、ネストされたコンテナが自身の
seccomp
プロファイルをロードできます。
デフォルト値は 0
です。
- lxc.seccomp.notify.proxy
- LXC が接続し、seccomp
イベントを転送する
UNIX
ソケットを指定します。
パスは unix:/path/to/socket
もしくは unix:@socket
の形式でなければなりません。
前者はパス指定の UNIX
ドメインソケットを指定し、後者は抽象
(abstract) UNIX
ドメインソケットの指定です。
- lxc.seccomp.notify.cookie
- プロキシーされた
seccomp
通知リクエストと一緒に送る追加文字列。
PR_SET_NO_NEW_PRIVS
を付与すると、対象の
execve() は、execve()
の呼び出しなしでは実行できなかったことに対する特権を許可しなくなります
(例えば、set-user-ID、set-group-ID
許可ビットや、ファイルケーパビリティが動作しなくなります)。
一度設定されると、このビットは解除できません。このビットの設定は
fork() や clone()
で生成される子プロセスにも継承され、execve()
の前後で保持されます。
PR_SET_NO_NEW_PRIVS
は、コンテナに適用しようとする
AppArmor
プロファイルもしくは
SELinux
コンテキストへの変更がなされたあとに適用されます。
- lxc.no_new_privs
- コンテナに対して
PR_SET_NO_NEW_PRIVS
ビットを設定するかどうかを指定します。1
に設定すると有効になります。
コンテナは、ユーザとグループの
id
のマッピングを持った専用のユーザ名前空間で起動することが可能です。
たとえば、コンテナ内のユーザ
id 0 を、ホストのユーザ
id 200000
にマッピングすることが可能です。
コンテナの root
ユーザはコンテナ内では特権を持ちますが、ホストでは特権を持ちません。
通常は、システムコンテナは
id
の範囲を要求し、それをマッピングします。
例えば、コンテナ内のユーザとグループの
id 0 から 20,000 を 200,000 から 220,000
にマッピングします。
- lxc.idmap
- 4
つの値を記述する必要があります。
最初の文字は 'u' か 'g'
のどちらかで、ユーザかグループの
ID
のどちらをマッピングするかを指定します。
次はコンテナのユーザ名前空間内に現れる最初のユーザ
ID です。
その次は、そのユーザ
ID
のホスト上での値です。
最後は、ID
のマッピングをいくつ連続して行うかの数を指定します。
コンテナのフックは、コンテナの存続期間の色々な場面で実行することのできるプログラムやスクリプトです。
コンテナフックが実行されるとき、追加の情報が渡されます。追加の引数がコマンドライン引数で渡されるか、環境変数経由で渡されるかを判断するのに、
lxc.hook.version
が使えます。引数は:
- •
- コンテナ名
- •
- セクション (常に
'lxc')
- •
- フックのタイプ
('clone' や 'pre-mount' など)
- •
- 追加の引数。clone
フックの場合、lxc-clone
に渡される追加の引数は、フックへの引数として追加されます。stop
フックの場合は、コンテナの名前空間のそれぞれに対するファイルディスクリプタへのパスが、名前空間名とともに渡されます。
次の環境変数がセットされます。
- •
- LXC_CGNS_AWARE: コンテナで
cgroup namespace
が使えるかどうか
- •
- LXC_CONFIG_FILE:
コンテナの設定ファイルのパス
- •
- LXC_HOOK_TYPE:
フックのタイプ
(例えば
'clone'、'mount'、'pre-mount')。この環境変数が存在するかどうかは
lxc.hook.version
の値次第です。この値が
1 なら、LXC_HOOK_TYPE
が設定されています。
- •
- LXC_HOOK_SECTION:
セクションタイプ
(例えば
'lxc'、'net')。この環境変数が存在するかどうかは
lxc.hook.version
の値次第です。この値が
1 なら、LXC_HOOK_TYPE
が設定されています。
- •
- LXC_HOOK_VERSION:
フックのバージョン。この値は、コンテナの
lxc.hook.version
の値と同じです。もし、この値が
0
に設定されているなら、古いスタイルのフックが使われます。もし
1
に設定されているなら、新しいスタイルのフックが使われます。
- •
- LXC_LOG_LEVEL:
コンテナのログレベル
- •
- LXC_NAME: コンテナ名
- •
- LXC_[NAMESPACE IDENTIFIER]_NS:
コンテナの名前空間が参照する
/proc/PID/fd/
以下のファイルディスクリプタのパス。それぞれの名前空間ごとに別々の環境変数になります。これらの環境変数は
lxc.hook.version が 1
に設定されてる場合のみ設定されます。
- •
- LXC_ROOTFS_MOUNT:
マウントされた root
ファイルシステムへのパス
- •
- LXC_ROOTFS_PATH: コンテナの
lxc.rootfs.path
エントリ。これはマウントされた
rootfs
が存在する場所にはならないでしょう。それには
LXC_ROOTFS_MOUNT
を使用してください。
- •
- LXC_SRC_NAME: clone
フックの場合、元のコンテナの名前
スクリプトからの標準出力は
debug
レベルでロギングされます。
標準エラー出力はロギングされません。
しかし、フックの標準エラー出力を標準出力にリダイレクトすることにより保存することは可能です。
- lxc.hook.version
- 環境変数経由の新しいスタイルで引数を渡すには
1
に設定します。そうでなく、引数として渡すには
0
に設定します。この設定は、古い方法でスクリプトに引数として渡されているすべてのフック引数に影響します。特に、コンテナ名のセクション
(例: 'lxc', 'net')
とフックタイプ (例:
'clone', 'mount', 'pre-mount')
引数に影響します。新しいスタイルのフックが使われる場合、引数は環境変数として利用できます。
コンテナ名は LXC_NAME
に設定されます(これはこの設定項目に設定されている値とは関係なく設定されます)。セクションは
LXC_HOOK_SECTION
に設定されます。そしてフックタイプは
LXC_HOOK_TYPE
に設定されます。
この設定は、コンテナの名前空間を参照するファイルディスクリプタのパスをどのように渡すかにも影響します。1
に設定した場合、名前空間ごとに別の環境変数
LXC_[NAMESPACE IDENTIFIER]_NS
に設定されます。0
に設定すると、パスは
stop
フックの引数として渡されます。
- lxc.hook.pre-start
- コンテナの
tty、コンソールの作成、マウントが実行される前に、ホストの名前空間内で実行するフック。
- lxc.hook.pre-mount
- コンテナのファイルシステムの名前空間で実行されますが、rootfs
が設定される前に実行するフック。
これにより rootfs
の操作が可能になります。
例えば、暗号化されたファイルシステムのマウントなどです。
このフック内でなされるマウントはホストには影響しません
(mounts propagation を除いて)。
なので、それらはコンテナがシャットダウンする時に自動的にクリーンアップされます。
- lxc.hook.mount
- マウントが完了した後ですが、pivot_root
の前にコンテナの名前空間で実行されるフック。
- lxc.hook.autodev
-
lxc.autodev == 1
が設定されている場合で、マウントが完了し、マウント時のフックも実行された後ですが、pivot_root
の前にコンテナの名前空間で実行するフック。
このフックの目的は、systemd
ベースのコンテナ向けの
autodev
オプションが設定されている時に、コンテナの
/dev
ディレクトリを設定するのを支援することです。コンテナの
/dev
ディレクトリは、このフックが実行される時有効な
${ LXC_ROOTFS_MOUNT}
環境変数からの相対パスとなります。
- lxc.hook.start-host
- コンテナのセットアップが済んだあと、コンテナの
init
を実行する直前に、ホストの名前空間で実行するためのフックです。
- lxc.hook.start
- コンテナの init
が実行される直前にコンテナの名前空間で実行されるフック。
コンテナ内で利用可能なプログラムである必要があります。
- lxc.hook.stop
- コンテナのシャットダウン後、コンテナの名前空間への参照とともに、ホストの名前空間で実行されるフックです。
それぞれの名前空間に対応する追加の引数がフックに渡されます。その引数にはコロンで区切られた名前空間のタイプ名とファイル名が含まれており、ファイル名は名前空間に対するファイルディスクリプタを取得するのに使えます。
タイプ名は /proc/PID/ns
ディレクトリ内のファイル名です。
例えば、マウント名前空間に対応する引数は通常は
mnt:/proc/PID/fd/12
のようになります。
- lxc.hook.post-stop
- コンテナがシャットダウンされた後にホストの名前空間で実行するフック。
- lxc.hook.clone
- コンテナが新しいコンテナにクローンされる際に実行されるフック。詳しくは
lxc-clone(1)
を参照してください。
- lxc.hook.destroy
- コンテナを破壊する際に実行されるフックです。
起動時のフックに設定情報を提供し、フックの機能を助けるための環境変数がいくつか利用可能です。
全ての変数が全てのコンテキストで利用可能なわけではありません。
具体的には、全てのパスはホストシステム上のパスであり、そのため、
lxc.hook.start
フックの時点では使用できません。
- LXC_NAME
- LXC
コンテナの名前。共通のログ環境内でのログメッセージに使うときに便利です。[
-n]
- LXC_CONFIG_FILE
- コンテナの設定ファイルのホスト上でのパス。
これは、他の方法では得られない追加の設定情報を見つけるために、コンテナに、元の、トップレベルの設定ファイルの位置を与えるものです。
[ -f]
- LXC_CONSOLE
- 設定されている場合のコンテナのコンソール出力のパス。
[ -c] [lxc.console.path]
- LXC_CONSOLE_LOGPATH
- 設定されている場合のコンテナのコンソールログ出力のパス。
[ -L]
- LXC_ROOTFS_MOUNT
- 初期にコンテナがマウントされる場所。
これは、コンテナインスタンスが起動するためのコンテナの
rootfs
へのホスト上のパスであり、インスタンスのための移行が行われる場所です。
[ lxc.rootfs.mount]
- LXC_ROOTFS_PATH
- rootfs.mount
へマウントされるコンテナのルートへのホスト上のパスです。
[ lxc.rootfs.path]
- LXC_SRC_NAME
- clone
フックの場合のみ使われます。クローン元のコンテナ名が設定されます。
- LXC_TARGET
- stop
フックの場合のみ使われます。コンテナのシャットダウンの場合は
"stop"、リブートの場合は
"reboot"
が設定されます。
- LXC_CGNS_AWARE
- この変数が設定されていない場合、お使いのバージョンの
LXC は cgroup
名前空間を扱えません。設定されている場合、この値は
1
に設定されています。そして、cgroup
名前空間を扱えます。
この変数はカーネルで
cgroup
名前空間が有効であることは保証しません。この変数は
lxcfs
のマウントフックが使います。
ロギングはコンテナごとに設定することが可能です。
デフォルトでは、lxc
パッケージのコンパイル条件に依存し、コンテナのスタートアップは
ERROR
レベルでのみロギングされ、コンテナのパス以下か、/var/log/lxc
以下のどちらかにコンテナ名
(の後に '.log'
が付与される)
をもとにした名前でロギングされます。
デフォルトのログレベルとログファイルは両方とも、コンテナの設定ファイル内で指定され、デフォルトの値を上書きします。
同様に、設定ファイルのエントリは
lxc-start
のコマンドラインオプションで上書きすることも可能です。
- lxc.log.level
- ログを取得するレベル。
ログレベルは 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
でロギングされます。
- lxc.log.file
- ログ情報を書き込むファイル。
- lxc.log.syslog
- ログ情報を syslog
に送ります。ログレベルとして
lxc.log.level
の値を使用します。指定する値は使用する
syslog の facility
です。有効な値は daemon,
local0, local1, local2, local3, local4, local5, local5, local6, local7
のいずれかです。
自動起動オプションでは、自動起動させるコンテナと順番の設定が可能です。
このオプションは LXC
ツールが直接使用するか、ディストリビューションが提供する外部ツールが使用するかもしれません。
- lxc.start.auto
- コンテナを自動起動させるかどうかを設定します。
有効な値は 0(オフ) か
1(オン) です。
- lxc.start.delay
- コンテナを起動させた後、次のコンテナを起動させるまでにどれくらい
(秒)
待つかを設定します。
- lxc.start.order
- 自動起動させるコンテナが多数ある場合のコンテナの起動順を決めるのに使う整数を指定します。
小さい値ほど早く起動します。
- lxc.monitor.unshare
- この値が 0
でない場合、コンテナが初期化される前
(pre-start
フックが実行される前)
にマウント名前空間がホストから
unshare
されます。この機能を使う場合、スタート時に
CAP_SYS_ADMIN
ケーパビリティが必要です。デフォルト値は
0 です。
- lxc.monitor.signal.pdeath
- lxc
のモニタプロセスが終了した際に、コンテナの
init
プロセスに送出するシグナルを指定します。デフォルトでは、lxc
のモニタプロセスが終了した場合には、すべてのコンテナ内のプロセスが停止するように
SIGKILL
が設定されています。
lxc
のモニタプロセスが終了しても、コンテナがすべて確実に動作しつづけるようにするには、この値を
0 に設定します。
- lxc.group
- コンテナを追加したいコンテナグループ名を指定します。
複数の値を設定でき、複数回指定することもできます。
設定されたグループは、関連する一連のコンテナを起動させるために使われます。
コンテナはいくつでもグループに属することができ、全く属さないことも可能です。特別なグループが
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
度ずつ、何度でも指定できます。
- lxc.environment
- コンテナに渡したい環境変数を指定します。
例:
lxc.environment = APP_ENV=production
lxc.environment = SYSLOG_SERVER=192.0.2.42
以下に紹介するいくつかの例に加えて、他の設定例が
/usr/share/doc/lxc/examples にあります。
この設定は、片方をブリッジである
br0 と接続される veth
ペアデバイスを使うコンテナを設定します
(ブリッジは管理者によりあらかじめシステム上に設定済みである必要があります)。
仮想ネットワークデバイスは、コンテナ内では
eth0
とリネームされます。
lxc.uts.name = myhostname
lxc.net.0.type = veth
lxc.net.0.flags = up
lxc.net.0.link = br0
lxc.net.0.name = eth0
lxc.net.0.hwaddr = 4a:49:43:49:79:bf
lxc.net.0.ipv4.address = 1.2.3.5/24 1.2.3.255
lxc.net.0.ipv6.address = 2003:db8:1:0:214:1234:fe0b:3597
この設定は、コンテナ内のユーザとグループ両方の
id 0-9999
の範囲を、ホスト上の
100000-109999
へマッピングします。
lxc.idmap = u 0 100000 10000
lxc.idmap = g 0 100000 10000
この設定は、アプリケーションのための
control group
をいくつか設定します。
cpuset.cpus は定義された cpu
のみ使用できるように制限します。
cpus.share は、control group の (cpu)
優先度を指定します。
devices.allow
は、特定のデバイスを使用可能にします。
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
この例は、control group
を使って、複雑なネットワークスタックを作成し、新しいホスト名を指定し、いくつかの場所をマウントし、ルートファイルシステムを変更するような複雑な設定を示します。
lxc.uts.name = complex
lxc.net.0.type = veth
lxc.net.0.flags = up
lxc.net.0.link = br0
lxc.net.0.hwaddr = 4a:49:43:49:79:bf
lxc.net.0.ipv4.address = 10.2.3.5/24 10.2.3.255
lxc.net.0.ipv6.address = 2003:db8:1:0:214:1234:fe0b:3597
lxc.net.0.ipv6.address = 2003:db8:1:0:214:5432:feab:3588
lxc.net.1.type = macvlan
lxc.net.1.flags = up
lxc.net.1.link = eth0
lxc.net.1.hwaddr = 4a:49:43:49:79:bd
lxc.net.1.ipv4.address = 10.2.3.4/24
lxc.net.1.ipv4.address = 192.168.10.125/24
lxc.net.1.ipv6.address = 2003:db8:1:0:214:1234:fe0b:3596
lxc.net.2.type = phys
lxc.net.2.flags = up
lxc.net.2.link = random0
lxc.net.2.hwaddr = 4a:49:43:49:79:ff
lxc.net.2.ipv4.address = 10.2.3.6/24
lxc.net.2.ipv6.address = 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.fstab = /etc/fstab.complex
lxc.mount.entry = /lib /root/myrootfs/lib none ro,bind 0 0
lxc.rootfs.path = dir:/mnt/rootfs.complex
lxc.rootfs.options = idmap=container
lxc.cap.drop = sys_module mknod setuid net_raw
lxc.cap.drop = mac_override
chroot(1),
pivot_root(8),
fstab(5)
capabilities(7)
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 <
[email protected]>