너무 길어요.Linux에는 특히 . 플래그를 통해 런타임에 생성된 네임스페이스가 사용될 때 표시되지 않는 network namespaces
것 같습니다 (호스트 또는 생성된 네임스페이스에서). 실제로 Linux 네임스페이스를 처리하거나 처리 하지 않습니다(제 생각에는 다음과 같습니다:-n
systemd-nspwawn
ip netns list
systemd-nspawn
ip netns
https://lwn.net/Articles/531114/#series_index)?
더 긴 이야기:
다음 명령을 사용하여 Arch Linux 내에서 Arch Linux의 "경량 컨테이너"를 실행합니다.
systemd-nspawn -nbUD /mntpointArchLinuxSysFs
데이터 /mntpointArchLinuxSysFs
가 부팅되고 정상적으로 "실행/부팅"됩니다. 남성systemd-nspawn-n
옵션 플래그가 무엇을 의미하는지 알려주세요 :
-n
,--network-veth
veth
호스트와 컨테이너 사이에 가상 이더넷 링크(" ")를 만듭니다. 이더넷 링크의 호스트 측은 접두사가--machine=
" "인 컨테이너 이름( 으로 지정됨)을 따라 명명된 네트워크 인터페이스로 사용됩니다ve-
. 이더넷 링크의 컨테이너 측 이름은 "host0
"로 지정됩니다. 이--network-veth
옵션은 을 의미합니다--private-network
.
암묵적인 --private-network
설명은 다음과 같습니다.
--private-network
Disconnect networking of the container from the host. This makes all network interfaces unavailable in the container, with the
루프백 장치와
--network-interface=
지정 및 구성된 장치는 예외입니다--network-veth
. 이 옵션을 지정하면CAP_NET_ADMIN
컨테이너가 보유하는 기능 세트에 해당 기능이 추가됩니다. 후자는 를 사용하여 비활성화할 수 있습니다--drop-capability=
. 이 옵션이 지정되지 않으면(또는 아래 나열된 옵션 중 하나가 암시하는 경우) 컨테이너는 호스트 네트워크에 대한 전체 액세스 권한을 갖게 됩니다.
이는 달성한 성과인 것으로 보인다.리눅스 네임스페이스, 특히Linux 네트워크 네임스페이스이는 시작된 프로세스(즉, init
컨테이너의 프로세스 /mntpointArchLinuxSysFs/bin/init
와 모든 하위 프로세스)가 서로 다른 네트워크 네임스페이스에 있음을 나타냅니다. 즉, 네임스페이스/시스템에 대한 나머지 연결로는 (가상 이더넷 쌍) --private-network
만 있습니다 .veth
host
사용LSNSsystemd-nspawn
네임스페이스가 실제로 생성되었음을 나타냅니다.
root@host$> lsns | grep net
4026531992 net 183 1 root /sbin/init
4026532332 net 1 824 rtkit /usr/lib/rtkit-daemon
4026532406 net 7 4697 vu-mnt-0 /usr/lib/systemd/systemd
그러나 ip netns list
"협력"을 거부합니다.
root@host$> ip netns list
root@host$>
그런 다음 이해하기 위해 다음 ip netns
을 수행하여 가상 네임스페이스를 만들었습니다.
root@host$> ip netns add dummy_netns
root@host$> ip netns list
dummy_netns
root@host$>
그러나 아이러니하게도 네트워크 네임스페이스는 lsns
.
어쨌든, "네트워크 네임스페이스"라는 용어가 에서 어떻게 사용되는지 명확하지 않은 것 같습니다 systemd-nspawn
. ip netns
제가 테스트해 본 결과 두 용어가 실제로 동일하지 않을 수도 있는 것으로 나타났기 때문입니다. 어쩌면 단어가 모호한가요?
고쳐 쓰다
매뉴얼 페이지의 이 부분에는 systemd-nspawn
IMHO가 나와 있지만 실제로는 둘 다 동일한 내용을 iproute
나타냅니다 .systemd-nspawn
네트워크 네임스페이스.
--network-namespace-path=
컨테이너가 실행되어야 하는 커널 네트워크 네임스페이스를 나타내는 파일의 경로를 가져옵니다. 지정된 경로는 아래 커널에 의해 노출된 대로 (아마도 바인드 마운트된) 네트워크 네임스페이스 파일을 참조해야 합니다/proc/$PID/ns/net
. 그러면 컨테이너가 지정된 네트워크 네임스페이스에 배치됩니다. 일반적인 사용 사례 중 하나는 에서 만든 네트워크 네임스페이스를 제공하는 것/run/netns
입니다ip-netns(8)
.--network-namespace-path=/run/netns/foo
이 옵션은 --private-network 또는 --network-interface=와 같은 다른 네트워크 관련 옵션과 함께 사용할 수 없습니다.
해당 옵션과 함께 다시 사용할 수 없다는 마지막 부분은 --private-network
일종의 차이를 암시하는 것 같습니다. 여기서 무슨 일이 일어나고 있는 걸까요?
답변1
네임스페이스, 특히 네트워크 네임스페이스를 모두 사용 systemd-nspawn
합니다 . ip-netns
차이점은 에서 설명했듯이ip-netns 매뉴얼, ip-netns
처리 중명명 된네트워크 네임스페이스.
관례적으로 명명된 네트워크 네임스페이스는
/var/run/netns/NAME
열 수 있는 개체입니다. 파일을 연 후 생성된 파일 설명자는/var/run/netns/NAME
지정된 네트워크 네임스페이스를 참조합니다. 파일 설명자를 열어두면 네트워크 네임스페이스가 활성 상태로 유지됩니다.
익명 네트워크 네임스페이스
이것네임스페이스(7) 매뉴얼일반적으로 네임스페이스는 그 안에 있는 프로세스의 수명 주기와 관련된 추상화라고 설명합니다.
각 프로세스
/proc/[pid]/ns/
에는 지원되는 각 네임스페이스에 대한 항목이 포함된 하위 디렉터리가 있습니다setns(2)
. 이 디렉터리에 있는 파일 중 하나(또는 이러한 파일 중 하나에 바인드 마운트된 파일)를 열면 해당 네임스페이스가 반환됩니다. pid로 지정된 프로세스의 파일 핸들 . 네임스페이스의 모든 프로세스가 종료되더라도 이 파일 설명자가 열려 있는 한 네임스페이스는 활성 상태로 유지됩니다.
내 시스템에서는 가장 최근에 시작된 systemd
프로세스( ) 가 pgrep -f -n systemd\$
기본 템플릿 단위로 시작된 컨테이너의 init 프로세스이므로 [email protected]
활성화 되어 있습니다 ( ). 이 명령은 컨테이너의 익명 네트워크 네임스페이스가 루트 네트워크 네임스페이스와 다르며 컨테이너의 루트 사용자가 소유하고 있음을 보여줍니다.--network-veth
--private-network
--private-users
# ls -l /proc/1/ns/net /proc/$(pgrep -f -n systemd\$)/ns/net
lrwxrwxrwx 0 root /proc/1/ns/net -> net:[4026532008]
lrwxrwxrwx 0 vu-container-0 /proc/700/ns/net -> net:[4026532656]
컨테이너가 종료되면 이 익명 네트워크 네임스페이스는 사라집니다. 그러나 ip-netns
컨테이너 수명 동안 관리할 수 있는 명명된 네트워크 네임스페이스를 원할 경우 다음 위치에 바인드 마운트할 수 있습니다 /run/netns
.
# mount --bind /proc/$(pgrep -f -n systemd\$)/ns/net /run/netns/container
# ip netns list
container (id: 1)
systemd를 사용하여 명명된 네트워크 네임스페이스 만들기
또한 에 설명된 설정 과 동일한 systemd-nspawn
옵션을 지적하셨습니다.--network-namespace-path
NetworkNamespacePath=
시스템 유닛(5). 기존 네트워크 네임스페이스에는 컨테이너와 유닛만 할당할 수 있습니다. 프로세스는 하나의 네임스페이스에만 있을 수 있으므로 --network-namespace-path
익명 네트워크 네임스페이스를 만들고 그 안에 컨테이너를 격리하는 등의 옵션과 호환되지 않습니다.--private-network
것 같다Namespace=
systemd는 설정 을 얻습니다v246 이후 일부 향후 버전의 systemd(v245는 2020년 3월에 출시됨). 이를 통해 유닛은 기존 네임스페이스에 대한 할당을 사용하거나 NetworkNamespacePath=
새로운 익명 네임스페이스를 생성하는 대신 자체 명명된 네트워크 네임스페이스를 생성할 수 있습니다 PrivateNetwork=
. 이 기능을 통합한 후에는 컨테이너의 네트워크 네임스페이스 이름이 기본적으로 지정되도록 템플릿 Namespace=%i
에 추가하는 것이 좋습니다 .[email protected]