Линукс Минт 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 asveth1
):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