터미널 1:

터미널 1:

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 디렉토리에 대한 올바른 네임스페이스는 보이는 것 같은데, shTerminal2에서는 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이전 명령으로 생성된 네임스페이스를 성공적으로 입력했습니다.

관련 정보