/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

그런 다음 두 번째 셸을 시작하고 netns를 입력했는데 /proc/sys읽기 전용으로 표시되었지만 1sh 셸에서는 여전히 쓰기가 가능했습니다. 이것은 나를 혼란스럽게 한다. 첫 번째 셸에서 변경된 값의 효과는 두 번째 셸에서 볼 수 있습니다.

구성 스크립트에 재설치를 추가하려고 하는데 이 문제로 인해 발목이 잡히고 있습니다.

$ 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쿼리 보고서에 나와 있는 내용입니다.

관련 정보