「nsenter:」を使用してサブプロセスを刑務所に置く安定した方法

「nsenter:」を使用してサブプロセスを刑務所に置く安定した方法

私は何よりもLinuxの名前空間を使用して子プロセスをゾンビ化したり、initutil-linux開始されたすべてのプロセスが他のプロセスの直接的な名前空間サブアイテムであるかどうかを観察、監視、および確認するためのツールをどのように使用して提供できますか?mountnsenter

ベストアンサー1

PID名前空間の作成

ここで使用する正しいコマンドはですunshare。これを行うために必要なオプションはでのみ利用可能ですutil-linux 2.23PID名前空間実行中のプログラムのすべてのサブルーチンもこの名前空間に生成されます。新しいPID名前空間でコマンドを実行するには、次のようにします。

sudo unshare -fp some_command

シェルを実行するには、コマンドを省略します。これにより、プロセスとその子プロセスが通常どおり親(システム)ネームスペース内にPIDを持つようになります。ただし、新しい名前空間では、PID1とプロセスのいくつかの特別な特性がありますinit。おそらく監視の観点から最も関連性の高い機能は、その子孫の1つが孤児になると、initプロセスの実際の親ではなくそのプロセスにリセットされることです。

ほとんどの監視ケースでは、これを行うだけで十分です。前述のように、ネームスペース内のプロセスは親ネームスペース内にPIDを持つため、通常のコマンドを使用してそのアクティビティを監視できます。また、ネームスペースのプロセスが孤児になっても、最上位プログラムPIDの下のプロセスツリーブランチから外れないようにすることもできます。つまり、まだ簡単に追跡できるという意味です。

マウントネームスペースと組み合わせる

しかし、私たちができないのは、プロセスのPIDを監視することです。考えるそこにあります。これを実行し、特に新しい名前空間でコマンドを使用できるようにするには、その名前空間に対して別々のファイルシステムをマウントする必要がpsあります。を許可するprocfs唯一の場所があるため、これは別の問題につながります。 1つの解決策は、刑務所を作成し、そこに新しい刑務所をインストールすることです。しかし、少なくとも私たちが使用したいバイナリとそれが依存するすべてのライブラリを新しいルートにコピー(または少なくともハードリンク)する必要があるため、これは面倒なアプローチです。psprocfs/procchrootprocfs

解決策はまた、新しいものを使用することですマウントネームスペース。ここでは、PID名前空間で使用でき、他のものを邪魔しない実際のルートprocfsディレクトリを使用して新しいディレクトリをマウントできます。/procこのプロセスを非常に簡単にするために、unshareコマンドは次の--mount-procオプションを提供します。

sudo unshare -fp --mount-proc some_command

結合された名前空間で実行すると、psPID名前空間を持つプロセスのみが表示され、PIDを持つ最上位プロセスが表示されます1

何についてnsenter

名前が示すように、をnsenter使用して作成された名前空間を入力するために使用できますunshare。これは、名前空間内でのみ利用可能な他の関連していないスクリプトからのみ情報を取得したい場合に便利です。最も簡単な方法は、名前空間内で実行されているすべてのプログラムのPIDにアクセスすることです。明確に言えば、これは実行中の名前空間内のターゲットプログラムのPIDでなければなりませんnsenter。名前空間は入れ子になる可能性があるため、単一のプロセスに複数のPIDがある可能性があります。ターゲットPID /マウントネームスペースでシェルを実行するには、次の手順を実行します。

sudo nsenter -t $PID -m -p

上記のようにこの名前空間を設定すると、psこの名前空間内のプロセスのみが一覧表示されます。

おすすめ記事