Имя сетевого интерфейса меняется после обновления до 15.10 - изменения udev

55

Я обновил виртуальную машину с сервером Ubuntu 15.04 до новой стабильной версии 15.10.

Не было никаких явных проблем, но после перезагрузки машина потеряла сетевое соединение. lspciпоказал правильную карту и lsmodдоказал, что драйвер был загружен.

Подсказки по редактированию или удалению /etc/udev/rules.d/70-persistent-net.rulesне увенчались успехом (до сих пор нет сети, нет нового файла), знаменитых /lib/udev/write_net_rulesдаже не было.

Я не очень разбираюсь в udev и systemd, поэтому мне потребовалось некоторое время, чтобы найти в / sys / class / net, что имя сетевого интерфейса изменилось. Это стало ens32, которое было переименовано из eth0. После того, как я сменил /etc/network/interfacesсеть, связь снова была включена.

Но - почему это вообще происходит? И если это произойдет, не должен ли файл интерфейсов обновляться автоматически?

Теперь, когда я удалил виртуальную сетевую карту и создал другую, eth0становится eno16777728, что не очень приятно.

Следует ли сообщать об этом поведении (по крайней мере, о процедуре обновления) как об ошибке?

Кроме того, /etc/udev/rules.d/70-persistent-net.rulesустарел сейчас? И (хотя только частично связаны), как насчет /etc/udev/rules.d/70-persistent-cd.rules?)

Редактировать - дополнительный вопрос (после принятого ответа)/etc/network/interfaces Меня беспокоит зависимость от реального имени интерфейса. Я попробовал новую установку * Ubuntu на другой виртуальной машине. К моему удивлению, /etc/network/interfacesсодержалась ссылка только на петлевое устройство. Однако с моей оригинальной виртуальной машиной это изменение помешало работе сети. Так что еще мне нужно изменить?

Редактировать Ну, из другого теста я обнаружил, что новый сервер Ubuntu имеет сетевую карту, в /etc/network/interfacesто время как XUbuntu нет. Возможно это использует network-managerили что-то еще.

JeffRSon
источник
Та же самая ошибка снова появляется в 17.04. Надеюсь, только на стадии предварительного релиза.
автомат

Ответы:

56

В Ubuntu 15.10 (Wily Werewolf), начиная с systemd / udev, автоматически назначаются предсказуемые, стабильные имена сетевых интерфейсов для всех локальных интерфейсов Ethernet, Wlan и Wwan ( источник ).

Следующие различные схемы именования сетевых интерфейсов теперь поддерживаются udev:

  1. Имена , включающие прошивки / BIOS при условии номера индексов для бортовых устройств (например: eno1)
  2. Имена , включающие прошивки / BIOS предусмотрено PCI Express индексных номеров слотов автоопределения (пример: ens1)
  3. Названия , включающие физическое / географическое расположение разъема оборудования (например: enp2s0)
  4. Имена интерфейсов , включающие MAC - адрес (пример: enx78e7d1ea46da)
  5. Классическое, непредсказуемое именование ядра в ядре ethX (пример:) eth0- не рекомендуется

По умолчанию systemd теперь будет называть интерфейсы следующей политикой:

  1. если эта информация из прошивки применима и доступна, возвращаясь к
  2. если эта информация из прошивки применима и доступна, возвращаясь к
  3. если применимо, отступая к
  4. не используется по умолчанию, но доступно, если пользователь выбирает так.
  5. во всех остальных случаях.

Как вы отключите это?

У вас есть следующие варианты:

  • Создайте собственную схему именования вручную, например, назвав свои интерфейсы internet0 или lan0. Для этого создайте свой собственный файл правил udev и установите свойство name для устройств. Обязательно закажите его перед файлом политики по умолчанию, например, назвав его/etc/udev/rules.d/70-my-net-names.rules
  • Измените файл политики по умолчанию для выбора другой схемы именования, например, для присвоения имен всем именам интерфейсов после их MAC-адреса по умолчанию: cp /lib/udev/rules.d/80-net-setup-link.rules /etc/udev/rules.d/80-net-setup-link.rulesзатем отредактируйте файл и измените строки, если необходимо.
  • Передайте net.ifnames=0в командной строке ядра.
kyodake
источник
6
Является ли это источник? Можете ли вы добавить ссылку на официальную страницу заметок о выпуске для Ubuntu (я уверен, что это где-то, не могу найти это!)
Rmano
2
Да, это источник.
kyodake
4
Что не имеет смысла, так это то, что он сделал обновление, а не новую установку. Это звучит как настоящая ошибка в Ubuntu, потому что обновление должно оставить систему в рабочем состоянии.
Будет
1
@kyodake В Ubuntu 15.10 нет папки / usr / lib / udev, есть / lib / udev
EdiD
1
@EdiD: хорошо, ошибка исправлена.
kyodake
39

Существует более простой способ, которым рассказывает ArchWiki Beginnersguide .

Сначала получите MAC-адрес вашего устройства по

$ ip link

Выход показывают как

3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000     
          link/ether 20:68:9d:xx:xx:xx brd ff:ff:ff:ff:ff:ff

MAC-адрес вашего устройства

20:68:9d:xx:xx:xx

Просто создайте файл (просто откройте с правами sudo в текстовом редакторе)

$ nano /etc/udev/rules.d/10-network.rules    

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

SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="net1"

Замените имя на требуемое имя и aa: bb: cc: dd: ee: ff на MAC-адрес вашего устройства.

Теперь просто перезагрузите компьютер, и имя устройства должно было измениться.

JonnyTischbein
источник
Самое прямое и простое решение! Большое спасибо!
3бдалла
1
Чтобы убедиться, что правило НЕ применяется к вашим интерфейсам vlan и bridge, добавьте DRIVERS=="?*",после ACTION=="add",. См. Также askubuntu.com/questions/767786/…
Донн Ли
16

Попробуйте это: отредактируйте ваш /etc/default/grub. Изменить строку с

GRUB_CMDLINE_LINUX=""

в

GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"

и, наконец, запустить:

# update-grub

от имени root и перезагрузите систему.

Денио Робсон
источник
Это также работает для сетевой загрузки. Я успешно добавил следующее в оператор добавления в моем файле syslinux.cfg: append (...) net.ifnames=0 (...)
carestad
Это решение прекрасно работает и в Ubuntu 16.04!
Нуллдата
Мне пришлось добавить параметры GRUB выше (net.ifnames = 0) и удалить правила переименования udev, чтобы заставить работать vlans, но теперь все в порядке. Спасибо за решение.
Альберт Вели
БЛАГОДАРЮ ВАС. Я устанавливаю Ubuntu Server 16.04 на автономный сервер и понятия не имел, какое имя ему дает сетевой интерфейс, и в результате сервер не был в сети. Я сделал это и удостоверился, что / etc / network / interfaces имеет "eth0" в качестве имени интерфейса и поместил диск обратно в сервер. Сейчас на сайте. Инструкции по установке Ubuntu на Acer Aspire H340 устарели в этом отношении, поэтому я напишу что-нибудь в надежде, что другие, пытающиеся сделать то же самое, не будут тратить столько времени, как я.
MetalMikester
5

Я знаю, что это может быть немного поздно, и добавление 10-network.rules, похоже, помогло, но не полностью. Мне пришлось добавить имя ядра устройства для переименования. Вот как я получил /etc/udev/rules.d/10-network.rules для работы ...

SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="MAC:ADDRESS",KERNEL=="enp4s8", NAME="eth0"

и измените KERNEL == "" на то, что ваше ядро ​​называет устройством при загрузке.

НТН

KC

Кит Клинтон
источник
3

Если у вас свежая установка

apt-get remove biosdevname

затем

update-initramfs -u

Проверьте, есть ли у вас файл udev net ruels. Если так, удалите это.

rm /etc/udev/rules.d/70-persistent-net.rules

Теперь отредактируйте / etc / network / interfaces, переименуйте интерфейсы в eth0, eth1, ... и т. Д.

перезагрузка

RJ
источник
2

Я получил это работает, создав файл:

root@odroid:~# cat /etc/udev/rules.d/70-persistent-net.rules
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth0", NAME="eth0"
Микаэль Леписто
источник