# インスタンスのコマンド実行 LXDは与えられたインスタンス内でコマンドを実行することを容易にします。 コンテナでは、これは常に動作し、LXDによって直接処理されます。 仮想マシンでは、これは仮想マシン内で動作する`lxd-agent`プロセスに依存します。 CLIレベルでは、これは`lxc exec`コマンドによって達成されます。 実行するコマンドだけでなく、実行モード、ユーザー、グループ、作業を指定することができます。 実行モード、ユーザー、グループ、作業ディレクトリの指定をサポートします。 APIレベルでは、`/1.0/instances/NAME/exec`で実現されます。 ## 実行モード LXDはコマンドを対話的にも非対話的にも実行できます。 インタラクティブモードでは、入力(stdin)と出力(stdout, stderr)を扱うために疑似端末装置(PTS)が使用されます。 これは、ターミナル・エミュレータに接続されている場合(スクリプトから実行されていない場合)、CLIによって自動的に選択されます。 非インタラクティブ・モードでは、代わりにパイプが割り当てられ、stdin、stdout、stderrのそれぞれに1つずつ割り当てられます。 これにより、多くのスクリプトで必要とされるように、コマンドを実行しながら、stdin、stdout、stderrを別々に適切に取得することができます。 ## ユーザー、グループ、作業ディレクトリ LXDはインスタンス内のデータを読まない、あるいはその中にあるものを信用しないというポリシーを持っています。 これは、LXDがユーザーやグループの解決を処理するために、`/etc/passwd`、`/etc/group`や`/etc/nsswitch.conf`のようなものを解析しないことを意味しています。 結果として、LXDはユーザのホームディレクトリがどこにあるか、あるいはどのような補助的なグループがあるかを知りません。 デフォルトでは、LXDはroot (uid 0)、デフォルトのグループ(gid 0)としてコマンドを実行します。 作業ディレクトリは/rootに設定されています。 ユーザー、グループ、作業ディレクトリはすべて上書きすることができますが、絶対値(uid、gid、パス)は LXDが解決してくれるわけではないので、利用者が指定する必要があります。 ## 環境 execセッション中に設定される環境変数は、いくつかのソースから得られます。 - インスタンスに直接設定される`environment.KEY=VALUE` - execセッション中に直接渡される環境変数 - LXDによって設定されるデフォルト変数 最後のカテゴリでは、LXDは`PATH`を`/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin`に設定し、 必要に応じて `/snap` と `/etc/NIXOS` で拡張されます。 さらに、`LANG`には`C.UTF-8`が設定されます。 root (uid 0) として実行する場合は、以下の変数も設定されます。 - `HOME` に `/root` が設定されます。 - `USER` に `root` が設定される。 他のユーザーとして実行する場合、正しい値を指定するのはそのユーザーの責任です。 これらのデフォルト値が設定されるのは、インスタンス構成に含まれていなかったり、exec セッションで直接オーバーライドされていない場合のみです。