Sysctl

新網路命名空間的預設核心參數

  • March 21, 2017

創建新的網路命名空間時,預設的核心參數是什麼?有沒有辦法在創建時覆蓋它們?

我認為它們是由父程序繼承的。使用取消共享的範例:

> /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

我認為您的猜測是正確的,它們是從父命名空間繼承的。這似乎類似於程序如何使用fork()系統呼叫複製自己,然後必須由複製應用任何所需的更改,使用正常的系統呼叫。(包括用完全不同的程序替換目前程序,使用exec(). fork()+exec()作為例如 shell 執行其他程序的方式,儘管這種魔法通常對使用者不可見)。

底層unshare系統呼叫的任何選項都不會改變這一點。所以我會說你的問題的答案是否定的。

http://man7.org/linux/man-pages/man2/unshare.2.html


哦……這甚至不是一個類比!查看選項標誌:

CLONE_NEWNET(自 Linux 2.6.24 起)

clone(2)此標誌與CLONE_NEWNET 標誌具有相同的效果。取消共享網路命名空間,以便將呼叫程序移動到不與任何先前存在的程序共享的新網路命名空間。使用 CLONE_NEWNET 需要 CAP_SYS_ADMIN 功能。

clone()基本上是指fork()

從版本 2.3.3 開始,作為 NPTL 執行緒實現的一部分提供的 glibc fork() 包裝器不再呼叫核心的 fork() 系統呼叫,而是呼叫具有與傳統系統呼叫相同效果的標誌的 clone(2) . (對 fork() 的呼叫等同於對 clone(2) 的呼叫,將標誌指定為 SIGCHLD。)

引用自:https://unix.stackexchange.com/questions/352792