네트워크 네임스페이스에서 실행 중인 애플리케이션이 있습니다. 이것은 훌륭하게 작동합니다.
다른 네임스페이스에서 애플리케이션을 여러 번 실행하고 싶습니다. 편의상 애플리케이션의 작업 디렉터리를 네임스페이스 내의 /tmp/nsX와 같은 디렉터리에 바인딩하고 싶습니다.
네임스페이스에서 이 작업을 수행 하면 mount --bind /tmp/nsX /var/lib/my-app
네임스페이스를 종료할 때 마운트가 사라집니다.
네임스페이스에 들어가거나 나온다는 것은ip netns exec bash
보고 있는데 unshare
어떻게 nsenter
해야할지 모르겠습니다.
나는 원해요:
- 네임스페이스에 대한 네트워킹 구성
- 네임스페이스에 내 애플리케이션의 작업 디렉터리에 대한 바인드 마운트를 만듭니다.
- 네임스페이스에서 내 애플리케이션을 생성합니다. 도움이 된다면 "포크" 옵션도 있습니다.
- 아무것도 사라지거나 사라지지 않고 네임스페이스를 떠나고 들어갈 수 있는 능력.
다른 네임스페이스 유형을 사용해야 하는 경우에도 문제가 되지 않습니다.
답변1
왜 이런 일이 발생합니까?
ㅏ네트워크 네임스페이스설치 설정을 변경하지 않습니다. 네트워킹을 처리합니다.
그러나 이전 링크에서 언급한 것처럼 가장 눈에 띄는 네트워크 네임스페이스와 관련된 일부 설치 설정은 네트워크 네임스페이스에 의존
/sys/class/net
합니다 ./proc/sys/net
여기에는 동작에 이미 차이가 있습니다.
/proc/sys/net
이미 설치되어 있으면 새 네임스페이스에 들어갈 때 동적으로 변경되지만/sys/class/net
이미 설치된 경우에는 변경되지 않습니다. 이는 실제 명령을 사용할 때를 의미합니다.오직네트워크 네임스페이스를 변경합니다.unshare -n -- sh -c 'ls -1d /proc/sys/net/*/conf/* /sys/class/net/*'
이전 네트워크 인터페이스가 사라졌지만
/proc/sys/net/
(인터페이스의 새 인스턴스만 남음lo
) 다음에서는 여전히 표시됩니다/sys/class/net/
. 새 네트워크 네임스페이스의 인터페이스와의 상호 작용을 방지하고 여전히 이전 네트워크 네임스페이스의 인터페이스와의 상호 작용을 허용합니다. 상호 작용, 이것은 아마도 좋은 생각이 아닐 것입니다.이 네트워크 관련 문제를 해결하려면
/sys
새 네트워크 네임스페이스에서 (다시)설치해야 합니다. 이전(초기) 네트워크 네임스페이스 전용 환경에 영향을 주지 않으려면 최신 네트워크 네임스페이스에서 이 작업을 수행해야 합니다.산네임스페이스. 그 이유는 다음과 같습니다ip netns exec
. 두 가지 모두가 가능한 애플리케이션을 위한 일관된 네트워크 환경을 준비하십시오.입력하다기존 네트워크 네임스페이스(바인드 마운트를 통해 생성 및 유지 관리됨ip netns add
) 및공유 취소새로운 마운트 네임스페이스.마운트 네임스페이스는 프로세스가 이를 참조하는 동안에만 지속됩니다. 남은 프로세스가 없으면 마운트 네임스페이스와 그 안에서 수행된 모든 마운트가 사라집니다(해당 프로세스에서만 표시됨).
따라서 (마운트를 먼저 처리하려고 시도하지 않고)
unshare -m
또는 단독으로 사용하면 호출 간의 바인딩된 마운트가 유지되지 않습니다.ip netns exec
해결책
설치는 이렇게 해야 합니다사용 전 ip netns exec ...
원클릭으로 완료, 네임스페이스를 생성하고 삭제(설치)하는 별도의 단계가 아닌
/etc/netns
실제로ip netns exec
이러한 바인드 마운트는 이미 자체 호출로 관리되지만 특정 위치에서는 다음과 같습니다./etc/netns
. ip netns exec foo
호출될 때마다 디렉터리 및/또는 파일이 존재하고 일치하는 경우 마운트된 항목을 일치 /etc/netns/foo/*
하는 항목에 자동으로 바인딩합니다 /etc/*
. 이 기능은 별도의 네임스페이스에서 서비스의 여러 인스턴스를 쉽게 실행할 수 있도록 하기 위한 것이므로 이 기능이 우선시되어야 합니다. 해결책으로.
/etc/
예를 들어, 애플리케이션은 특정 위치에서 구성을 검색해야 하며, /etc/my-app/
거기에는 netns별로 다른 파일이 있어야 하며, 그 내용은 애플리케이션이 어디에 있든 작업 디렉터리를 가리켜야 합니다 /var/lib/my-app/nsX
(예: /tmp/nsX
).
이 디렉토리는 /etc/my-app/
존재해야 하며 스크립트가 실행 중인 인스턴스를 준비하는 데 사용할 일종의 템플릿 파일을 포함할 수 있지만 해당 내용은 바인드 마운트의 대상이 되기 때문에 다른 네임스페이스에 숨겨집니다.
mkdir -p /etc/netns # it is usually not provided by the distribution
for instance in foo bar baz; do
mkdir "/etc/netns/$instance"
cp -a /etc/my-app /etc/netns/$instance/
done
그런 다음 스크립트를 사용하거나 수동으로 각 인스턴스(데이터 위치, pid 파일 위치 등)를 사용자 정의하고 다른 곳에( /var/
또는 /run
일부 시작 도구/구성의 도움을 받아) 관련 디렉터리를 추가해야 합니다.TMP 파일.d).
이 작업이 올바르게 수행되면 다음과 같이 다양한 네트워크에서 애플리케이션의 여러 인스턴스를 실행할 수 있습니다.
ip netns exec foo my-app
ip netns exec bar my-app
ip netns exec baz my-app
서로 충돌하지 않습니다. 즉, 이전에 더 많은 작업을 수행해야 함을 의미합니다.
unshare -m
더하다ip netns exec
애플리케이션이 래퍼로부터 매개변수를 수신할 수 없거나 /etc
래퍼가 이 작업을 수행하도록 하고 다음과 같은 바인드 마운트만 사용하도록 요구하는 경우 /var/lib/my-app
바로 다음 바인드 마운트 ip netns exec
도 작동합니다.
ipnetns 네임스페이스를 만듭니다.
ip netns add foo
ip netns add bar
ip netns add baz
네트워크 구성 준비:
ip -n foo link ....
애플리케이션을 실행합니다.
unshare -m sh -c 'mount --bind /tmp/foo /var/lib/my-app; exec ip netns exec foo my-app'
unshare -m sh -c 'mount --bind /tmp/bar /var/lib/my-app; exec ip netns exec bar my-app'
unshare -m sh -c 'mount --bind /tmp/baz /var/lib/my-app; exec ip netns exec baz my-app'
이러한 바인드 마운트는 나중에 사라지지만 지금은 인스턴스화됩니다 my-app
.
ip netns exec
추가 중간 마운트 네임스페이스를 사용하여 이미 내장된 기능을 어느 정도 재현합니다 .
포장지
또한 마운트에 대한 추가 매개변수가 필요한 래퍼 스크립트를 사용하여 이러한 추가 마운트 네임스페이스를 방지할 수도 있습니다.
my-app.wrapper
(확인하지 않고):
#!/bin/sh
mount --bind /tmp/"$1" /var/lib/my-app
shift
exec my-app "$@"
그리고 다음을 실행하세요:
ip netns exec foo my-app.wrapper foo
완성
어떤 방법을 선택하든 이를 일부 시작 스크립트에 통합해야 합니다. 몇 가지 systemd
예를 들어보세요인스턴스화된 특성(여기 내 예가 있습니다.)는 위 방법 중 하나와 함께 사용하여 동일한 응용 프로그램의 새 netns 인스턴스를 동적으로 생성하고 실행할 수 있습니다.