chrooted/NEWPID 프로세스에서 네임스페이스를 표시하는 방법

chrooted/NEWPID 프로세스에서 네임스페이스를 표시하는 방법

CLONE_NEWPID다음을 사용하여 새 프로세스를 만듭니다 .chroot/mnt/

그 외에도 ip netns이 명령을 사용하여 새 netns를 만듭니다.

예를 들어

ip netns add test1

chrooted 프로세스나 해당 하위 프로세스가 이 새로운 netns를 볼 수 있게 만드는 방법에 대해 알고 계시나요?

strace에서 본 내용을 바탕으로 다음을 시도했습니다.

touch /mnt/var/run/netns/test1
ip netns exec test1 mount --bind /proc/self/ns/net /mnt/var/run/netns/test1

하지만 성공은 없어

답변1

이는 /var/run기호 링크이므로 /run미리 "해결"해야 하거나 다양한 명령을 사용하도록 지시해야 합니다 /mnt/var/run./run

언뜻 보면 (마지막 설명에서 설명한 대로 작동하지 않는 OP가 아닌) 초기 네임스페이스의 이 간단한 명령만으로도 ip netns execchroot에서 작업하는 데 충분할 것입니다.PID네임스페이스:

mount --bind /run/netns/test1 /mnt/run/netns/test1

그러나 그것은 진실이 아니다. 이는 다음과 관련이 있습니다.PID네임스페이스이지만chroot. 사실 새걸로 바꾸지 않아도 전체적인 문제는 똑같습니다PID네임스페이스가 전혀 없습니다.

ip netns exec단순한 조작이 아닌회로망네임스페이스도 작동해야 하지만네임스페이스 및 사용법설치(2)SF Q/A에서 설명한 시스템 호출 이유는 다음과 같습니다.중첩된 네트워크 네임스페이스를 생성할 수 없습니다..


문제: chroot

/proc올바른 작동을 위해서는 chroot 내부에 설치되어야 합니다. 최소한 /procchroot에서 설치한 후에는 새 항목을 입력하는 strace것을 볼 수 있습니다.ip netns exec test1 ...네임스페이스를 다시 마운트할 수 없습니다 /.

getuid()                                = 0
openat(AT_FDCWD, "/run/netns/test1", O_RDONLY|O_CLOEXEC) = 3
setns(3, CLONE_NEWNET)                  = 0
close(3)                                = 0
unshare(CLONE_NEWNS)                    = 0
mount("", "/", 0x5595a749373f, MS_REC|MS_SLAVE, NULL) = -1 EINVAL (Invalid argument)
write(2, "\"mount --make-rslave /\" failed: "..., 49) = 49
exit_group(-1)                          = ?
+++ exited with 255 +++

재설치 실패 EINVAL: 이유chroot은(는 ) /더 이상 마운트 지점이 아닙니다.

참고하시기 바랍니다,회로망네임스페이스 부분 자체에는 아무런 문제가 없습니다. 예를 들어 chroot 측에서 다음을 수행합니다.

nsenter --net=/run/netns/test1 ip link

성공하고 표시됩니다테스트 1/sys/네트워크 인터페이스를 사용하지만 필요한 경우(이전 링크에서 설명한 대로) 사용 가능한 관련 항목을 전환 하지 않습니다 .ip netns exec


해결 방법: 자체 상단에 바인드 마운트 추가

수정: 바인드 마운트chroot상호 작용을 피하기 위해 가급적이면 개인 모드에서 자체를 대상으로 하고 마운트 지점이 되도록 강제합니다(특히 다음과 같은 경우).체계공유 로 전환하기 /전에 완료 )chroot.

쉘 명령을 사용하여 아래 작업 설정을 재현했습니다.

tmpfs 등(init라고도 함)에서 설치하는 것과 같은 일부 상용구는 생략했지만 /run실제로는 chroot 내에서 설치해야 합니다./mnt/run/proc

항목 1의 첫 번째:

~# unshare --fork --pid bash
~# echo $$
1
~# mount --bind --make-private /mnt /mnt
~# chroot /mnt bash
/# mount -t proc proc /proc

그런 다음 관련없는 용어 2에서 :

 ~# ip netns add test1
 ~# mkdir -p /mnt/run/netns
 ~# touch /mnt/run/netns/test1
 ~# mount --bind /run/netns/test1 /mnt/run/netns/test1

1학기에 다시:

/# ip netns exec test1 ip link
1: lo: <LOOPBACK> mtu 65536 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

노트:

  • 앞서 언급했듯이 이 문제는 다음과 관련이 있습니다.PID네임스페이스. 이 명령을 제거하면 unshare --fork --pid bash다음과 같은 문제만 해결됩니다.chroot아니요PID네임스페이스.

  • 설치 명령은안 돼요명령에서 실행합니다 ip netns exec. 이 ip netns exec자체로 임시 설치 네임스페이스가 생성된다는 점을 명심하세요 . 마운트가 완료된 것은 무엇이든 결국 사라집니다 ip netns exec. 이에 대해서는 이전 링크에도 설명되어 있습니다. 여전히 다음과 같은 작업이 가능합니다.

    nsenter --net=/run/netns/test1 mount --bind /proc/self/ns/net /mnt/var/run/netns/test1
    

    하지만 물론 꼭 그럴 필요는 없습니다. 왜냐하면 정확히 동일한 엔터티이고 전달될 수 있기 때문입니다.국립과학재단가상 파일 시스템:

    ~# stat -f -c %T /run/netns/test1; stat -c %i /run/netns/test1
    nsfs
    4026533129
    ~# nsenter --net=/run/netns/test1 sh -c 'stat -f -L -c %T /proc/self/ns/net; stat -L -c %i /proc/self/ns/net'
    nsfs
    4026533129
    

관련 정보