이전에 더미였던 veth 인터페이스를 생성하려고 하면 RTNETLINK "파일이 존재합니다" 오류가 발생함

이전에 더미였던 veth 인터페이스를 생성하려고 하면 RTNETLINK "파일이 존재합니다" 오류가 발생함

리눅스 민트 20.2

이 명령을 사용하여 veth0이라는 더미 이더넷 인터페이스를 만들었습니다.

sudo ip link add veth0 type dummy

완료되면 다음을 사용하여 제거했습니다.

sudo ip link delete veth0 type dummy

인터페이스가 확실히 제거되었습니다. 재부팅 후 다음을 사용하여 가상 이더넷 유형 인터페이스를 만들려고했습니다.

sudo ip link add veth0 type veth

하지만 이렇게 하면 "파일이 있습니다"라는 오류가 발생합니다.

첫 번째 명령을 사용하여 더미 유형 인터페이스를 다시 생성할 수 있습니다. 가상 이더넷 유형으로 재사용되는 것을 방지하기 위해 인터페이스 이름을 어디에서 참조할 수 있습니까?

내 연구에 따르면 비슷한 게시물이 많이 있지만 일반적으로 ifup 명령을 사용할 수 없는 물리적 인터페이스의 문제를 언급하고 있습니다. 해결 방법은 인터페이스의 주소를 플러시하고 /etc/network/interfaces에 나열된 게이트웨이가 하나 이상인지 확인하는 것입니다. 여기에는 두 가지 수정 사항이 모두 적용되지 않습니다. 이전 유형을 제거한 후 다른 인터페이스 유형에 대해 가상 인터페이스 이름을 재사용할 수 없다는 내용은 발견하지 못했습니다.

다른 인터페이스 이름을 사용할 수도 있지만 이 구성 문제를 정리하고 원인이 무엇인지 이해하고 싶습니다.

답변1

이 문제는 재현 가능하지만 커널의 기본 선택을 방해하는 이름을 선택했기 때문에 발생합니다.

피어 인터페이스의 이름을 지정하지 않으면 가능한 가장 낮은 정수가 추가되어 veth피어 이름을 구성합니다.첫 번째. 이는 기본 인터페이스 자체가 생성되기 전에 먼저 발생합니다. 이는 충돌할 수 없는 이름을 지정할 때 볼 수 있습니다.

# ip link add name myveth type veth
# ip link show type veth
17: veth0@myveth: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 2a:93:f8:8e:bc:b6 brd ff:ff:ff:ff:ff:ff
18: myveth@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 8a:c3:1d:82:93:a6 brd ff:ff:ff:ff:ff:ff

피어 이름은 일반적인 방법에 따라 선택됩니다. 유형과 다음 사용 가능한 정수가 추가된 인터페이스를 만듭니다. veth+ 0: veth0. 낮은 인덱스(여기서 17 대 18)는 먼저 생성되었음을 의미합니다.

이제 커널이 자동으로 처음 생성하는 것과 동일한 이름을 지정하면 충돌이 발생하고 지정된 인터페이스가 생성되지 않아 피어 인터페이스가 삭제됩니다. 외에는 흔적이 없습니다 RTNETLINK answers: File exists. 이는 별도의 쉘에서 실행될 때 명확하게 볼 수 있습니다 ip link monitor.

쉘 1:

$ ip link monitor

쉘 2:

# ip link add name veth0 type veth
RTNETLINK answers: File exists

쉘 1을 다시:

23: veth0@NONE: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether 72:2d:b8:9f:90:6c brd ff:ff:ff:ff:ff:ff
Deleted 23: veth0@NONE: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether 72:2d:b8:9f:90:6c brd ff:ff:ff:ff:ff:ff

이는 @NONE아직 연관된 피어 링크 색인이 없다는 것을 의미합니다. 인터페이스 veth에는 가상 이더넷 와이어의 다른 쪽인 피어 링크 인덱스가 있습니다. 방금 인덱스 24로 생성된 다음 인터페이스에 대한 피어 링크 인덱스를 확인해야 하지만 이 인터페이스는 veth0이미 존재했기 때문에 해당 이름으로 생성될 수 없습니다(자체 생성으로 인한 경우에도). 이로 인해 전체 작업이 취소되고 임시 항목이 삭제되며 veth0오류 메시지가 로 다시 전송되며 File exists, 그렇지 않으면 문제의 흔적이 남지 않습니다.

결론: 충돌을 피하기 위해

  • 이름을 지정하지 말고 커널이 이름을 선택하도록 하십시오.

    ip link add type veth
    

    구하는:

    24: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default 
        link/ether 2a:93:f8:8e:bc:b6 brd ff:ff:ff:ff:ff:ff
    25: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default 
        link/ether 86:70:54:05:0f:75 brd ff:ff:ff:ff:ff:ff
    
  • 기본 명명 체계를 따르지 않는 이름을 지정합니다.

    ip link add name myveth type veth
    
  • veth0또는 기본 이름 지정 체계(peer as 및 main as veth1) 에서 커널에 의해 생성되는 기본 순서가 아니더라도 두 이름을 모두 지정합니다 .

    ip link add name veth0 type veth peer name veth1
    
  • veth인터페이스는 대부분의 경우(항상 그런 것은 아님) 네트워크 네임스페이스 환경 외부에서는 쓸모가 없다는 점을 잊지 마십시오 . 필요한 경우 피어 인터페이스를 다른 곳에 직접 추가할 수 있습니다.

    ip netns add othernamespace
    ip link add name veth0 type veth peer netns othernamespace
    

    피어도 veth0충돌 없이 생성됩니다.

    # ip link show type veth
    27: veth0@if2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
        link/ether 2a:93:f8:8e:bc:b6 brd ff:ff:ff:ff:ff:ff link-netns othernamespace
    # ip -n othernamespace link show type veth
    2: veth0@if27: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
        link/ether fa:cb:bf:23:fc:a6 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    

관련 정보