インスタンスの設定

プロパティ

次のプロパティは、インスタンスに直接結びつくプロパティであり、プロファイルの一部ではありません:

  • 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_64compat_* システムコールのブロックを有効にするかどうか。他のアーキテクチャでは何もしません
security.syscalls.blacklist_default boolean true no container デフォルトのシステムコールブラックリストを有効にするかどうか
security.syscalls.intercept.mknod boolean false no container mknodmknodat システムコールを処理するかどうか (限定されたサブセットのキャラクタ/ブロックデバイスの作成を許可する)
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 コントローラの cpusetcpu を組み合わせて実装しています。

limits.cpucpuset コントローラを使って、使う 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.ingresslimits.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.addressipv6.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.ingresslimits.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.addressipv6.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.gatewayipv6.gateway の値を none に設定するべきです。 さらにこれらの後続のインタフェースには ipv4.host_addressipv6.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 を使った物理ネットワークへの接続

bridgedipvlanmacvlan インターフェースタイプのいずれも、既存の物理ネットワークへ接続できます。

macvlan は、物理 NIC を効率的に分岐できます。つまり、物理 NIC からインスタンスで使える第 2 のインターフェースを取得できます。macvlan を使うことで、ブリッジデバイスと veth ペアの作成を減らせますし、通常はブリッジよりも良いパフォーマンスが得られます。

macvlan の欠点は、macvlan は外部との間で通信はできますが、自身の親デバイスとは通信できないことです。つまりインスタンスとホストが通信する必要がある場合は macvlan は使えません。

そのような場合は、ブリッジを選ぶのが良いでしょう。macvlan では使えない MAC フィルタリングと I/O 制限も使えます。

ipvlanmacvlan と同様ですが、フォークされたデバイスが静的に割り当てられた 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.urlmaas.api.key を設定しなければなりません。 そして、maas.subnet.ipv4maas.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 デバイスタイプ。physicalsriov のいずれか
name string カーネルが割り当て no all インスタンス内部でのインターフェース名
hwaddr string ランダムに割り当て no all 新しいインターフェースの MAC アドレス。 20 バイト全てを指定するか短い 8 バイト (この場合親デバイスの最後の 8 バイトだけを変更) のどちらかを設定可能
mtu integer 親の MTU no all 新しいインターフェースの MTU
parent string - yes physical, sriov ホスト上のデバイス、ブリッジの名前

physicalinfiniband デバイスを作成するには次のように実行します:

lxc config device add <instance> <device-name> infiniband nictype=physical parent=<device>

InfiniBand デバイスでの SR-IOV

InfiniBand デバイスは SR-IOV をサポートしますが、他の SR-IOV と違って、SR-IOV モードでの動的なデバイスの作成はできません。 つまり、カーネルモジュール側で事前に仮想ファンクション(virtual functions)の数を設定する必要があるということです。

sriovinfiniband でデバイスを作るには次のように実行します:

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.readlimits.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 は正しい uidgid の値を 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_NOFILEnofile と指定します。制限は、コロン区切りのふたつの数字もしくは 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 になります。