プロジェクト設定
LXD はあなたの LXD サーバを分割する方法としてプロジェクトをサポートしています。 それぞれのプロジェクトはプロジェクトに固有なインスタンスのセットを持ち、また プロジェクトに固有なイメージやプロファイルを持つこともできます。
プロジェクトに何を含めるかは features
設定キーによって決められます。
機能が無効の場合はプロジェクトは default
プロジェクトから継承します。
デフォルトでは全ての新規プロジェクトは全体のフィーチャーセットを取得し、 アップグレード時には既存のプロジェクトは新規のフィーチャーが有効には なりません。
key/value 設定は現在サポートされている以下のネームスペースによって 名前空間が分けられています。
features
プロジェクトのフィーチャーセットのどの部分が使用中かlimits
プロジェクトに属するコンテナーと VM に適用されるリソース制限user
ユーザーメタデータに対する自由形式の key/value
キー | 型 | 条件 | デフォルト値 | 説明 |
---|---|---|---|---|
features.images | boolean | - | true | プロジェクト用のイメージとイメージエイリアスのセットを分離する |
features.profiles | boolean | - | true | プロジェクト用のプロファイルを分離する |
features.storage.volumes | boolean | - | true | プロジェクトごとに個別のストレージボリュームのセットを使うかどうか |
limits.containers | integer | - | - | プロジェクト内に作成可能なコンテナーの最大数 |
limits.virtual-machines | integer | - | - | プロジェクト内に作成可能な VM の最大数 |
limits.cpu | integer | - | - | プロジェクトのインスタンスに設定する個々の "limits.cpu" 設定の合計の最大値 |
limits.memory | integer | - | - | プロジェクトのインスタンスに設定する個々の "limits.memory" 設定の合計の最大値 |
limits.processes | integer | - | - | プロジェクトのインスタンスに設定する個々の "limits.processes" 設定の合計の最大値 |
restricted | boolean | - | true | セキュリティセンシティブな機能へのアクセスをブロックするかどうか |
restricted.containers.nesting | string | - | block | block と設定すると security.nesting=true と設定するのを防ぐ |
restricted.containers.privilege | string | - | unpriviliged | unpriviliged と設定すると security.privileged=true と設定するのを防ぐ。 isolated と設定すると security.privileged=true に加えて security.idmap.isolated=true と設定するのを防ぐ。 allow と設定すると制限なし。 |
restricted.containers.lowlevel | string | - | block | block と設定すると raw.lxc, raw.idmap, volatile などの低レベルのコンテナーオプションを防ぐ。 |
restricted.virtual-machines.lowlevel | string | - | block | block と設定すると raw.qemu, volatile などの低レベルの仮想マシンオプションを防ぐ。 |
restricted.devices.disk | string | - | managed | block と設定すると root 以外のディスクデバイスを使用できなくする。 managed に設定すると pool= が設定されているときだけディスクデバイスの使用を許可する。 allow と設定すると制限なし。 |
restricted.devices.gpu | string | - | block | block と設定すると gpu タイプのデバイスの使用を防ぐ |
restricted.devices.usb | string | - | block | block と設定すると usb タイプのデバイスの使用を防ぐ |
restricted.devices.nic | string | - | managed | block と設定すると全てのネットワークデバイスの使用を防ぐ。 managed と設定すると network= が設定されているときだけネットワークデバイスの使用を許可する。 allow と設定すると制限なし。 |
restricted.devices.infiniband | string | - | block | block と設定すると infiniband タイプのデバイスの使用を防ぐ |
restricted.devices.unix-char | string | - | block | block と設定すると unix-char タイプのデバイスの使用を防ぐ |
restricted.devices.unix-block | string | - | block | block と設定すると unix-block タイプのデバイスの使用を防ぐ |
restricted.devices.unix-hotplug | string | - | block | block と設定すると unix-hotplug タイプのデバイスの使用を防ぐ |
これらのキーは lxc ツールを使って以下のように設定できます。
lxc project set <project> <key> <value>
プロジェクトの制限
注意: limits.*
設定キーの 1 つを設定する際はプロジェクト内の 全ての インスタンスに直接あるいはプロファイル経由で同じ設定キーを設定 する必要があります。
それに加えて
limits.cpu
設定キーを使うにはさらに CPU ピンニングが使用されて いない 必要があります。limits.memory
設定キーはパーセント ではなく 絶対値で設定する必要があります。
プロジェクトに設定された limits.*
設定キーは直接あるいはプロファイル経由でプロジェクト内のインスタンスに設定した個々の limits.*
設定キーの値の 合計値 に対しての hard な上限として振る舞います。
例えば、プロジェクトの limits.memory
設定キーを 50GB
に設定すると、プロジェクト内のインスタンスに設定された全ての limits.memory
設定キーの個々の値の合計が 50GB
以下に維持されることを意味します。
インスタンスの作成あるいは変更時に limits.memory
の値を全体の合計が 50GB
を超えるように設定しようとするとエラーになります。
同様にプロジェクトの limits.cpu
設定キーを 100
に設定すると、個々の limits.cpu
の値の 合計 が 100
以下に維持されることを意味します。
プロジェクトに対する制限
restricted
設定キーが true
に設定されると、プロジェクトのインスタンスはコンテナーネスティングや生の LXC 設定といったセキュリティセンシティブな機能にアクセスできなくなります。
restricted
設定キーがブロックする機能の正確な組み合わせは LXD の今後のリリースに伴って、より多くの機能がセキュリティセンシテイブであると判断されて増えていく可能性があります。
さまざまな restricted.*
サブキーを使うことで通常なら restricted
でブロックされるはずの個々の機能を選んでホワイトリストに入れ、プロジェクトのインスタンスで使えるようにできます。
例えば
lxc project set <project> restricted=true
lxc project set <project> restricted.containers.nesting=allow
はコンテナーネスティング 以外の 全てのセキュリティセンシティブな機能をブロックします。
それぞれのセキュリティセンシティブな機能は対応する restricted.*
プロジェクト設定サブキーを持ち、その機能をホワイトリストに入れプロジェクトで使えるようにするにはデフォルト値から変更する必要があります。
個々の restricted.*
設定キーの値の変更が有効になるのはトップレベルの restricted
キーが true
に設定されているときのみであることに注意してください。
restricted
が false
に設定されている場合、 restricted.*
サブキーを変更しても実質的には変更していないのと同じです。
ほとんどの restricted.*
設定キーは block
(デフォルト値)か allow
のいずれかの値を設定可能なバイナリースイッチです。
しかし一部の restricted.*
設定キーはより細かい制御のために他の値をサポートします。
全ての restricted.*
キーを allow
に設定すると restricted
自体を false
に設定するのと実質同じことになります。