を使用している場合、正しいpid名前空間を取得するには、pidではなくsubpidにコマンドを追加する必要がありますunshare --pid --fork
。nsenter
unshare
次のように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}