我的主机运行 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
查询报告的内容。