Как или где Linux определяет назначение сетевого устройства? Конкретно, wlan0
или wlan1
для беспроводных USB-устройств.
Некоторое время назад я подключил беспроводной USB-устройство TP, и оно было назначено wlan0
. Я удалил его. На этой неделе я подключил беспроводное USB-устройство Edimax, и оно отображается как wlan1
. Я отключил его сегодня, чтобы попробовать второе беспроводное USB-устройство Edimax (я купил два), и теперь оно отображается как wlan2
.
Я достаточно хорошо разбираюсь в Unix/Linux, чтобы знать, что это где-то настраивается, и если я удалю неиспользуемый файл конфигурации, то смогу сделать так, чтобы последний Edimax стал wlan0
. Но как/где?
решение1
Удев— системный компонент, который определяет имена устройств в Linux — в основном имена файлов в /dev
, но также и имена сетевых интерфейсов.
Версии udev от 099 до 196 поставляются с правилами для записи имен сетевых интерфейсов и всегда используют один и тот же номер для одного и того же устройства. Эти правила отключены по умолчанию, начиная с udev 174, но тем не менее могут быть включены вашим дистрибутивом (например, Ubuntu сохраняет их). Некоторые дистрибутивы предоставляют другие наборы правил.
Скрипт, который записывает и резервирует имена интерфейсов для будущего использования, —
/lib/udev/rules.d/75-persistent-net-generator.rules
. Он записывает правила в
/etc/udev/rules.d/70-persistent-net.rules
. Поэтому удалите существующие wlan0
и wlan1
записи из вашего /etc/udev/rules.d/70-persistent-net.rules
, и измените wlan2
на wlan0
. Запустите udevadm --trigger --attr-match=vendor='Edimax'
(или любой другой --attr-match
параметр, который, как вы найдете, соответствует вашему устройству), чтобы повторно применить правила к уже подключенному устройству.
решение2
Эта проблема была решена в systemd
версии 197 с введением постоянного именования сетевых устройств.
Согласно freedesktopПредсказуемые имена сетевых интерфейсовНа странице ядро просто назначало имена на основе порядка, в котором они были проверены соответствующими драйверами:
Классическая схема именования сетевых интерфейсов, применяемая ядром, заключается в простом назначении имен, начинающихся с "eth0", "eth1", ..., всем интерфейсам по мере их проверки драйверами. Поскольку проверка драйверов, как правило, непредсказуема для современных технологий, это означает, что как только становится доступно несколько сетевых интерфейсов, назначение имен "eth0", "eth1" и т. д., как правило, больше не фиксируется, и вполне может случиться, что "eth0" при одной загрузке превратится в "eth1" при следующей.
Если ваш дистрибутив использует systemd, вы можете либо использовать предсказуемо назначенные, но, возможно, громоздкие имена, например wlp0s11
, или вы можете написать udev
правило, чтобы дать им более удобное имя, например wifi1
, на основе MAC-адреса...
Включите файл с /etc/udev/rules.d/
именем 10-network-device.rules
:
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="22:bb:cc:33:44:dd", NAME="wifi1"