为什么 /proc/sys 的重新挂载不是全局的或者不保留在 LXC 内的网络命名空间中

为什么 /proc/sys 的重新挂载不是全局的或者不保留在 LXC 内的网络命名空间中

我的主机运行 RHEL-7.2。在运行 LXC 的内部。在 LXC 内部创建网络命名空间。在命名空间内更改sysctl变量失败(作为 root):

$ ip netns add testns
$ ip netns exec testns bash
$ sysctl net.ipv6.conf.all.disable_ipv6=1
sysctl: setting key "net.ipv6.conf.all.disable_ipv6": Read-only file system

如果我/proc/sys在 shell 中重新安装 RW,然后sysctl -w在同一个 shell 中重新安装,那么它就可以工作。

$ ip netns exec testns bash
$ mount -o remount,rw /proc/sys
$ sysctl net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.all.disable_ipv6 = 1

然后,我启动第 2 个 shell 并输入 netns,/proc/sys该 shell 中显示为只读,但在 1sh shell 中仍然可写。这让我很困惑。第一个 shell 更改值的影响对于第二个 shell 是可见的。

我试图将重新安装添加到配置脚本中,但这个问题妨碍了我。

$ ip netns exec testns sysctl net.ipv6.conf.all.disable_ipv6=1
sysctl: setting key "net.ipv6.conf.all.disable_ipv6": Read-only file system

$ ip netns exec testns sh -c \
>   'mount -o remount,rw /proc/sys && sysctl net.ipv6.conf.all.disable_ipv6=1'
net.ipv6.conf.all.disable_ipv6 = 1

$ ip netns exec testns sysctl net.ipv6.conf.all.disable_ipv6=0
sysctl: setting key "net.ipv6.conf.all.disable_ipv6": Read-only file system

请注意,我可以sysctl在主机上和 LXC 的默认命名空间中进行此更改,没有任何问题。如果我直接在主机上创建命名空间,则不会出现此问题。我只在 LXC 内的命名空间内遇到/proc/sys只读的情况。

我的问题是:

Q1。我希望/proc/sys在 LXC 内的命名空间内保持永久安装 RW,这样我就可以随时设置 sysctl 变量。

Q2。我想了解为什么它会这样做。看来/proc/sys挂载是按进程或按setns系统调用以某种方式进行的?man ip-netns谈论绑定安装,/etc/netns/<name>/file但我没有看到任何关于 的信息/proc。我错过了一些明显的事情吗?

更新

我找到了最有可能的答案Q2。首先进行实验,然后在man ip-netns

ip netns exec 通过创建安装命名空间并将所有每个网络命名空间配置文件绑定安装到/etc.

因此,每次ip netns exec都会创建一个新的挂载命名空间,但/proc/sys碰巧成为它从何处获得的任何挂载选项的受害者。我最好的猜测是我需要找到导致在 LXC 下以只读模式ip netns exec挂载绑定的原因,这可能会回答我的问题 Q1。/proc/sys

答案1

我找到了适合我的东西。对于那些关心安全性(例如防止容器干扰主机)的人来说,此解决方案可能不是个好主意。我并不真正理解我的解决方案的全部后果。我只在 LXC 中运行我自己的代码并进行 Jenkins 测试,所以对我来说这不是问题。

我在这里找到:https://libvirt.org/drvlxc.html#fsmounts

以下特殊挂载由 libvirt 设置

/proc/sys the host "/proc/sys" bind-mounted read-only

我仍然不明白为什么在 LXC 内的默认网络命名空间内我可以设置,sysctl但在其他网络命名空间内我不能设置。

/proc/sys在容器配置 XML 中添加了显式挂载:

<devices>
...
  <filesystem type='mount' accessmode='passthrough'>
    <source dir='/proc/sys/'/>
    <target dir='/proc/sys/'/>
  </filesystem>

sysctl这允许我在 LXC 容器内设置默认命名空间和附加命名空间。我担心LXC内部的设置也会影响主机,但事实并非如此。现在,所有网络命名空间(主机、LXC 默认、LXC 自定义)都有其独立的可写(通过 root)sysctl变量,而无需每次都重新挂载。或者至少是sysctl查询报告的内容。

相关内容