해결책

해결책

네트워크 네임스페이스에서 실행 중인 애플리케이션이 있습니다. 이것은 훌륭하게 작동합니다.

다른 네임스페이스에서 애플리케이션을 여러 번 실행하고 싶습니다. 편의상 애플리케이션의 작업 디렉터리를 네임스페이스 내의 /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 인스턴스를 동적으로 생성하고 실행할 수 있습니다.

관련 정보