私は何よりもLinuxの名前空間を使用して子プロセスをゾンビ化したり、init
。util-linux
開始されたすべてのプロセスが他のプロセスの直接的な名前空間サブアイテムであるかどうかを観察、監視、および確認するためのツールをどのように使用して提供できますか?mount
nsenter
ベストアンサー1
PID名前空間の作成
ここで使用する正しいコマンドはですunshare
。これを行うために必要なオプションはでのみ利用可能ですutil-linux 2.23
。PID名前空間実行中のプログラムのすべてのサブルーチンもこの名前空間に生成されます。新しいPID名前空間でコマンドを実行するには、次のようにします。
sudo unshare -fp some_command
シェルを実行するには、コマンドを省略します。これにより、プロセスとその子プロセスが通常どおり親(システム)ネームスペース内にPIDを持つようになります。ただし、新しい名前空間では、PID1
とプロセスのいくつかの特別な特性がありますinit
。おそらく監視の観点から最も関連性の高い機能は、その子孫の1つが孤児になると、init
プロセスの実際の親ではなくそのプロセスにリセットされることです。
ほとんどの監視ケースでは、これを行うだけで十分です。前述のように、ネームスペース内のプロセスは親ネームスペース内にPIDを持つため、通常のコマンドを使用してそのアクティビティを監視できます。また、ネームスペースのプロセスが孤児になっても、最上位プログラムPIDの下のプロセスツリーブランチから外れないようにすることもできます。つまり、まだ簡単に追跡できるという意味です。
マウントネームスペースと組み合わせる
しかし、私たちができないのは、プロセスのPIDを監視することです。考えるそこにあります。これを実行し、特に新しい名前空間でコマンドを使用できるようにするには、その名前空間に対して別々のファイルシステムをマウントする必要がps
あります。を許可するprocfs
唯一の場所があるため、これは別の問題につながります。 1つの解決策は、刑務所を作成し、そこに新しい刑務所をインストールすることです。しかし、少なくとも私たちが使用したいバイナリとそれが依存するすべてのライブラリを新しいルートにコピー(または少なくともハードリンク)する必要があるため、これは面倒なアプローチです。ps
procfs
/proc
chroot
procfs
解決策はまた、新しいものを使用することですマウントネームスペース。ここでは、PID名前空間で使用でき、他のものを邪魔しない実際のルートprocfs
ディレクトリを使用して新しいディレクトリをマウントできます。/proc
このプロセスを非常に簡単にするために、unshare
コマンドは次の--mount-proc
オプションを提供します。
sudo unshare -fp --mount-proc some_command
結合された名前空間で実行すると、ps
PID名前空間を持つプロセスのみが表示され、PIDを持つ最上位プロセスが表示されます1
。
何についてnsenter
?
名前が示すように、をnsenter
使用して作成された名前空間を入力するために使用できますunshare
。これは、名前空間内でのみ利用可能な他の関連していないスクリプトからのみ情報を取得したい場合に便利です。最も簡単な方法は、名前空間内で実行されているすべてのプログラムのPIDにアクセスすることです。明確に言えば、これは実行中の名前空間内のターゲットプログラムのPIDでなければなりませんnsenter
。名前空間は入れ子になる可能性があるため、単一のプロセスに複数のPIDがある可能性があります。ターゲットPID /マウントネームスペースでシェルを実行するには、次の手順を実行します。
sudo nsenter -t $PID -m -p
上記のようにこの名前空間を設定すると、ps
この名前空間内のプロセスのみが一覧表示されます。