unshare
및 매뉴얼 페이지에서 읽은 모든 것에서 디렉토리를 자체( 디렉토리) nsenter
에 바인드 마운트한 다음 해당 디렉토리의 파일을 사용하여 영구 네임스페이스에 대한 참조를 보유할 수 있어야 합니다 . 이것이 제가 하고 있는 일입니다. 기본적 으로 디렉토리가 다르지만 mount --make-private
기본적으로 동일합니다 .man unshare
--pid=file
--mount=file
터미널 1:
# mkdir -p /mnt/jails/debian/bookworm/.ns
# mount --bind /mnt/jails/debian/bookworm/.ns /mnt/jails/debian/bookworm/.ns
# touch /mnt/jails/debian/bookworm/.ns/{mount,pid}
# mount --make-private /mnt/jails/debian/bookworm/.ns
# unshare --fork --mount-proc --mount=/mnt/jails/debian/bookworm/.ns/mount --pid=/mnt/jails/debian/bookworm/.ns/pid /bin/sh & echo $!; fg
[1] 151299
151299
sh-4.4# echo $$
1
sh-4.4# grep NS /proc/self/status
NStgid: 3
NSpid: 3
NSpgid: 3
NSsid: 0
지금까지는 훌륭했습니다. 위의 컨테이너가 작동하고 있습니다. 실행 시:
NO2. 터미널:
# nsenter --mount=/mnt/jails/debian/bookworm/.ns/mount --pid=/mnt/jails/debian/bookworm/.ns/pid /bin/sh
sh-4.4# ps ax
Error, do this: mount -t proc proc /proc
# ls /proc/1/exe -l
lrwxrwxrwx. 1 root root 0 Jul 21 18:49 /proc/1/exe -> /usr/bin/bash
sh-4.4# mount -t proc proc /proc
sh-4.4# ps ax|head
<shows pids from the host OS, not from the container>
sh-4.4# grep NS /proc/self/status
NStgid: 156987
NSpid: 156987
NSpgid: 156987
NSsid: 156921
나는 또한 터미널 2(터미널 1의 pid에 주목)에서 이것을 시도했는데 정확히 같은 결과가 나왔습니다.
# nsenter -t 151299 -a /bin/sh
sh-4.4# ps ax
Error, do this: mount -t proc proc /proc
# ls /proc/1/exe -l
lrwxrwxrwx. 1 root root 0 Jul 21 18:49 /proc/1/exe -> /usr/bin/bash
sh-4.4# mount -t proc proc /proc
sh-4.4# ps ax|head
<shows pids from the host OS, not from the container>
sh-4.4# grep NS /proc/self/status
NStgid: 155356
NSpid: 155356
NSpgid: 155356
NSsid: 143538
무슨 이유에서 nsenter
인지 호스트 OS의 pid 공간으로 들어가는데 /proc 디렉토리에 대한 올바른 네임스페이스는 보이는 것 같은데, sh
Terminal2에서는 pid 네임스페이스가 작동하지 않아서 작동하지 않는 것 같으니 (제 생각엔) 그런 것 같아요. 왜 ps ax
오류가 발생합니까? 나는 또한 --mount-proc를 사용하거나 사용하지 않고 시도했습니다.
질문:
터미널 1에서 PID 네임스페이스를 어떻게 입력하나요?
내가 여기서 뭘 잘못하고 있는 걸까?
(호스트 Linux 커널은 5.18이며 Oracle Linux 8을 실행합니다.)
답변1
util-linux v2.36 이전에는 버그가 있었는데 이 커밋에서 수정되었습니다.
0d5260b66 unshare: PID 및 TIME 네임스페이스 지속성 수정
패치된 util-linux 버전을 사용하세요!
다음은 이 오류가 있는지 확인하는 테스트 스크립트입니다.
umount -l /mnt/jails/*/*/.ns/* /mnt/jails/*/*/.ns/
sleep 1
mkdir -p /mnt/jails/debian/bookworm/.ns
mount --bind /mnt/jails/debian/bookworm/.ns /mnt/jails/debian/bookworm/.ns
touch /mnt/jails/debian/bookworm/.ns/{mount,pid}
mount --make-private /mnt/jails/debian/bookworm/.ns
unshare --fork --mount-proc --mount=/mnt/jails/debian/bookworm/.ns/mount --pid=/mnt/jails/debian/bookworm/.ns/pid sleep 99 &
upid=$!
sleep 1
if nsenter --mount=/mnt/jails/debian/bookworm/.ns/mount --pid=/mnt/jails/debian/bookworm/.ns/pid [ -d /proc/self ]; then
kill $upid
echo worked
exit 0
else
kill $upid
echo didnt
exit 1
fi
답변2
우선 저는 이 업계에 대해 회의적입니다.
... /bin/sh & echo $!; fg
이것은 항상 쉘이 종료되고 터미널이 이상한 상태로 끝나는 것 같습니다. 그러니 도망치지 마세요.
unshare --fork --mount-proc --mount=/mnt/jails/debian/bookworm/.ns/mount --pid=/mnt/jails/debian/bookworm/.ns/pid
이제 자체 mount 및 pid 네임스페이스에서 실행되는 쉘이 생겼습니다.
나는 또한 터미널 2(터미널 1의 pid에 주목)에서 이것을 시도했는데 정확히 같은 결과가 나왔습니다.
우리는 이것에 대해 논의했습니다다른 곳에서;프로세스 ID 처리를 중단하면, 특히 영구 네임스페이스를 생성하려는 노력을 기울였기 때문에 여러분의 삶은 훨씬 더 단순해질 것입니다. -t <pid>
대신 생성한 영구 네임스페이스를 사용하세요.
# nsenter --mount=/mnt/jails/debian/bookworm/.ns/mount --pid=/mnt/jails/debian/bookworm/.ns/pid
# ps -fe
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 16:45 pts/4 00:00:00 /bin/sh
root 3 0 1 16:48 pts/15 00:00:00 -bash
root 41 3 0 16:48 pts/15 00:00:00 ps -fe
보시다시피 unshare
이전 명령으로 생성된 네임스페이스를 성공적으로 입력했습니다.