プロジェクト設定

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 に設定されているときのみであることに注意してください。 restrictedfalse に設定されている場合、 restricted.* サブキーを変更しても実質的には変更していないのと同じです。

ほとんどの restricted.* 設定キーは block (デフォルト値)か allow のいずれかの値を設定可能なバイナリースイッチです。 しかし一部の restricted.* 設定キーはより細かい制御のために他の値をサポートします。

全ての restricted.* キーを allow に設定すると restricted 自体を false に設定するのと実質同じことになります。