새 네트워크 네임스페이스를 생성할 때 기본 커널 매개변수는 무엇입니까? 생성 시 이를 재정의하는 방법이 있나요?
나는 그들이 부모 프로세스에 의해 상속되었다고 생각합니다. 공유 해제 사용 예:
> /sbin/sysctl -a --pattern 'net.ipv4.conf.all.forwarding'
net.ipv4.conf.all.forwarding = 1
> unshare -n
> /sbin/sysctl -a --pattern 'net.ipv4.conf.all.forwarding'
net.ipv4.conf.all.forwarding = 1
답변1
내 생각에는 당신의 추측이 정확하다고 생각합니다. 상위 네임스페이스에서 상속되었습니다. 이는 프로세스가 fork()
시스템 호출을 사용하여 자신을 복제한 다음 원하는 변경 사항을 적용해야 하는 방법과 유사해 보입니다.복제를 통해, 일반적인 시스템 호출을 사용합니다. (현재 프로그램을 완전히 다른 프로그램으로 바꾸는 것을 포함하여 exec()
. fork()
+를 exec()
쉘로 사용하여 다른 프로그램을 실행하지만 이 마법은 일반적으로 사용자에게 보이지 않습니다.)
기본 시스템 호출에 대한 옵션이 unshare
이를 변경하지 않습니다. 따라서 귀하의 질문에 대한 대답은 '아니요'라고 말하고 싶습니다.
http://man7.org/linux/man-pages/man2/unshare.2.html
아... 전혀 비유가 아니네요! 옵션 플래그 보기:
CLONE_NEWNET
(리눅스 2.6.24부터)이 플래그는 CLONE_NEWNET 플래그와 동일한 효과를 갖습니다
clone(2)
. 호출 프로세스가 기존 프로세스와 공유되지 않는 새 네트워크 네임스페이스로 이동되도록 네트워크 네임스페이스 공유를 해제합니다. CLONE_NEWNET을 사용하려면 CAP_SYS_ADMIN 기능이 필요합니다.
clone()
기본적으로 의미는 fork()
.
버전 2.3.3부터 NPTL 스레드 구현의 일부로 제공되는 glibc fork() 래퍼는 커널의 fork() 시스템 호출을 호출하지 않고 대신 동일한 효과를 제공하는 플래그를 사용하여 clone(2)을 호출합니다. 전통적인 시스템 호출. (fork() 호출은 SIGCHLD 플래그를 지정하는 clone(2) 호출과 동일합니다.)