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


9

Как выполнить сброс /etc/networking/interfacesпри использовании «предсказуемых имен сетевых интерфейсов»?

Версии Ubuntu старше 15.10 используют имена сетевых адаптеров, такие как:

  • eth0
  • eth1
  • eth2

Замена сетевой карты или перемещение виртуальной машины на новый гипервизор приведет к тому, что Linux увеличит номер интерфейса. Удаление /etc/udev/rules.d/70-peristent-net.rulesприведет к повторному использованию Linux eth0.

В Ubuntu 15.10 и новее используются « Предсказуемые имена сетевых интерфейсов ». Имя сетевого адаптера происходит от MAC-адреса.

  • ens3
  • ens32
  • ens192

При миграции vm сеть не запускается, поскольку /etc/network/interfacesвсе еще ссылается на старый несуществующий сетевой адаптер.

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto ens32
iface ens32 inet dhcp
pre-up sleep 2

Как лучше всего сбросить файл / etc / network / interfaces?

Мне нужно выполнить это действие перед выключением виртуальной машины и миграцией на новый гипервизор, поскольку я использую упаковщик для создания автоматических золотых изображений, основанных на золотых изображениях шеф-повара / бенто .

Я обнаружил, что удаление / etc / network / interfaces не работает, так как файл не восстанавливается автоматически при следующей загрузке после миграции.

Я попытался отредактировать мой файл grub, чтобы вернуться к соглашению об именах 'eth0'. Хотя / etc / network / interfaces ссылается на старое имя (eth0), виртуальный компьютер не получит ip, и любые перезагрузки заставят виртуальный сервер использовать новое соглашение об именах. Кроме того, я обнаружил, что systemd всегда будет иметь приоритет, если я не могу гарантировать biosdevname=0 постоянное сохранение в конфигурации grub . Не уверен, как навсегда применить это

GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=0 bios.devname=0"

Если возможно, я бы предпочел не использовать облачную инициализацию или использовать какие-либо сценарии после запуска, так как я бы предпочел сохранять золотые изображения как можно более чистыми.

Конечно, это проблема, которую облачные провайдеры (Azure, AWS, RackSpace, Openstack) уже решили при импорте vms. Я не могу быть первым, кто попытается перенести виртуальную машину, используя предсказуемые имена сетевых интерфейсов.

Я пытался запустить эти команды перед выключением и миграцией виртуальной машины

apt-get remove biosdevname -y;
ln -s /dev/null /etc/systemd/network/99-default.link;

Я нахожу, когда я перенести VM, что /etc/network/interfacesи ip addressдо сих пор ссылаются наens32


Вы пробовали решение с родственного сайта askubuntu? askubuntu.com/a/785442/467355 - в основном вручную создайте правило udev и, возможно, используйте скрипт однократной загрузки, чтобы вставить новый mac в него после клона (или создать его свежим после каждого клона)
Dani_l

Да, я смотрел на это. Это общие золотые изображения, которые могут быть использованы любым, поэтому я не знаю MAC-адрес заранее.
spuder

В этом весь смысл «использовать единственный загрузочный скрипт, чтобы вставить новый Mac в него после клона (или создать его свежим после каждого клона)» - вы вставляете новый загрузочный скрипт в золотой образ, который после загрузки запрашивает, и вставляете правильный макинтош к правилу udev.
Dani_l

Ответы:


4

Конечно, это проблема, которую облачные провайдеры (Azure, AWS, RackSpace, Openstack) уже решили при импорте vms.

Я думаю, что OpenStack использует cloud-init, формат ConfigDrive и предоставляет сетевую конфигурацию, соответствующую оборудованию виртуальной машины. Источники:

Если вы исключите скрипт первой загрузки, есть один очевидный ответ.

Ранее было практически гарантировано, что хосты, оснащенные одной сетевой картой, имели только один интерфейс «eth0». С этой новой схемой администратор теперь должен сначала проверить, каково имя локального интерфейса, прежде чем он сможет вызывать команды для него, где раньше у него был хороший шанс, что «eth0» было правильным именем.

Мне не нравится это, как мне отключить это?

У вас в основном есть три варианта:

  1. Вы отключаете назначение фиксированных имен, так что непредсказуемые имена ядра используются снова. Для этого просто замаскируйте файл ulink .dev для политики по умолчанию: ln -s / dev / null /etc/systemd/network/99-default.link

https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/

Переключение на старые постоянные имена интерфейсов не является одним из документированных вариантов.

Другой альтернативой является настройка, при которой сетевые интерфейсы включены по умолчанию независимо от их точного имени. Я думаю, что NetworkManager поддерживает это по умолчанию. systemd-networkd также может быть сказано сделать это .

Как только у вас будет более одного сетевого устройства для виртуальной машины, им, вероятно, все равно понадобится определенная конфигурация ...

Помимо виртуальных машин, есть одно очевидное преимущество подхода в стиле NetworkManager: ПК может иметь несколько сетевых интерфейсов, возможно, разных типов, при этом подключен только один из них. Например, это можно увидеть на некоторых платах премиум-класса или в системе, где первый сетевой интерфейс не работал должным образом, а второй интерфейс был установлен в какой-то момент.


Отличные предложения. Я считаю, что ln -s /dev/null /etc/systemd/network/99-default.linkэто не имеет значения. мой vms все еще использует новое соглашение об именах.
spuder

3

Я отказался от попыток сделать это чисто, и придумал следующий взломать. Запустив следующий сценарий непосредственно перед выключением и миграцией виртуальной машины, виртуальный адаптер будет иметь eth0 в качестве сетевого адаптера при включении.

ln -s /dev/null /etc/systemd/network/99-default.link;
echo '# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet dhcp
pre-up sleep 2' > /etc/network/interfaces

sed -i.bak 's/GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=0 bios.devname=0 quiet"/' /etc/default/grub
update-grub
apt-get remove biosdevname -y || true;

Строго говоря, apt-get remove biosdevnameне требуется, поскольку этот пакет по умолчанию не установлен в Ubuntu 16.04. Кроме того, добавление bios.devname=0к GRUB_CMDLINE_LINUX_DEFAULTне требуется, так как biosdevname не установлен. Это предотвращает разрыв сети, если biosdevname будет установлено в будущем.


Зачем устанавливать ссылку и передавать аргумент ядра? В документации говорится, что этого должно быть достаточно. Краткая проверка показывает, что это действительно так.
0xC0000022L

2

Вам нужны предсказуемые имена сетевых интерфейсов?

Мое решение состояло в том, чтобы удалить biosdevname, и это надежно привело к тому, что сетевые интерфейсы всегда назывались eth0, eth1 и так далее. Я не нашел веских причин для того, чтобы установить предсказуемые имена сетевых интерфейсов или имена biosdevname.

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

# This file was automatically generated by the /lib/udev/write_net_rules
# program,run by the persistent-net-generator.rules rules file.
#
# This file was automatically generated by the /lib/udev/write_net_rules
# program,run by the persistent-net-generator.rules rules file.
#
# You can modify it,as long as you keep each rule on a single
# line,and change only the value of the NAME= key.
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

^^ где xx: xx: xx: xx: xx: xx - это уникальный mac-адрес ваших сетевых адаптеров.

Я знаю, что вы упоминаете, что удаление этого файла не является решением, но я публикую приведенный выше пример, потому что, по крайней мере, в Suse именно он /lib/udev/write_net_rulesсоздает этот файл. Посмотрите, поможет ли обратное отслеживание этого файла, если оно применимо к вашему дистрибутиву, вы можете изменить его, чтобы решить вашу проблему.

обратите внимание, что это то, что я знаю из Suse версии 11, которая является старым способом Init, до systemd. Не уверен, что это изменилось для последних версий Linux под systemd.


biosdevname является вытеснен на Udev «встроены» Net_ID freedesktop.org/wiki/Software/systemd/...
sourcejedi

0

Наткнулся на это обновление хостов Ubuntu 14.04 до 16.04. biosdevnameпакет не установлен так , прибегли к "biosdevname=0 net.ifnames=0"в , /etc/default.grubкак указано на ОП.

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

#!/bin/bash
count=0

# build array of network devices starting with eth? from /proc
for dev in `cat /proc/net/dev | egrep 'eth.*:' | awk '{print $1};' | cut -d':' -f1 | sort`; do
   edev[$count]="$dev"
   let count="$count+1"
done

# use array to find mac address
for d in ${edev[@]}; do
   mac=`ip addr show "$d" | grep ether | awk '{print $2};'`
   if [ -n "$mac" ]; then
      echo "# mac for $d is $mac"
   fi 

   printf 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="%s", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="%s"\n' $mac $d
done
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.