를 사용하는 경우 올바른 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}