이전에 가상이었던 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
    

관련 정보