Linux名前空間は、とりわけ、子プロセスの制限とジェイルを安全に処理するために活用できることを知っています。子プロセスがゾンビ化されてinit
にダンプされる可能性はありません。 。しかし、実装の詳細についてはあいまいです。 util-linux
が提供するツールをどのように使用できますか mount
など およびnsenter
起動されたすべてのプロセスが別のプロセスの直接の名前空間の子孫であることを監視、監視、および確認するには?
承認された回答:
PID名前空間を作成する
ここで使用する正しいコマンドはunshare
です。 。これを行うために必要なオプションは、util-linux 2.23
からのみ利用可能であることに注意してください。 。実行中のプログラムに新しいPID名前空間を作成して、そのすべての子もこの名前空間に作成されるようにするという考え方です。次の手順を実行するだけで、新しいPID名前空間でコマンドを実行できます。
sudo unshare -fp some_command
シェルを実行するには、コマンドを省略します。これにより、親(システム)名前空間内に通常どおりPIDを持つプロセスが作成されます。ただし、新しい名前空間内では、PIDは1
になります。 init
のいくつかの特別な特性とともに 処理する。おそらく、監視の観点から最も関連性のある特性は、その子孫のいずれかが孤立している場合、実際のinit
ではなく、このプロセスに対して親が変更されることです。 プロセス。
ほとんどの監視ケースでは、これを行うだけで十分な場合があります。前述のように、名前空間内のプロセスはすべて親名前空間内にPIDを持っているため、通常のコマンドを使用してそれらのアクティビティを監視できます。また、名前空間内のプロセスが孤立した場合でも、最上位プログラムのPIDの下にあるプロセスツリーブランチから外れることはないため、簡単に追跡できます。
マウント名前空間と組み合わせる
ただし、私たちができないことは、PIDに関してプロセスを監視することです それは持っています。これを行うには、特にps
を使用できるようにするため 新しい名前空間内のコマンドでは、別のprocfs
をマウントする必要があります 名前空間のファイルシステム。 ps
の唯一の場所であるため、これは別の問題につながります。 procfs
を受け入れます /proc
です 。 1つの解決策は、chroot
を作成することです。 新しいprocfs
を投獄してマウントします そこの。ただし、これは面倒なアプローチです。少なくとも、使用する予定のバイナリと、それらが依存するライブラリを新しいルートにコピー(または少なくともハードリンク)する必要があるためです。
解決策は、新しいマウント名前空間も使用することです。 。この中で、新しいprocfs
をマウントできます 真のルート/proc
を使用する方法で ディレクトリ。PID名前空間内で使用でき、他の何にも干渉しません。このプロセスを非常に簡単にするために、unshare
コマンドは--mount-proc
を与えます オプション:
sudo unshare -fp --mount-proc some_command
現在、ps
を実行しています 結合された名前空間内では、PID namspaceを持つプロセスのみが表示され、最上位のプロセスは1
のPIDを持つものとして表示されます。 。
nsenter
はどうですか ?
名前が示すように、nsenter
unshare
ですでに作成されている名前空間を入力するために使用できます 。これは、名前空間内からのみ利用可能な情報を、他の点では無関係なスクリプトから取得する場合に役立ちます。最も簡単な方法は、名前空間内で実行されているプログラムのPIDにアクセスすることです。明確にするために、これはnsenter
の元となる名前空間内のターゲットプログラムのPIDである必要があります。 実行中です(名前空間はネストできるため、1つのプロセスに多数のPIDが含まれる可能性があります)。ターゲットPID/マウント名前空間でシェルを実行するには、次のようにします。
sudo nsenter -t $PID -m -p
この名前空間が上記のように設定されている場合、ps
これで、その名前空間内のプロセスのみが一覧表示されます。