Ошибка RTNETLINK «файл существует» при попытке создать интерфейс veth, который ранее был фиктивным

Ошибка RTNETLINK «файл существует» при попытке создать интерфейс veth, который ранее был фиктивным

Линукс Минт 20.2

Я использовал эту команду для создания фиктивного интерфейса Ethernet под названием veth0:

sudo ip link add veth0 type dummy

Закончив, я удалил его с помощью:

sudo ip link delete veth0 type dummy

Интерфейс был определенно удален. После перезагрузки я попытался создать виртуальный интерфейс типа ethernet с помощью:

sudo ip link add veth0 type veth

Но когда я это делаю, я получаю ошибку «файл существует».

Это позволяет мне снова воссоздать интерфейс фиктивного типа с первой командой. Где он может ссылаться на имя интерфейса, чтобы предотвратить его повторное использование в качестве виртуального типа ethernet?

Мои исследования выявили много похожих сообщений, но все они, как правило, ссылаются на проблему с физическими интерфейсами, которые не могут использовать команду 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интерфейса есть индекс одноранговой ссылки: другая сторона виртуального кабеля Ethernet. Он должен был разрешить индекс одноранговой ссылки на следующий интерфейс, только что созданный с индексом 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
    
  • или указать оба имени, даже если они не соответствуют порядку по умолчанию, они будут созданы ядром в его схеме именования по умолчанию (peer as veth0и 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
    

Связанный контент