インスタンスの設定
プロパティ
次のプロパティは、インスタンスに直接結びつくプロパティであり、プロファイルの一部ではありません:
name
architecture
name
はインスタンス名であり、インスタンスのリネームでのみ変更できます。
有効なインスタンス名は次の条件を満たさなければなりません:
- 1 ~ 63 文字
- ASCII テーブルの文字、数字、ダッシュのみから構成される
- 1 文字目は数字、ダッシュではない
- 最後の文字はダッシュではない
この要件は、インスタンス名が DNS レコードとして、ファイルシステム上で、色々なセキュリティプロファイル、そしてインスタンス自身のホスト名として適切に使えるように定められています。
Key/value 形式の設定
key/value 形式の設定は、名前空間構造を取っており、現在は次のような名前空間があります:
boot
(ブートに関連したオプション、タイミング、依存性、…)environment
(環境変数)image
(作成時のイメージプロパティのコピー)limits
(リソース制限)nvidia
(NVIDIA と CUDA の設定)raw
(生のインスタンス設定を上書きする)security
(セキュリティーポリシー)user
(ユーザーの指定するプロパティを保持。検索可能)volatile
(インスタンス固有の内部データを格納するために LXD が内部的に使用する設定)
現在設定できる項目は次のものです:
Key | Type | Default | Live update | Condition | Description |
---|---|---|---|---|---|
boot.autostart | boolean | - | n/a | - | LXD起動時に常にインスタンスを起動するかどうか(設定しない場合、最後の状態 |
がリストアされます) | |||||
boot.autostart.delay | integer | 0 | n/a | - | インスタンスが起動した後に次のインスタンスが起動するまで待つ秒数 |
boot.autostart.priority | integer | 0 | n/a | - | インスタンスを起動させる順番(高いほど早く起動します) |
boot.host_shutdown_timeout | integer | 30 | yes | - | 強制停止前にインスタンスが停止するのを待つ秒数 |
boot.stop.priority | integer | 0 | n/a | - | インスタンスの停止順(高いほど早く停止します) |
environment.* | string | - | yes (exec) | - | インスタンス実行時に設定される key/value 形式の環境変数 |
limits.cpu | string | - (all) | yes | - | インスタンスに割り当てる CPU 番号、もしくは番号の範囲 |
limits.cpu.allowance | string | 100% | yes | container | どれくらい CPU を使えるか。ソフトリミットとしてパーセント指定(例、50%)か固定値として単位時間内に使える時間(25ms/100ms)を指定できます |
limits.cpu.priority | integer | 10 (maximum) | yes | container | 同じ CPU をシェアする他のインスタンスと比較した CPU スケジューリングの優先度(オーバーコミット)(0 〜 10 の整数) |
limits.disk.priority | integer | 5 (medium) | yes | - | 負荷がかかった状態で、インスタンスの I/O リクエストに割り当てる優先度(0 〜 10 の整数) |
limits.hugepages.64KB | string | - | yes | container | 64 KB hugepages の数を制限するため(利用可能な hugepage のサイズはアーキテクチャー依存)のサイズの固定値(さまざまな単位が指定可能、下記参照) |
limits.hugepages.1MB | string | - | yes | container | 1 MB hugepages の数を制限するため(利用可能な hugepage のサイズはアーキテクチャー依存)のサイズの固定値(さまざまな単位が指定可能、下記参照) |
limits.hugepages.2MB | string | - | yes | container | 2 MB hugepages の数を制限するため(利用可能な hugepage のサイズはアーキテクチャー依存)のサイズの固定値(さまざまな単位が指定可能、下記参照) |
limits.hugepages.1GB | string | - | yes | container | 1 GB hugepages の数を制限するため(利用可能な hugepage のサイズはアーキテクチャー依存)のサイズの固定値(さまざまな単位が指定可能、下記参照) |
limits.kernel.* | string | - | no | container | インスタンスごとのカーネルリソースの制限(例、オープンできるファイルの数) |
limits.memory | string | - (all) | yes | - | ホストメモリに対する割合(パーセント)もしくはメモリサイズの固定値(さまざまな単位が指定可能、下記参照) |
limits.memory.enforce | string | hard | yes | container | hard に設定すると、インスタンスはメモリー制限値を超過できません。soft に設定すると、ホストでメモリに余裕がある場合は超過できる可能性があります |
limits.memory.hugepages | boolean | false | no | virtual-machine | インスタンスを動かすために通常のシステムメモリではなく hugepage を使用するかどうか |
limits.memory.swap | boolean | true | yes | container | インスタンスのメモリの一部をディスクにスワップすることを許すかどうか |
limits.memory.swap.priority | integer | 10 (maximum) | yes | container | 高い値を設定するほど、インスタンスがディスクにスワップされにくくなります (0 〜 10 の整数) |
limits.network.priority | integer | 0 (minimum) | yes | - | 負荷がかかった状態で、インスタンスのネットワークリクエストに割り当てる優先度(0 〜 10 の整数) |
limits.processes | integer | - (max) | yes | container | インスタンス内で実行できるプロセスの最大数 |
linux.kernel_modules | string | - | yes | container | インスタンスを起動する前にロードするカーネルモジュールのカンマ区切りのリスト |
migration.incremental.memory | boolean | false | yes | container | インスタンスのダウンタイムを短くするためにインスタンスのメモリを増分転送するかどうか |
migration.incremental.memory.goal | integer | 70 | yes | container | インスタンスを停止させる前に同期するメモリの割合 |
migration.incremental.memory.iterations | integer | 10 | yes | container | インスタンスを停止させる前に完了させるメモリ転送処理の最大数 |
nvidia.driver.capabilities | string | compute,utility | no | container | インスタンスに必要なドライバケーパビリティ(libnvidia-container に環境変数 NVIDIA_DRIVER_CAPABILITIES を設定) |
nvidia.runtime | boolean | false | no | container | ホストの NVIDIA と CUDA ラインタイムライブラリーをインスタンス内でも使えるようにする |
nvidia.require.cuda | string | - | no | container | 必要となる CUDA バージョン(libnvidia-container に環境変数 NVIDIA_REQUIRE_CUDA を設定) |
nvidia.require.driver | string | - | no | container | 必要となるドライバーバージョン(libnvidia-container に環境変数 NVIDIA_REQUIRE_DRIVER を設定) |
raw.apparmor | blob | - | yes | container | 生成されたプロファイルに追加する Apparmor プロファイルエントリー |
raw.idmap | blob | - | no | unprivileged container | 生(raw)の idmap 設定(例: "both 1000 1000") |
raw.lxc | blob | - | no | container | 生成された設定に追加する生(raw)の LXC 設定 |
raw.qemu | blob | - | no | virtual-machine | 生成されたコマンドラインに追加される生(raw)の Qemu 設定 |
raw.seccomp | blob | - | no | container | 生(raw)の seccomp 設定 |
security.devlxd | boolean | true | no | container | インスタンス内の /dev/lxd の存在を制御する |
security.devlxd.images | boolean | false | no | container | devlxd 経由の /1.0/images の利用可否を制御する |
security.idmap.base | integer | - | no | unprivileged container | 割り当てに使う host の ID の base(auto-detection (自動検出)を上書きします) |
security.idmap.isolated | boolean | false | no | unprivileged container | インスタンス間で独立した idmap のセットを使用するかどうか |
security.idmap.size | integer | - | no | unprivileged container | 使用する idmap のサイズ |
security.nesting | boolean | false | yes | container | インスタンス内でネストした lxd の実行を許可するかどうか |
security.privileged | boolean | false | no | container | 特権モードでインスタンスを実行するかどうか |
security.protection.delete | boolean | false | yes | - | インスタンスを削除から保護する |
security.protection.shift | boolean | false | yes | container | インスタンスのファイルシステムが起動時に uid/gid がシフト(再マッピング) されるのを防ぐ |
security.secureboot | boolean | true | no | virtual-machine | UEFI セキュアブートがデフォルトの Microsoft のキーで有効になるかを制御する |
security.syscalls.blacklist | string | - | no | container | \n 区切りのシステムコールのブラックリスト |
security.syscalls.blacklist_compat | boolean | false | no | container | x86_64 で compat_* システムコールのブロックを有効にするかどうか。他のアーキテクチャでは何もしません |
security.syscalls.blacklist_default | boolean | true | no | container | デフォルトのシステムコールブラックリストを有効にするかどうか |
security.syscalls.intercept.mknod | boolean | false | no | container | mknod と mknodat システムコールを処理するかどうか (限定されたサブセットのキャラクタ/ブロックデバイスの作成を許可する) |
security.syscalls.intercept.mount | boolean | false | no | container | mount システムコールを処理するかどうか |
security.syscalls.intercept.mount.allowed | string | - | yes | container | インスタンス内のプロセスが安全にマウントできるファイルシステムのカンマ区切りリストを指定 |
security.syscalls.intercept.mount.fuse | string | - | yes | container | 指定されたファイルシステムを対応する fuse 実装にリダイレクトするかどうか(例: ext4-fuse2fs) |
security.syscalls.intercept.mount.shift | boolean | false | yes | container | mount システムコールをインターセプトして処理対象のファイルシステムの上に shiftfs をマウントするかどうか |
security.syscalls.intercept.setxattr | boolean | false | no | container | setxattr システムコールを処理するかどうか (限定されたサブセットの制限された拡張属性の設定を許可する) |
security.syscalls.whitelist | string | - | no | container | \n 区切りのシステムコールのホワイトリスト(security.syscalls.blacklist\*) と排他) |
snapshots.schedule | string | - | no | - | Cron 表記 (<minute> <hour> <dom> <month> <dow> ) |
snapshots.schedule.stopped | bool | false | no | - | 停止したインスタンスのスナップショットを自動的に作成するかどうか |
snapshots.pattern | string | snap%d | no | - | スナップショット名を表す Pongo2 テンプレート(スケジュールされたスナップショットと名前を指定されないスナップショットに使用される) |
snapshots.expiry | string | - | no | - | スナップショットをいつ削除するかを設定します(1M 2H 3d 4w 5m 6y のような書式で設定します) |
user.* | string | - | n/a | - | 自由形式のユーザー定義の key/value の設定の組(検索に使えます) |
LXD は内部的に次の揮発性の設定を使います:
Key | Type | Default | Description |
---|---|---|---|
volatile.apply_template | string | - | 次の起動時にトリガーされるテンプレートフックの名前 |
volatile.base_image | string | - | インスタンスを作成したイメージのハッシュ(存在する場合) |
volatile.idmap.base | integer | - | インスタンスの主 idmap の範囲の最初の ID |
volatile.idmap.current | string | - | インスタンスで現在使用中の idmap |
volatile.idmap.next | string | - | 次にインスタンスが起動する際に使う idmap |
volatile.last_state.idmap | string | - | シリアライズ化したインスタンスの uid/gid マップ |
volatile.last_state.power | string | - | 最後にホストがシャットダウンした時点のインスタンスの状態 |
volatile.vm.uuid | string | - | 仮想マシンの UUID |
volatile.\<name>.apply_quota | string | - | 次回のインスタンス起動時に適用されるディスククォータ |
volatile.\<name>.ceph_rbd | string | - | Ceph のディスクデバイスの RBD デバイスパス |
volatile.\<name>.host_name | string | - | ホスト上のネットワークデバイス名 |
volatile.\<name>.hwaddr | string | - | ネットワークデバイスの MAC アドレス( hwaddr プロパティがデバイスに設定されていない場合) |
volatile.\<name>.last_state.created | string | - | 物理デバイスのネットワークデバイスが作られたかどうか ("true" または "false") |
volatile.\<name>.last_state.mtu | string | - | 物理デバイスをインスタンスに移動したときに使われていたネットワークデバイスの元の MTU |
volatile.\<name>.last_state.hwaddr | string | - | 物理デバイスをインスタンスに移動したときに使われていたネットワークデバイスの元の MAC |
volatile.\<name>.last_state.vf.id | string | - | SR-IOV の仮想ファンクション(VF)をインスタンスに移動したときに使われていた VF の ID |
volatile.\<name>.last_state.vf.hwaddr | string | - | SR-IOV の仮想ファンクション(VF)をインスタンスに移動したときに使われていた VF の MAC |
volatile.\<name>.last_state.vf.vlan | string | - | SR-IOV の仮想ファンクション(VF)をインスタンスに移動したときに使われていた VF の元の VLAN |
volatile.\<name>.last_state.vf.spoofcheck | string | - | SR-IOV の仮想ファンクション(VF)をインスタンスに移動したときに使われていた VF の元の spoof チェックの設定 |
加えて、次のユーザー設定がイメージで共通になっています(サポートを保証するものではありません):
Key | Type | Default | Description |
---|---|---|---|
user.meta-data | string | - | cloud-init メタデータ。設定は seed 値に追加されます |
user.network-config | string | DHCP on eth0 | cloud-init ネットワーク設定。設定は seed 値として使われます |
user.network_mode | string | dhcp | "dhcp"、"link-local" のどちらか。サポートされているイメージでネットワークを設定するために使われます |
user.user-data | string | #!cloud-config | cloud-init メタデータ。seed 値として使われます |
user.vendor-data | string | #!cloud-config | cloud-init ベンダーデータ。seed 値として使われます |
便宜的に型(type)を定義していますが、すべての値は文字列として保存されます。そして REST API を通して文字列として提供されます(後方互換性を損なうことなく任意の追加の値をサポートできます)。
これらの設定は lxc ツールで次のように設定できます:
lxc config set <instance> <key> <value>
揮発性(volatile)の設定はユーザーは設定できません。そして、インスタンスに対してのみ直接設定できます。
生(raw)の設定は、LXD が使うバックエンドの機能に直接アクセスできます。これを設定することは、自明ではない方法で LXD を破壊する可能性がありますので、可能な限り避ける必要があります。
CPU 制限
CPU 制限は cgroup コントローラの cpuset
と cpu
を組み合わせて実装しています。
limits.cpu
は cpuset
コントローラを使って、使う CPU を固定(ピンニング)します。
使う CPU の組み合わせ(例: 1,2,3
)もしくは使う CPU の範囲(例: 0-3
)で指定できます。
代わりに CPU 数を指定した場合(例: 4
)、LXD は CPU の固定(ピンニング)がされていない全インスタンスのダイナミックな負荷分散を行い、マシン上の負荷を分散しようとします。
インスタンスが起動したり停止するたびに、インスタンスはリバランスされます。これはシステムに CPU が足された場合も同様にリバランスされます。
単一の CPU に固定(ピンニング)するためには、CPU 数との区別をつけるために、範囲を指定する文法(例: 1-1
)を使う必要があります。
limits.cpu.allowance
は、時間の制限を与えたときは CFS スケジューラのクォータを、パーセント指定をした場合は全体的な CPU シェアの仕組みを使います。
時間制限(例: 20ms/50ms
)はひとつの CPU 相当の時間に関連するので、ふたつの CPU の時間を制限するには、100ms/50ms のような指定を使うようにします。
パーセント指定を使う場合は、制限は負荷状態にある場合のみに適用されます。そして設定は、同じ CPU(もしくは CPU の組)を使う他のインスタンスとの比較で、インスタンスに対するスケジューラの優先度を計算するのに使われます。
limits.cpu.priority
は、CPU の組を共有するいくつかのインスタンスに割り当てられた CPU の割合が同じ場合に、スケジューラの優先度スコアを計算するために使われます。
デバイス設定
LXD は、標準の POSIX システムが動作するのに必要な基本的なデバイスを常にインスタンスに提供します。これらはインスタンスやプロファイルの設定では見えず、上書きもできません。
このデバイスには次のようなデバイスが含まれます:
/dev/null
(キャラクターデバイス)/dev/zero
(キャラクターデバイス)/dev/full
(キャラクターデバイス)/dev/console
(キャラクターデバイス)/dev/tty
(キャラクターデバイス)/dev/random
(キャラクターデバイス)/dev/urandom
(キャラクターデバイス)/dev/net/tun
(キャラクターデバイス)/dev/fuse
(キャラクターデバイス)lo
(ネットワークインターフェース)
これ以外に関しては、インスタンスの設定もしくはインスタンスで使われるいずれかのプロファイルで定義する必要があります。デフォルトのプロファイルには、インスタンス内で eth0
になるネットワークインターフェースが通常は含まれます。
インスタンスに追加でデバイスを追加する場合は、デバイスエントリーを直接インスタンスかプロファイルに追加できます。
デバイスはインスタンスの実行中に追加・削除できます。
各デバイスエントリーは一意な名前で識別されます。もし同じ名前が後続のプロファイルやインスタンス自身の設定で使われている場合、エントリー全体が新しい定義で上書きされます。
デバイスエントリーは次のようにインスタンスに追加するか:
lxc config device add <instance> <name> <type> [key=value]...
もしくは次のようにプロファイルに追加します:
lxc profile device add <profile> <name> <type> [key=value]...
デバイスタイプ
LXD では次のデバイスタイプが使えます:
ID (database) | Name | Condition | Description |
---|---|---|---|
0 | none | - | 継承ブロッカー |
1 | nic | - | ネットワークインターフェース |
2 | disk | - | インスタンス内のマウントポイント |
3 | unix-char | container | Unix キャラクターデバイス |
4 | unix-block | container | Unix ブロックデバイス |
5 | usb | container | USB デバイス |
6 | gpu | container | GPU デバイス |
7 | infiniband | container | インフィニバンドデバイス |
8 | proxy | container | プロキシデバイス |
9 | unix-hotplug | container | Unix ホットプラグデバイス |
Type: none
サポートされるインスタンスタイプ: コンテナー, VM
none タイプのデバイスはプロパティを一切持たず、インスタンス内に何も作成しません。
プロファイルからのデバイスの継承を止めるためだけに存在します。
継承を止めるには、継承をスキップしたいデバイスと同じ名前の none タイプのデバイスを追加するだけです。 デバイスは、もともと含まれているプロファイルの後にプロファイルに追加されるか、直接インスタンスに追加されます。
Type: nic
LXD では、様々な種類のネットワークデバイスが使えます:
- physical: ホストの物理デバイスを直接使います。対象のデバイスはホスト上では見えなくなり、インスタンス内に出現します。
- bridged: ホスト上に存在するブリッジを使います。ホストのブリッジとインスタンスを接続する仮想デバイスペアを作成します。
- macvlan: 既存のネットワークデバイスをベースに MAC が異なる新しいネットワークデバイスを作成します。
- ipvlan: 既存のネットワークデバイスをベースに MAC アドレスは同じですが IP アドレスが異なる新しいネットワークデバイスを作成します。
- p2p: 仮想デバイスペアを作成し、片方をインスタンス内に置き、残りの片方をホスト上に残します。
- sriov: SR-IOV が有効な物理ネットワークデバイスの仮想ファンクション(virtual function)をインスタンスに与えます。
- routed: 仮想デバイスペアを作成し、ホストからインスタンスに繋いで静的ルートをセットアップし ARP/NDP エントリーをプロキシします。これにより指定された親インタフェースのネットワークにインスタンスが参加できるようになります。
現状、仮想マシンでは bridged
だけがサポートされます。
ネットワークインターフェースの種類が異なると追加のプロパティが異なります。
nictype
の設定可能な値は、そのタイプの NIC に対応するプロパティとともに以下に記載します。
nictype: physical
サポートされるインスタンスタイプ: コンテナー, VM
物理デバイスそのものをパススルー。対象のデバイスはホストからは消失し、インスタンス内に出現します。
デバイス設定プロパティは以下の通りです。
Key | Type | Default | Required | Description |
---|---|---|---|---|
parent | string | - | yes | ホストデバイスの名前 |
name | string | カーネルが割り当て | no | インスタンス内部でのインタフェース名 |
mtu | integer | 親の MTU | no | 新しいインタフェースの MTU |
hwaddr | string | ランダムに割り当て | no | 新しいインタフェースの MAC アドレス |
vlan | integer | - | no | アタッチ先の VLAN ID |
maas.subnet.ipv4 | string | - | no | インスタンスを登録する MAAS IPv4 サブネット |
maas.subnet.ipv6 | string | - | no | インスタンスを登録する MAAS IPv6 サブネット |
boot.priority | integer | - | no | VM のブート優先度 (高いほうが先にブート) |
nictype: bridged
サポートされるインスタンスタイプ: コンテナー, VM
ホストの既存のブリッジを使用し、ホストのブリッジをインスタンスに接続するための仮想デバイスのペアを作成します。
デバイス設定プロパティは以下の通りです。
Key | Type | Default | Required | Description |
---|---|---|---|---|
parent | string | - | yes | ホストデバイスの名前 |
network | string | - | yes | (parent の代わりに)デバイスをリンクする先の LXD ネットワーク |
name | string | カーネルが割り当て | no | インスタンス内でのインタフェースの名前 |
mtu | integer | 親の MTU | no | 新しいインタフェースの MTU |
hwaddr | string | ランダムに割り当て | no | 新しいインタフェースの MAC アドレス |
host_name | string | ランダムに割り当て | no | ホスト内でのインタフェースの名前 |
limits.ingress | string | - | no | 入力トラフィックの I/O 制限値(さまざまな単位が使用可能、下記参照) |
limits.egress | string | - | no | 出力トラフィックの I/O 制限値(さまざまな単位が使用可能、下記参照) |
limits.max | string | - | no | limits.ingress と limits.egress の両方を同じ値に変更する |
ipv4.address | string | - | no | DHCP でインスタンスに割り当てる IPv4 アドレス |
ipv6.address | string | - | no | DHCP でインスタンスに割り当てる IPv6 アドレス |
ipv4.routes | string | - | no | ホスト上で nic に追加する IPv4 静的ルートのカンマ区切りリスト |
ipv6.routes | string | - | no | ホスト上で nic に追加する IPv6 静的ルートのカンマ区切りリスト |
security.mac_filtering | boolean | false | no | インスタンスが他の MAC アドレスになりすますのを防ぐ |
security.ipv4_filtering | boolean | false | no | インスタンスが他の IPv4 アドレスになりすますのを防ぐ (これを設定すると mac_filtering も有効になります) |
security.ipv6_filtering | boolean | false | no | インスタンスが他の IPv6 アドレスになりすますのを防ぐ (これを設定すると mac_filtering も有効になります) |
maas.subnet.ipv4 | string | - | no | インスタンスを登録する MAAS IPv4 サブネット |
maas.subnet.ipv6 | string | - | no | インスタンスを登録する MAAS IPv6 サブネット |
boot.priority | integer | - | no | VM のブート優先度 (高いほうが先にブート) |
nictype: macvlan
サポートされるインスタンスタイプ: コンテナー, VM
既存のネットワークデバイスを元に新しいネットワークデバイスをセットアップしますが、異なる MAC アドレスを用います。
デバイス設定プロパティは以下の通りです。
Key | Type | Default | Required | Description |
---|---|---|---|---|
parent | string | - | yes | ホストデバイスの名前 |
name | string | カーネルが割り当て | no | インスタンス内部でのインタフェース名 |
mtu | integer | 親の MTU | no | 新しいインタフェースの MTU |
hwaddr | string | ランダムに割り当て | no | 新しいインタフェースの MAC アドレス |
vlan | integer | - | no | アタッチ先の VLAN ID |
maas.subnet.ipv4 | string | - | no | インスタンスを登録する MAAS IPv4 サブネット |
maas.subnet.ipv6 | string | - | no | インスタンスを登録する MAAS IPv6 サブネット |
boot.priority | integer | - | no | VM のブート優先度 (高いほうが先にブート) |
nictype: ipvlan
サポートされるインスタンスタイプ: コンテナー
既存のネットワークデバイスを元に新しいネットワークデバイスをセットアップしますが、異なる IP アドレスを用います。
LXD は現状 L3S モードで IPVLAN をサポートします。
このモードではゲートウェイは LXD により自動的に設定されますが、インスタンスが起動する前に
ipv4.address
と ipv6.address
の設定の 1 つあるいは両方を使うことにより IP アドレスを手動で指定する必要があります。
DNS に関しては、ネームサーバは自動的には設定されないので、インスタンス内部で設定する必要があります。
ipvlan の nictype を使用するには以下の sysctl の設定が必要です。
IPv4 アドレスを使用する場合
net.ipv4.conf.<parent>.forwarding=1
IPv6 アドレスを使用する場合
net.ipv6.conf.<parent>.forwarding=1
net.ipv6.conf.<parent>.proxy_ndp=1
デバイス設定プロパティは以下の通りです。
Key | Type | Default | Required | Description |
---|---|---|---|---|
parent | string | - | yes | ホストデバイスの名前 |
name | string | カーネルが割り当て | no | インスタンス内部でのインタフェース名 |
mtu | integer | 親の MTU | no | 新しいインタフェースの MTU |
hwaddr | string | ランダムに割り当て | no | 新しいインタフェースの MAC アドレス |
ipv4.address | string | - | no | インスタンスに追加する IPv4 静的アドレスのカンマ区切りリスト |
ipv4.gateway | string | auto | no | デフォルト IPv4 ゲートウェイを自動的に追加するかどうか (auto か none を指定可能) |
ipv6.address | string | - | no | インスタンスに追加する IPv6 静的アドレスのカンマ区切りリスト |
ipv6.gateway | string | auto | no | デフォルト IPv6 ゲートウェイを自動的に追加するかどうか (auto か none を指定可能) |
vlan | integer | - | no | アタッチ先の VLAN ID |
nictype: p2p
サポートされるインスタンスタイプ: コンテナー, VM
仮想デバイスペアを作成し、片方はインスタンス内に配置し、もう片方はホストに残します。
デバイス設定プロパティは以下の通りです。
Key | Type | Default | Required | Description |
---|---|---|---|---|
name | string | カーネルが割り当て | no | インスタンス内部でのインタフェース名 |
mtu | integer | カーネルが割り当て | no | 新しいインタフェースの MTU |
hwaddr | string | ランダムに割り当て | no | 新しいインタフェースの MAC アドレス |
host_name | string | ランダムに割り当て | no | ホスト内でのインタフェースの名前 |
limits.ingress | string | - | no | 入力トラフィックの I/O 制限値(さまざまな単位が使用可能、下記参照) |
limits.egress | string | - | no | 出力トラフィックの I/O 制限値(さまざまな単位が使用可能、下記参照) |
limits.max | string | - | no | limits.ingress と limits.egress の両方を同じ値に変更する |
ipv4.routes | string | - | no | ホスト上で nic に追加する IPv4 静的ルートのカンマ区切りリスト |
ipv6.routes | string | - | no | ホスト上で nic に追加する IPv6 静的ルートのカンマ区切りリスト |
boot.priority | integer | - | no | VM のブート優先度 (高いほうが先にブート) |
nictype: sriov
サポートされるインスタンスタイプ: コンテナー, VM
SR-IOV を有効にした物理ネットワークデバイスの仮想ファンクションをインスタンスに渡します。
デバイス設定プロパティは以下の通りです。
Key | Type | Default | Required | Description |
---|---|---|---|---|
parent | string | - | yes | ホストデバイスの名前 |
name | string | カーネルが割り当て | no | インスタンス内部でのインタフェース名 |
mtu | integer | カーネルが割り当て | no | 新しいインタフェースの MTU |
hwaddr | string | ランダムに割り当て | no | 新しいインタフェースの MAC アドレス |
security.mac_filtering | boolean | false | no | インスタンスが他の MAC アドレスになりすますのを防ぐ |
vlan | integer | - | no | アタッチ先の VLAN ID |
maas.subnet.ipv4 | string | - | no | インスタンスを登録する MAAS IPv4 サブネット |
maas.subnet.ipv6 | string | - | no | インスタンスを登録する MAAS IPv6 サブネット |
boot.priority | integer | - | no | VM のブート優先度 (高いほうが先にブート) |
nictype: routed
サポートされるインスタンスタイプ: コンテナー
この NIC タイプは運用上は IPVLAN に似ていて、ブリッジを作成することなくホストの MAC アドレスを共用してインスタンスが外部ネットワークに参加できるようにします。
しかしカーネルに IPVLAN サポートを必要としないこととホストとインスタンスが互いに通信できることが IPVLAN とは異なります。
さらにホスト上の netfilter のルールを尊重し、ホストのルーティングテーブルを使ってパケットをルーティングしますのでホストが複数のネットワークに接続している場合に役立ちます。
IP アドレスは ipv4.address
と ipv6.address
の設定のいずれかあるいは両方を使って、インスタンスが起動する前に手動で指定する必要があります。
ホストとインスタンスの間に veth ペアをセットアップし、ホスト側の veth の上に次のリンクローカルゲートウェイ IP アドレスを設定し、それらをインスタンス内のデフォルトゲートウェイに設定します。
169.254.0.1 fe80::1
次にインスタンスの IP アドレス全てをインスタンスの veth インタフェースに向ける静的ルートをホスト上に設定します。
この nic は parent
のネットワークインタフェースのセットがあってもなくても利用できます。
parent
ネットワークインタフェースのセットがある場合、インスタンスの IP の ARP/NDP のプロキシエントリーが親のインタフェースに追加され、インスタンスが親のインタフェースのネットワークにレイヤ 2 で参加できるようにします。
DNS に関してはネームサーバは自動的には設定されないので、インスタンス内で設定する必要があります。
次の sysctl の設定が必要です。
IPv4 アドレスを使用する場合は
net.ipv4.conf.<parent>.forwarding=1
IPv6 アドレスを使用する場合は
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.<parent>.forwarding=1
net.ipv6.conf.all.proxy_ndp=1
net.ipv6.conf.<parent>.proxy_ndp=1
それぞれの NIC デバイスに複数の IP アドレスを追加できます。しかし複数の routed
NIC インターフェースを使うほうが望ましいかもしれません。
その場合はデフォルトゲ-トウェイの衝突を避けるため、後続のインターフェースで ipv4.gateway
と ipv6.gateway
の値を none に設定するべきです。
さらにこれらの後続のインタフェースには ipv4.host_address
と ipv6.host_address
を用いて異なるホスト側のアドレスを設定することが有用かもしれません。
デバイス設定プロパティ
Key | Type | Default | Required | Description |
---|---|---|---|---|
parent | string | - | no | インスタンスが参加するホストデバイス名 |
name | string | カーネルが割り当て | no | インスタンス内でのインタフェース名 |
host_name | string | ランダムに割り当て | no | ホスト内でのインターフェース名 |
mtu | integer | 親の MTU | no | 新しいインタフェースの MTU |
hwaddr | string | ランダムに割り当て | no | 新しいインタフェースの MAC アドレス |
ipv4.address | string | - | no | インスタンスに追加する IPv4 静的アドレスのカンマ区切りリスト |
ipv4.gateway | string | auto | no | 自動的に IPv4 のデフォルトゲートウェイを追加するかどうか( auto か none を指定可能) |
ipv4.host_address | string | 169.254.0.1 | no | ホスト側の veth インターフェースに追加する IPv4 アドレス |
ipv6.address | string | - | no | インスタンスに追加する IPv6 静的アドレスのカンマ区切りリスト |
ipv6.gateway | string | auto | no | 自動的に IPv6 のデフォルトゲートウェイを追加するかどうか( auto か none を指定可能) |
ipv6.host_address | string | fe80::1 | no | ホスト側の veth インターフェースに追加する IPv6 アドレス |
vlan | integer | - | no | アタッチ先の VLAN ID |
ブリッジ、ipvlan、macvlan を使った物理ネットワークへの接続
bridged
、ipvlan
、macvlan
インターフェースタイプのいずれも、既存の物理ネットワークへ接続できます。
macvlan
は、物理 NIC を効率的に分岐できます。つまり、物理 NIC からインスタンスで使える第 2 のインターフェースを取得できます。macvlan を使うことで、ブリッジデバイスと veth ペアの作成を減らせますし、通常はブリッジよりも良いパフォーマンスが得られます。
macvlan の欠点は、macvlan は外部との間で通信はできますが、自身の親デバイスとは通信できないことです。つまりインスタンスとホストが通信する必要がある場合は macvlan は使えません。
そのような場合は、ブリッジを選ぶのが良いでしょう。macvlan では使えない MAC フィルタリングと I/O 制限も使えます。
ipvlan
は macvlan
と同様ですが、フォークされたデバイスが静的に割り当てられた IP アドレスを持ち、ネットワーク上の親の MAC アドレスを受け継ぐ点が異なります。
SR-IOV
sriov
インターフェースタイプで、SR-IOV が有効になったネットワークデバイスを使えます。このデバイスは、複数の仮想ファンクション(Virtual Functions: VFs)をネットワークデバイスの単一の物理ファンクション(Physical Function: PF)に関連付けます。
PF は標準の PCIe ファンクションです。一方、VFs は非常に軽量な PCIe ファンクションで、データの移動に最適化されています。
VFs は PF のプロパティを変更できないように、制限された設定機能のみを持っています。
VFs は通常の PCIe デバイスとしてシステム上に現れるので、通常の物理デバイスと同様にインスタンスに与えることができます。
sriov
インターフェースタイプは、システム上の SR-IOV が有効になったネットワークデバイス名が、parent
プロパティに設定されることを想定しています。
すると LXD は、システム上で使用可能な VFs があるかどうかをチェックします。デフォルトでは、LXD は検索で最初に見つかった使われていない VF を割り当てます。
有効になった VF が存在しないか、現時点で有効な VFs がすべて使われている場合は、サポートされている VF 数の最大値まで有効化し、最初の使用可能な VF をつかいます。
もしすべての使用可能な VF が使われているか、カーネルもしくはカードが VF 数を増加させられない場合は、LXD はエラーを返します。
sriov
ネットワークデバイスは次のように作成します:
lxc config device add <instance> <device-name> nic nictype=sriov parent=<sriov-enabled-device>
特定の未使用な VF を使うように LXD に指示するには、host_name
プロパティを追加し、有効な VF 名を設定します。
MAAS を使った統合管理
もし、LXD ホストが接続されている物理ネットワークを MAAS を使って管理している場合で、インスタンスを直接 MAAS が管理するネットワークに接続したい場合は、MAAS とやりとりをしてインスタンスをトラッキングするように LXD を設定できます。
そのためには、デーモンに対して、maas.api.url
と maas.api.key
を設定しなければなりません。
そして、maas.subnet.ipv4
と maas.subnet.ipv6
の両方またはどちらかを、インスタンスもしくはプロファイルの nic
エントリーに設定します。
これで、LXD はすべてのインスタンスを MAAS に登録し、適切な DHCP リースと DNS レコードがインスタンスに与えられます。
ipv4.address
もしくは ipv6.address
を設定した場合は、MAAS 上でも静的な割り当てとして登録されます。
Type: infiniband
サポートされるインスタンスタイプ: コンテナー
LXD では、InfiniBand デバイスに対する 2 種類の異なったネットワークタイプが使えます:
physical
: ホストの物理デバイスをパススルーで直接使います。対象のデバイスはホスト上では見えなくなり、インスタンス内に出現しますsriov
: SR-IOV が有効な物理ネットワークデバイスの仮想ファンクション(virtual function)をインスタンスに与えます
ネットワークインターフェースの種類が異なると追加のプロパティが異なります。現時点のリストは次の通りです:
Key | Type | Default | Required | Used by | Description |
---|---|---|---|---|---|
nictype | string | - | yes | all | デバイスタイプ。physical か sriov のいずれか |
name | string | カーネルが割り当て | no | all | インスタンス内部でのインターフェース名 |
hwaddr | string | ランダムに割り当て | no | all | 新しいインターフェースの MAC アドレス。 20 バイト全てを指定するか短い 8 バイト (この場合親デバイスの最後の 8 バイトだけを変更) のどちらかを設定可能 |
mtu | integer | 親の MTU | no | all | 新しいインターフェースの MTU |
parent | string | - | yes | physical, sriov | ホスト上のデバイス、ブリッジの名前 |
physical
な infiniband
デバイスを作成するには次のように実行します:
lxc config device add <instance> <device-name> infiniband nictype=physical parent=<device>
InfiniBand デバイスでの SR-IOV
InfiniBand デバイスは SR-IOV をサポートしますが、他の SR-IOV と違って、SR-IOV モードでの動的なデバイスの作成はできません。 つまり、カーネルモジュール側で事前に仮想ファンクション(virtual functions)の数を設定する必要があるということです。
sriov
の infiniband
でデバイスを作るには次のように実行します:
lxc config device add <instance> <device-name> infiniband nictype=sriov parent=<sriov-enabled-device>
Type: disk
サポートされるインスタンスタイプ: コンテナー, VM
ディスクエントリーは基本的にインスタンス内のマウントポイントです。ホスト上の既存ファイルやディレクトリのバインドマウントでも構いませんし、ソースがブロックデバイスであるなら、通常のマウントでも構いません。
LXD では以下の追加のソースタイプをサポートします。
- Ceph-rbd: 外部で管理されている既存の ceph RBD デバイスからマウントします。 LXD は ceph をインスタンスの内部のファイルシステムを管理するのに使用できます。ユーザーが事前に既存の ceph RBD を持っておりそれをインスタンスに使いたい場合はこのコマンドを使用できます。 コマンド例
lxc config device add <instance> ceph-rbd1 disk source=ceph:<my_pool>/<my-volume> ceph.user_name=<username> ceph.cluster_name=<username> path=/ceph
- Ceph-fs: 外部で管理されている既存の ceph FS からマウントします。 LXD は ceph をインスタンスの内部のファイルシステムを管理するのに使用できます。ユーザーが事前に既存の ceph ファイルシステムを持っておりそれをインスタンスに使いたい場合はこのコマンドを使用できます。 コマンド例
lxc config device add <instance> ceph-fs1 disk source=cephfs:<my-fs>/<some-path> ceph.user_name=<username> ceph.cluster_name=<username> path=/cephfs
- VM cloud-init: user.vendor-data, user.user-data と user.meta-data 設定キーから cloud-init 設定の ISO イメージを生成し VM にアタッチできるようにします。この ISO イメージは VM 内で動作する cloud-init が起動時にドライバを検出し設定を適用します。仮想マシンのインスタンスでのみ利用可能です。 コマンド例
lxc config device add <instance> config disk source=cloud-init:config
現状では仮想マシンではルートディスク (path=/) と設定ドライブ (source=cloud-init:config) のみがサポートされます。
次に挙げるプロパティがあります:
Key | Type | Default | Required | Description |
---|---|---|---|---|
limits.read | string | - | no | byte/s(さまざまな単位が使用可能、下記参照)もしくは iops(あとに "iops" と付けなければなりません)で指定する読み込みの I/O 制限値 |
limits.write | string | - | no | byte/s(さまざまな単位が使用可能、下記参照)もしくは iops(あとに "iops" と付けなければなりません)で指定する書き込みの I/O 制限値 |
limits.max | string | - | no | limits.read と limits.write の両方を同じ値に変更する |
path | string | - | yes | ディスクをマウントするインスタンス内のパス |
source | string | - | yes | ファイル・ディレクトリ、もしくはブロックデバイスのホスト上のパス |
required | boolean | true | no | ソースが存在しないときに失敗とするかどうかを制御する |
readonly | boolean | false | no | マウントを読み込み専用とするかどうかを制御する |
size | string | - | no | byte(さまざまな単位が使用可能、下記参照す)で指定するディスクサイズ。rootfs(/)でのみサポートされます |
recursive | boolean | false | no | ソースパスを再帰的にマウントするかどうか |
pool | string | - | no | ディスクデバイスが属するストレージプール。LXD が管理するストレージボリュームにのみ適用されます |
propagation | string | - | no | バインドマウントをインスタンスとホストでどのように共有するかを管理する(デフォルトである private , shared , slave , unbindable , rshared , rslave , runbindable , rprivate のいずれか。詳しくは Linux kernel の文書 shared subtree をご覧ください) |
shift | boolean | false | no | ソースの uid/gid をインスタンスにマッチするように変換させるためにオーバーレイの shift を設定するか |
raw.mount.options | string | - | no | ファイルシステム固有のマウントオプション |
ceph.user_name | string | admin | no | ソースが ceph か cephfs の場合に適切にマウントするためにユーザーが ceph user_name を指定しなければなりません |
ceph.cluster_name | string | ceph | no | ソースが ceph か cephfs の場合に適切にマウントするためにユーザーが ceph cluster_name を指定しなければなりません |
boot.priority | integer | - | no | VM のブート優先度 (高いほうが先にブート) |
Type: unix-char
サポートされるインスタンスタイプ: コンテナー
UNIX キャラクターデバイスエントリーは、シンプルにインスタンスの /dev
に、リクエストしたキャラクターデバイスを出現させます。そしてそれに対して読み書き操作を許可します。
次に挙げるプロパティがあります:
Key | Type | Default | Required | Description |
---|---|---|---|---|
source | string | - | no | ホスト上でのパス |
path | string | - | no | インスタンス内のパス("source" と "path" のどちらかを設定しなければいけません) |
major | int | device on host | no | デバイスのメジャー番号 |
minor | int | device on host | no | デバイスのマイナー番号 |
uid | int | 0 | no | インスタンス内のデバイス所有者の UID |
gid | int | 0 | no | インスタンス内のデバイス所有者の GID |
mode | int | 0660 | no | インスタンス内のデバイスのモード |
required | boolean | true | no | このデバイスがインスタンスの起動に必要かどうか |
Type: unix-block
サポートされるインスタンスタイプ: コンテナー
UNIX ブロックデバイスエントリーは、シンプルにインスタンスの /dev
に、リクエストしたブロックデバイスを出現させます。そしてそれに対して読み書き操作を許可します。
次に挙げるプロパティがあります:
Key | Type | Default | Required | Description |
---|---|---|---|---|
source | string | - | no | ホスト上のパス |
path | string | - | no | インスタンス内のパス("source" と "path" のどちらかを設定しなければいけません) |
major | int | device on host | no | デバイスのメジャー番号 |
minor | int | device on host | no | デバイスのマイナー番号 |
uid | int | 0 | no | インスタンス内のデバイス所有者の UID |
gid | int | 0 | no | インスタンス内のデバイス所有者の GID |
mode | int | 0660 | no | インスタンス内のデバイスのモード |
required | boolean | true | no | このデバイスがインスタンスの起動に必要かどうか |
Type: usb
USB デバイスエントリーは、シンプルにリクエストのあった USB デバイスをインスタンスに出現させます。
次に挙げるプロパティがあります:
Key | Type | Default | Required | Description |
---|---|---|---|---|
vendorid | string | - | no | USB デバイスのベンダー ID |
productid | string | - | no | USB デバイスのプロダクト ID |
uid | int | 0 | no | インスタンス内のデバイス所有者の UID |
gid | int | 0 | no | インスタンス内のデバイス所有者の GID |
mode | int | 0660 | no | インスタンス内のデバイスのモード |
required | boolean | false | no | このデバイスがインスタンスの起動に必要かどうか(デフォルトは false で、すべてのデバイスがホットプラグ可能です) |
Type: gpu
サポートされるインスタンスタイプ: コンテナー
GPU デバイスエントリーは、シンプルにリクエストのあった GPU デバイスをインスタンスに出現させます。
次に挙げるプロパティがあります:
Key | Type | Default | Required | Description |
---|---|---|---|---|
vendorid | string | - | no | GPU デバイスのベンダー ID |
productid | string | - | no | GPU デバイスのプロダクト ID |
id | string | - | no | GPU デバイスのカード ID |
pci | string | - | no | GPU デバイスの PCI アドレス |
uid | int | 0 | no | インスタンス内のデバイス所有者の UID |
gid | int | 0 | no | インスタンス内のデバイス所有者の GID |
mode | int | 0660 | no | インスタンス内のデバイスのモード |
Type: proxy
サポートされるインスタンスタイプ: コンテナー
プロキシーデバイスにより、ホストとインスタンス間のネットワーク接続を転送できます。 このデバイスを使って、ホストのアドレスの一つに到達したトラフィックをインスタンス内のアドレスに転送したり、その逆を行ったりして、ホストを通してインスタンス内にアドレスを持てます。
利用できる接続タイプは次の通りです:
* TCP <-> TCP
* UDP <-> UDP
* UNIX <-> UNIX
* TCP <-> UNIX
* UNIX <-> TCP
* UDP <-> TCP
* TCP <-> UDP
* UDP <-> UNIX
* UNIX <-> UDP
Key | Type | Default | Required | Description |
---|---|---|---|---|
listen | string | - | yes | バインドし、接続を待ち受けるアドレスとポート |
connect | string | - | yes | 接続するアドレスとポート |
bind | string | host | no | ホスト/ゲストのどちら側にバインドするか |
uid | int | 0 | no | listen する Unix ソケットの所有者の UID |
gid | int | 0 | no | listen する Unix ソケットの所有者の GID |
mode | int | 0644 | no | listen する Unix ソケットのモード |
nat | bool | false | no | NAT 経由でプロキシーを最適化するかどうか |
proxy_protocol | bool | false | no | 送信者情報を送信するのに HAProxy の PROXY プロトコルを使用するかどうか |
security.uid | int | 0 | no | 特権を落とす UID |
security.gid | int | 0 | no | 特権を落とす GID |
lxc config device add <instance> <device-name> proxy listen=<type>:<addr>:<port>[-<port>][,<port>] connect=<type>:<addr>:<port> bind=<host/instance>
Type: unix-hotplug
サポートされるインスタンスタイプ: コンテナー
Unix ホットプラグデバイスのエントリーは依頼された unix デバイスをインスタンスの /dev
に出現させ、デバイスがホストシステムに存在する場合はデバイスへの読み書き操作を許可します。
実装はホスト上で稼働する systemd-udev に依存します。
以下の設定があります。
Key | Type | Default | Required | Description |
---|---|---|---|---|
vendorid | string | - | no | unix デバイスのベンダー ID |
productid | string | - | no | unix デバイスの製品 ID |
uid | int | 0 | no | インスタンス内でのデバイスオーナーの UID |
gid | int | 0 | no | インスタンス内でのデバイスオーナーの GID |
mode | int | 0660 | no | インスタンス内でのデバイスのモード { |
required | boolean | false | no | このデバイスがインスタンスを起動するのに必要かどうか。(デフォルトは false で全てのデバイスはホットプラグ可能です) |
ストレージとネットワーク制限の単位
バイト数とビット数を表す値は全ていくつかの有用な単位を使用し特定の制限がどういう値かをより理解しやすいようにできます。
10進と2進 (kibi) の単位の両方がサポートされており、後者は主にストレージの制限に有用です。
現在サポートされているビットの単位の完全なリストは以下の通りです。
- bit (1)
- kbit (1000)
- Mbit (1000^2)
- Gbit (1000^3)
- Tbit (1000^4)
- Pbit (1000^5)
- Ebit (1000^6)
- Kibit (1024)
- Mibit (1024^2)
- Gibit (1024^3)
- Tibit (1024^4)
- Pibit (1024^5)
- Eibit (1024^6)
現在サポートされているバイトの単位の完全なリストは以下の通りです。
- B または bytes (1)
- kB (1000)
- MB (1000^2)
- GB (1000^3)
- TB (1000^4)
- PB (1000^5)
- EB (1000^6)
- KiB (1024)
- MiB (1024^2)
- GiB (1024^3)
- TiB (1024^4)
- PiB (1024^5)
- EiB (1024^6)
インスタンスタイプ
LXD ではシンプルなインスタンスタイプが使えます。これは、インスタンスの作成時に指定できる文字列で表されます。
3 つの指定方法があります:
<instance type>
<cloud>:<instance type>
c<CPU>-m<RAM in GB>
例えば、次の 3 つは同じです:
- t2.micro
- aws:t2.micro
- c1-m1
コマンドラインでは、インスタンスタイプは次のように指定します:
lxc launch ubuntu:18.04 my-instance -t t2.micro
使えるクラウドとインスタンスタイプのリストは次をご覧ください:
https://github.com/dustinkirkland/instance-type
limits.hugepages.[size]
を使った hugepage の制限
LXD では limits.hugepage.[size]
キーを使ってコンテナーが利用できる hugepage の数を制限できます。
hugepage の制限は hugetlb cgroup コントローラーを使って行われます。
これはつまりこれらの制限を適用するためにホストシステムが hugetlb コントローラーを legacy あるいは unified cgroup の階層に公開する必要があることを意味します。
アーキテクチャーによって複数の hugepage のサイズを公開していることに注意してください。
さらに、アーキテクチャーによっては他のアーキテクチャーとは異なる hugepage のサイズを公開しているかもしれません。
hugepage の制限は非特権コンテナー内で hugetlbfs
ファイルシステムの mount システムコールをインターセプトするように LXD を設定しているときには特に有用です。
LXD が hugetlbfs
mount システムコールをインターセプトすると LXD は正しい uid
と gid
の値を mount オプションに指定して hugetblfs
ファイルシステムをコンテナーにマウントします。
これにより非特権コンテナーからも hugepage が利用可能となります。
しかし、ホストで利用可能な hugepage をコンテナーが使い切ってしまうのを防ぐため、 limits.hugepages.[size]
を使ってコンテナーが利用可能な hugepage の数を制限することを推奨します。
limits.kernel.[limit name]
を使ったリソース制限
LXD では、指定したインスタンスのリソース制限を設定するのに、 limits.kernel.*
という名前空間のキーが使えます。
LXD は limits.kernel.*
のあとに指定されるキーのリソースについての妥当性の確認は一切行ないません。
LXD は、使用中のカーネルで、指定したリソースがすべてが使えるのかどうかを知ることができません。
LXD は単純に limits.kernel.*
の後に指定されるリソースキーと値をカーネルに渡すだけです。
カーネルが適切な確認を行います。これにより、ユーザーは使っているシステム上で使えるどんな制限でも指定できます。
いくつか一般的に使える制限は次の通りです:
Key | Resource | Description |
---|---|---|
limits.kernel.as | RLIMIT_AS | プロセスの仮想メモリーの最大サイズ |
limits.kernel.core | RLIMIT_CORE | プロセスのコアダンプファイルの最大サイズ |
limits.kernel.cpu | RLIMIT_CPU | プロセスが使える CPU 時間の秒単位の制限 |
limits.kernel.data | RLIMIT_DATA | プロセスのデーターセグメントの最大サイズ |
limits.kernel.fsize | RLIMIT_FSIZE | プロセスが作成できるファイルの最大サイズ |
limits.kernel.locks | RLIMIT_LOCKS | プロセスが確立できるファイルロック数の制限 |
limits.kernel.memlock | RLIMIT_MEMLOCK | プロセスが RAM 上でロックできるメモリのバイト数の制限 |
limits.kernel.nice | RLIMIT_NICE | 引き上げることができるプロセスの nice 値の最大値 |
limits.kernel.nofile | RLIMIT_NOFILE | プロセスがオープンできるファイルの最大値 |
limits.kernel.nproc | RLIMIT_NPROC | 呼び出し元プロセスのユーザーが作れるプロセスの最大数 |
limits.kernel.rtprio | RLIMIT_RTPRIO | プロセスに対して設定できるリアルタイム優先度の最大値 |
limits.kernel.sigpending | RLIMIT_SIGPENDING | 呼び出し元プロセスのユーザーがキューに入れられるシグナルの最大数 |
指定できる制限の完全なリストは getrlimit(2)
/setrlimit(2)
システムコールの man ページで確認できます。
limits.kernel.*
名前空間内で制限を指定するには、RLIMIT_
を付けずに、リソース名を小文字で指定します。
例えば、RLIMIT_NOFILE
は nofile
と指定します。制限は、コロン区切りのふたつの数字もしくは unlimited
という文字列で指定します(例: limits.kernel.nofile=1000:2000
)。
単一の値を使って、ソフトリミットとハードリミットを同じ値に設定できます(例: limits.kernel.nofile=3000
)。
明示的に設定されないリソースは、インスタンスを起動したプロセスから継承されます。この継承は LXD でなく、カーネルによって強制されます。
スナップショットの定期実行
LXD は 1 分毎に最大 1 回作成可能なスナップショットの定期実行をサポートします。
3 つの設定項目があります。 snapshots.schedule
には短縮された cron 書式:
<分> <時> <日> <月> <曜日>
を指定します。これが空 (デフォルト) の場合はスナップショットは
作成されません。 snapshots.schedule.stopped
は自動的にスナップショットを作成する際に
インスタンスを停止するかどうかを制御します。デフォルトは false
です。
snapshots.pattern
は pongo2 のテンプレート文字列を指定し、 pongo2 のコンテキストには
creation_date
変数を含みます。スナップショットの名前に禁止された文字が含まれないように
日付をフォーマットする (例: {{ creation_date|date:"2006-01-02_15-04-05" }}
) べきで
あることに注意してください。名前の衝突を防ぐ別の方法はプレースホルダ %d
を使うことです。
(プレースホルダを除いて) 同じ名前のスナップショットが既に存在する場合、
既存の全てのスナップショットの名前を考慮に入れてプレースホルダの最大の番号を見つけます。
新しい名前にはこの番号を 1 増やしたものになります。スナップショットが存在しない場合の
開始番号は 0
になります。