/proc/sysの再マウントがグローバルではないか、LXC内のネットワーク名前空間に保持されるのはなぜですか?

/proc/sysの再マウントがグローバルではないか、LXC内のネットワーク名前空間に保持されるのはなぜですか?

私のホストコンピュータでRHEL-7.2を実行しています。内部でLXCを実行しています。 LXCの内部にネットワーク名前空間を作成します。名前空間内の変数の変更がsysctl失敗します(ルートとして):

$ 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シェルにRWを再インストールしてから、sysctl -w同じシェルに再インストールすると機能します。

$ 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番目のシェルを起動してnetnsと入力しましたが、/proc/sys読み取り専用としてマークされましたが、1shシェルではまだ書き込みが可能でした。これは私を混乱させる。最初のシェルで変更された値の効果は、2番目のシェルで見ることができます。

構成スクリプトに再インストールを追加しようとしていますが、この問題により足首が捕まっています。

$ 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読み取り専用の状況のみが発生します。

私の質問は次のとおりです

第1四半期/proc/sysいつでもsysctl変数を設定できるように、LXC内の名前空間にRWを永久にインストールしたいと思います。

第2四半期。なぜこれが起こるのか理解したいです。/proc/sysプロセスごとまたはシステムコールsetnsごとにマウントが行われているようです。man ip-netnsバインドマウントについて話しましたが、/etc/netns/<name>/fileそれに関する情報はまったく表示されません/proc。私は明らかなものを見逃していますか?

修正する

最も可能性の高い答えを見つけました。第2四半期。まず実験してから、次の手順を実行してください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カスタマイズ)には、sysctl毎回再マウントすることなく、独自に書き込み可能な(ルート経由で)変数があります。または、少なくともsysctlクエリレポートに記載されているものです。

おすすめ記事