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

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

spuder
источник
Вы пробовали решение с родственного сайта 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: ПК может иметь несколько сетевых интерфейсов, возможно, разных типов, при этом подключен только один из них. Например, это можно увидеть на некоторых платах премиум-класса или в системе, где первый сетевой интерфейс не работал должным образом, а второй интерфейс был установлен в какой-то момент.

sourcejedi
источник
Отличные предложения. Я считаю, что 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 будет установлено в будущем.

spuder
источник
Зачем устанавливать ссылку и передавать аргумент ядра? В документации говорится, что этого должно быть достаточно. Краткая проверка показывает, что это действительно так.
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
Ошибка сервера
источник