创建新的网络命名空间时,默认的内核参数是什么?有没有办法在创建时覆盖它们?
我认为它们是由父进程继承的。使用取消共享的示例:
> /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()
作为 shell 运行其他程序的方式,尽管这种魔力通常对用户来说不可见)。
底层系统调用的任何选项都unshare
不会改变这一点。所以我想说你的问题的答案是否定的。
http://man7.org/linux/man-pages/man2/unshare.2.html
哦……这根本不是类比!查看选项标志:
CLONE_NEWNET
(自 Linux 2.6.24 起)该标志与 CLONE_NEWNET 标志具有相同的效果
clone(2)
。取消共享网络命名空间,以便将调用进程移至新的网络命名空间,该网络命名空间不与任何先前存在的进程共享。使用 CLONE_NEWNET 需要 CAP_SYS_ADMIN 功能。
clone()
基本上意味着fork()
.
从版本 2.3.3 开始,作为 NPTL 线程实现的一部分提供的 glibc fork() 包装器不调用内核的 fork() 系统调用,而是使用提供与传统系统调用相同效果的标志来调用 clone(2) 。 (对 fork() 的调用相当于对 clone(2) 的调用,将标志指定为 SIGCHLD。)