모든 하위 항목도 새로 입력된 PID 네임스페이스에 있도록 하기 위해 "nsenter"가 "exec" 전에 "fork"를 호출해야 하는 이유는 무엇입니까?

모든 하위 항목도 새로 입력된 PID 네임스페이스에 있도록 하기 위해 "nsenter"가 "exec" 전에 "fork"를 호출해야 하는 이유는 무엇입니까?

nsenter나는 그것이 자식 프로세스로 실행되고 시스템 호출을 bash사용하여 setns기존 네임스페이스에 합류한 다음 지정된 프로그램을 실행하는 데 사용한다고 가정합니다 exec.

그러나 nsenter'ing' setns전에 이미 호출된 경우 하위 프로세스도 입력 네임스페이스에 있는지 확인하기 위해 시스템 호출이 필요한 이유는 exec무엇입니까 ?fork

man namespaces:

setns(2)
      The setns(2) system call allows the calling process to join an
      existing namespace.  The namespace to join is specified via a
      file descriptor that refers to one of the /proc/[pid]/ns files
      described below.

man nsenter:

...
-F, --no-fork
      Do not fork before exec'ing the specified program.  By
      default, when entering a PID namespace, nsenter calls fork
      before calling exec so that any children will also be in the
      newly entered PID namespace.

답변1

설명은 "PID 네임스페이스" 섹션에 나와 있습니다.man nsenter:

nsenter하위 프로세스 에는 프로세스 매핑을 위한 프로세스 와 별도의 PID 집합이 있습니다 . nsenterPID 네임스페이스를 변경하면 기본적으로 새 프로그램과 해당 서브루틴이 동일한 PID 네임스페이스를 공유하고 서로 볼 수 있도록 포크됩니다. 사용 하면 --no-fork분기 없이 새 프로그램이 실행됩니다.

(설명서가 좀 혼란스럽네요. 위에서 인용한 부분을 정리하고,의 다음 버전에는 util-linux수정 사항이 포함됩니다..)

PID 네임스페이스를 입력해도 현재 프로세스가 해당 네임스페이스로 이동되지는 않으며 해당 네임스페이스에 새 하위 프로세스가 생성될 뿐입니다. 따라서 현재 프로세스(호출 process setns)는 새 네임스페이스의 하위 프로세스에 표시되지 않습니다. 이를 방지하려면 nsenter새 네임스페이스를 입력한 다음 포크하면 nsenter새 네임스페이스에 새 네임스페이스가 생성되고 exec결과적으로 실행된 프로그램은 새 네임스페이스에 있게 됩니다.

PID 네임스페이스에 대한 설명도 참조하세요.man setns:

만약에FD다른 네임스페이스 유형과 의미가 다소 다른 PID 네임스페이스를 참조합니다. 호출 스레드를 PID 네임스페이스와 다시 연결하면 이후에 생성된 호출자 하위 프로세스가 배치될 PID 네임스페이스만 변경되며 호출자 자신의 PID 네임스페이스는 변경되지 않습니다.

네임스페이스 항목에서 이를 볼 수 있습니다 /proc. 두 개의 PID 항목 (프로세스에 대한 네임스페이스)과 (새 하위 프로세스에 대한 네임스페이스)이 /proc/.../ns있습니다 .pidpid_for_children

( exec새로운 프로세스 자체를 생성하지는 않습니다.)

관련 정보