--forkを `nsenter -t'として使用するときに `unshare`の子IDを取得する方法`?

--forkを `nsenter -t'として使用するときに `unshare`の子IDを取得する方法`?

を使用している場合、正しいpid名前空間を取得するには、pidではなくsubpidにコマンドを追加する必要がありますunshare --pid --forknsenterunshare

次のようにunshareのpidを取得できます。

unshare --pid --mount --fork --mount-proc  bash & 
echo PID: $!
fg

unshareただし、正しい名前空間を入力するには、子のpid(2914003)が必要です。

ps wwfuax | grep -A1 unshare 
2914002 pts/4    S      0:00  |           \_ unshare --pid --mount --fork --mount-proc bash
2914003 pts/4    S+     0:00  |               \_ bash

これはうまくいきます:nsenter -t 2914003 これはうまくいきません:nsenter -t 2914002

オプションが少しあったらいいのにunshare --show-child-pidそれがないですね。

共有されていない子プロセスのpidを取得する信頼できる方法はありますか?

ベストアンサー1

最善の解決策は、プロセスIDに依存しないことです。

unshareコマンドを使用して名前空間を作成すると、ファイルシステムのバインドマウントで参照される永続的な名前空間が作成されます。マニュアルページの例に従ってこれを設定できますunshare(1)

まず、電波を使用してマウントポイントを設定する必要がありますprivate

mkdir /tmp/ns
mount --bind /tmp/ns /tmp/ns
mount --make-private /tmp/ns

次に、名前空間にターゲットファイルをマウントし、PIDを指定する必要があります。

touch /tmp/ns/{mnt,pid}

次に、次のコマンドを使用して名前空間を作成しますunshare

unshare --pid=/tmp/ns/pid --mount=/tmp/ns/mnt --fork --mount-proc  bash

これらの参照マウントポイントを使用すると、プロセスIDを知らなくても名前空間に入れることができます。

nsenter --mount=/tmp/ns/mnt --pid=/tmp/ns/pid

完了したらクリーンアップすることを忘れないでください。

umount /tmp/ns/{mnt,pid}

おすすめ記事