新网络命名空间上的默认内核参数

新网络命名空间上的默认内核参数

创建新的网络命名空间时,默认的内核参数是什么?有没有办法在创建时覆盖它们?

我认为它们是由父进程继承的。使用取消共享的示例:

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

相关内容