기존 익명 네트워크 네임스페이스에 이름을 할당하는 방법

기존 익명 네트워크 네임스페이스에 이름을 할당하는 방법

네트워크 네임스페이스를 생성하지만 이를 /run/netns에 등록하지 않는 Linux 프로세스가 있습니다. 프로세스에는 자체 PID 네임스페이스도 있습니다. 네트워크 네임스페이스에는 이름이 없으며 네임스페이스의 ID만 볼 수 있습니다.

# ip netns list-id
nsid 0
nsid 1

편리한 ip-netns 명령을 사용하여 네임스페이스를 표시하고 관리할 수 있도록 네트워크 네임스페이스에 이름을 할당할 수 있습니까?

기사를 찾았어요이름이 지정되지 않은 네트워크 네임스페이스에 액세스하는 방법하지만 제 프로세스에는 자체 PID 네임스페이스가 있어서 루트 네임스페이스에서 프로세스를 볼 수 없기 때문에 작동하지 않습니다.

답변1

네임스페이스의 하위 수준 처리에는 실제 이름이 존재하지 않습니다. 이는 모두 각 명령에서 수행되는 일반적인 작업이나 기대를 통해 처리됩니다.IP 경로 2모음곡.

기존 익명 네트워크 네임스페이스에 이름을 할당한다는 것은 실제로 다음을 의미합니다.IP 경로 2도구는 이 네트워크 네임스페이스를 생성할 때 일반 설정을 지정했다고 믿습니다.

그렇다면 ip netns add foo실제로 무엇을 하고 있는 걸까요? 새 네트워크 네임스페이스의 공유를 해제하고 이를 사용하는 프로세스가 없더라도 네임스페이스를 존재하고 마운트된 상태로 유지합니다. 일반적인 *nix 철학에서 네임스페이스는인덱스 노드의사 파일 시스템에서 의사 파일을 나타내는 숫자국립과학재단. 파일을 사용하여 어떤 작업도 수행하는 것은 거의 불가능하지만(읽는 것조차 불가능함) 파일을 열어서 네임스페이스 작업(예: )을 위한 토큰으로 사용하거나 setns(2)바인드 마운트로 마운트할 수 있습니다.

아쉽게도 nsid 링크는 직접 사용할 수 없습니다. 다른 네임스페이스를 나타내는 전역 값이 아니라현지의(로컬적으로는 고유하지만 재활용이 가능하고 전역적으로는 고유하지 않음)협회다른 네임스페이스로. 여러 값은 여러 개의 다른 네임스페이스에 대한 링크를 의미하며, 동일한 값이 두 번 의미하는 것은 동일한 다른 네임스페이스에 대한 두 개의 링크입니다.

다른 네임스페이스를 찾기 위해 여기에서 시작해야 한다면 확인해 보시기 바랍니다.다른 Q&A에 제가 답변한 내용이에 대해 저는 답변을 했습니다. 또한 다음과 같은 편리한 지도 도구도 있습니다.plotnetcfg모든 네트워크 네임스페이스를 매핑할 수 있습니다. 비록 알고 있지만IP 경로 2메소드를 사용하면 프로세스 ID만 제공하지 않는 것 같지만 제공하지 않는 경우IP 경로 2. 편집된 예(필수jq), 다음과 같이 실행뿌리:

# unshare -n -- sleep 999 &
[1] 677451
#  plotnetcfg -f json | jq '.namespaces[].name'
""
[...]
"PID 268150 (systemd)"
"PID 345878 (systemd)"
[...]
"PID 677451 (sleep)"

이는 ""초기 네임스페이스를 나타내며, 이 두 개 systemd는 두 개의 LXC 인스턴스에서 왔으며 sleep실행 중인 명령도 찾을 수 있습니다.

두 가지 일반적인 상황에 도움이 됩니다.

  • LXC의 경우:

    lxc-info -H -p -n containername
    
  • 도커의 경우:

    docker inspect --format '{{.State.Pid}}' containername
    

사용 가능한 방법으로 예상 네트워크 네임스페이스에서 프로세스를 찾은 후에는 가장할 수 있습니다.IP 경로 2도구. 정확히 무엇을 하는지는 정확한 버전에 따라 달라질 수 있습니다. 제 관점 에서는 strace다음과 같습니다.

mkdir -p /run/netns

그런 다음 공유 전파로 설정되도록 자체 위에 마운트합니다.

mount --bind --make-shared /run/netns /run/netns

위 작업은 아직 완료되지 않은 경우에만 한 번만 수행됩니다. 도구가 이 작업을 수행하도록 하려면(필요한 경우에만) 가상 네임스페이스를 만들고 삭제하면 됩니다.

ip netns add dummy && ip netns delete dummy

이제 이름을 선택하고, 예를 들어 foo빈 파일을 만들고 모드를 000으로 변경합니다. (필수는 아니지만 에뮬레이트됩니다.)IP 경로 2):

touch /run/netns/foo
chmod 0 /run/netns/foo

마지막으로, 주어진 PID를 기반으로 프로세스의 네임스페이스를 마운트합니다(예 sleep: 이전 677451).

mount --bind /proc/677451/ns/net /run/netns/foo

그게 다야. 이제 명령이 종료 되더라도 sleep네임스페이스는 계속 존재합니다 . 모두IP 경로 2이제 도구에서 이름을 지정합니다.부자. 예를 들어 다음이 있는 경우와이즈연결된 인터페이스는 ip link링크 nsid 번호를 로 대체합니다 foo.

이 네트워크 네임스페이스를 삭제하려면 ip netns del foo지금 삭제하십시오(참고: 평소와 같이 이 sleep 명령과 같이 리소스가 더 이상 사용되지 않으면 실제 네트워크 네임스페이스는 실제로 사라집니다).

추가 문서IP 경로 2네트워크 네임스페이스에 따른 특정 추가 기능내 다른 답변.

관련 정보