Использование предсказуемых имен сетевых интерфейсов с альтернативными ядрами


12

Почти постоянно я использую ядра из PPA ядра Ubuntu , или ядра, которые я сам скомпилировал, используя конфигурацию ядра Ubuntu.

Проблема в том, что когда я использую стандартное ядро, по умолчанию кажется, что используются предсказуемые имена сетевых интерфейсов (например, «p4p1»), но когда я использую любое альтернативное ядро, кажется, что по умолчанию используется старый метод (то есть «eth0»).

Хотя этот вопрос не имеет отношения к данному вопросу, на моем тестовом компьютере произошел сбой жесткого диска, и я выполняю новую установку Ubuntu Server 14.04.2.

Я не смог определить, в чем разница между ядрами. Я подозреваю, что параметр конфигурации ядра, но не смог определить, какой именно.

Мой вопрос: как сделать так, чтобы предсказуемые имена сетевых интерфейсов работали согласованно во всех ядрах?

Дополнительные примечания: Где-то я видел отключение предсказуемых имен сетевых интерфейсов, чтобы добавить это в grub:

GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=0 biosdevname=0"

поэтому я подумал, что обратное может помочь:

GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=1 biosdevname=1"

но это не имело значения. На самом деле, я никогда не смогу заставить нестандартное ядро ​​использовать biosdevname, независимо от настроек. И я никогда не смогу заставить стандартное ядро ​​сгенерировать /etc/udev/rules.d/70-persistent-net.rulesфайл (даже если это не то, что я хочу), независимо от настройки net.ifnames. Если у меня есть net.ifnames=1, то, по крайней мере, нестандартное ядро ​​не генерирует неправильный /etc/udev/rules.d/70-persistent-net.rulesфайл.

Выдержки из /var/log/udev:
стокового ядра:

KERNEL[9.216730] add      /devices/pci0000:00/0000:00:1c.4/0000:03:00.0/net/p4p1 (net)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1c.4/0000:03:00.0/net/p4p1
IFINDEX=2
INTERFACE=p4p1
SEQNUM=1945
SUBSYSTEM=net
...
UDEV  [9.241073] add      /devices/pci0000:00/0000:00:1c.4/0000:03:00.0/net/p4p1 (net)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1c.4/0000:03:00.0/net/p4p1
ID_BUS=pci
ID_MODEL_FROM_DATABASE=P8P67 and other motherboards
ID_MODEL_ID=0x8168
ID_NET_NAME_MAC=enxf46d04652d8e
ID_NET_NAME_PATH=enp3s0
ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
ID_PCI_CLASS_FROM_DATABASE=Network controller
ID_PCI_SUBCLASS_FROM_DATABASE=Ethernet controller
ID_VENDOR_FROM_DATABASE=Realtek Semiconductor Co., Ltd.
ID_VENDOR_ID=0x10ec
IFINDEX=2
INTERFACE=p4p1

Из ядра Ubuntu PPA 4.1RC5:

KERNEL[10.772566] add      /devices/pci0000:00/0000:00:1c.4/0000:03:00.0/net/eth0 (net)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1c.4/0000:03:00.0/net/eth0
IFINDEX=2
INTERFACE=eth0
SEQNUM=1962
SUBSYSTEM=net
...
UDEV  [11.185866] add      /devices/pci0000:00/0000:00:1c.4/0000:03:00.0/net/eth0 (net)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1c.4/0000:03:00.0/net/eth0
ID_BUS=pci
ID_MODEL_FROM_DATABASE=P8P67 and other motherboards
ID_MODEL_ID=0x8168
ID_NET_NAME_MAC=enxf46d04652d8e
ID_NET_NAME_PATH=enp3s0
ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
ID_PCI_CLASS_FROM_DATABASE=Network controller
ID_PCI_SUBCLASS_FROM_DATABASE=Ethernet controller
ID_VENDOR_FROM_DATABASE=Realtek Semiconductor Co., Ltd.
ID_VENDOR_ID=0x10ec
IFINDEX=2
INTERFACE=eth0
SEQNUM=1962
SUBSYSTEM=net
USEC_INITIALIZED=3227

Примечание. Я временно обошел эту проблему, позволив создать /etc/udev/rules.d/70-persistent-net.rulesфайл и затем отредактировав его для правильных имен устройств. В конечном счете, я хотел бы избавиться от файла.

Ответы:


33

Вам нужно различать 3 вещи:

  • Предсказуемые имена интерфейсов
  • biosdevname
  • 70-персистент.рулес удев править

Вы либо решаете использовать одно из этих решений, но не используете 2 или 3 одновременно. (На самом деле, вы можете, но один будет иметь приоритет и маскировать другой (и))

Хорошим введением в текущую ситуацию является сообщение в списке рассылки Ubuntu Dev

Предсказуемые имена интерфейсов

Прогнозируемые имена интерфейсов является udevd вещь , так как v197 генерируется в/lib/udev/rules.d/80-net-setup-link.rules

systemd по умолчанию использует новое предсказуемое имя интерфейса. Тем не менее , если в Ubuntu не установлен upstream systemd, вы должны зарегистрироваться, используяnet.ifnames=1

Не имеет значения версия ядра, которую вы используете. Но вам нужно использовать командную строку ядра, чтобы сконфигурировать ее, изменив конфигурацию grub /etc/default/grub, например:

GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=1"

и беги

sudo update-grub

В 14.04 или 14.10 без systemd должно быть достаточно удалить 70-persitent-net.rules, как описано ниже в примечании.

Biosdevname

biosdevname - это попытка dell решить аналогичную проблему, чем предсказуемое имя интерфейса в systemd. Это по умолчанию на сервере Ubuntu . Вы можете получить его, установив пакетbiosdevname

sudo apt-get install biosdevname

Заметка

Вы можете отключить его с помощью командной строки ядра в конфигурации grub:

GRUB_CMDLINE_LINUX_DEFAULT="biosdevname=0"

и беги

sudo update-grub

или просто удалите пакет.

sudo apt-get purge biosdevname
sudo update-initramfs -u

правила удев

Это по умолчанию на рабочем столе Ubuntu . Udev правило /lib/udev/rules.d/75-persistent-net-generator.rulesсоздает при первой загрузке через пользовательские правила /etc/udev/rules.d/70-persistent-net.rulesс MAC - адресом вашего интерфейса , чтобы получить постоянное имя для интерфейса.

Заметка

Если вы уже используете правила udev, вам нужно удалить его, /etc/udev/rules.d/70-persistent-net.rulesчтобы избежать его регенерации при каждой загрузке, которую вам нужно запустить

sudo ln -s /dev/null /etc/udev/rules.d/75-persistent-net-generator.rules

После этого, если вы используете systemd , вам нужно выбрать предсказуемое имя интерфейса, как описано выше.


1
Спасибо за Ваш ответ. Мой компьютер - серверная, а не настольная. Я внесу изменения в ваш ответ, чтобы устранить разницу (biosdevname было установлено по умолчанию и поэтому должно быть специально отключено через grub). Ошибка в моем мышлении состояла в том, что я ожидал разных имен интерфейсов с net.ifnames=1и biosdevname=0, как описано в приведенной вами ссылке, но я получаю старые eth0 и eth1. В любом случае, это работает для любого ядра (без /etc/udev/rules.d/70-persistent-net.rules) после того, как я отредактировал, /etc/network/interfacesчтобы отразить правильные имена интерфейсов.
Дуг Смитис

Я нахожусь на рабочем столе Ubuntu 15.10, и я не думаю, что Udev больше по умолчанию. Мои сетевые устройства названы wlp4s0и enp0s31f6, а файлы /etc/udev/rules.d/70-persistent-net.rulesи /lib/udev/rules.d/75-persistent-net-generator.rulesне существуют.
Джонатан Хартли,

В Ubuntu 16.04 (в частности, systemd 220-7 ) 75-persistent-net-generator.rulesфайл не рекомендуется в пользу net.ifnames.
200_success

4
  1. В Ubuntu Server 16.04LTS все, что я делал, было запущено:

    ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules
    
  2. Затем создайте файл, используя

    sudo vi /etc/systemd/network/10-internet.link
    

    и добавьте следующее

    [Match]
    Path=pci-0000:(your device mac address)
    
    [Link]
    Name=eth0 (or whatever you want to name it)
    

    :wq сохранить файл

  3. затем перезагрузите и настройте /etc/network/interfacesфайл .. затем перезагрузите снова

Надеюсь, это поможет кому-то

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.