Передбачувані імена мережевого інтерфейсу руйнують міграцію vm


9

Як зробити скидання, /etc/networking/interfacesвикористовуючи "передбачувані імена мережевого інтерфейсу"?

Версії Ubuntu, старші за 15.10, використовують назви мережевого адаптера, такі як:

  • eth0
  • eth1
  • eth2

Заміна мережевої карти або переміщення vm на новий гіпервізор призведе до збільшення номера інтерфейсу для 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 / interface?

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

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

Я спробував редагувати свій файл grub, щоб повернутися до конвенції іменування 'eth0'. У той час як / etc / network / інтерфейси посилаються на старе ім'я (eth0), vm не отримає ip, і будь-яка перезавантаження призведе до того, що vm використовуватиме нову умову іменування. Також я виявив, що systemd завжди матиме перевагу, якщо я не можу гарантувати, що biosdevname=0 назавжди залишається в конфігурації grub . Не знаєте, як це назавжди застосувати

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

Якщо можливо, я б краще не використовував хмару init або використовував будь-які сценарії після запуску, оскільки я б краще зберігав золоті зображення максимально чистими.

Звичайно, це проблема, яку хмарні провайдери (Azure, AWS, RackSpace, Openstack) вже вирішили під час імпорту vms. Я не можу бути першою людиною, яка спробувала перенести vm, використовуючи передбачувані імена мережевого інтерфейсу.

Я намагався запустити ці команди перед тим, як вимкнути та перемістити vm

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 і, можливо, використовуйте скрипт одночасного завантаження, щоб вставити в нього новий мак після клону (або створити його свіжим після кожного клону)
Dani_l

Так, я на це дивився. Це загальні золоті образи, якими може скористатися будь-хто, тому я не знаю адрес mac раніше часу.
спудер

У цьому вся суть "використовувати скрипт одноразового завантаження, щоб вставити новий мак в нього після клону (або створити його свіжим після кожного клону)" - ви вставляєте новий сценарій завантаження до золотого зображення, яке після завантаження запитів і вставляє правильний mac для правила udev.
Dani_l

Відповіді:


4

Звичайно, це проблема, яку хмарні провайдери (Azure, AWS, RackSpace, Openstack) вже вирішили під час імпорту vms.

Я думаю, що OpenStack використовує хмарно-інітний формат ConfigDrive та забезпечує мережеву конфігурацію, що відповідає обладнанням VM. Джерела:

Якщо ви виключаєте сценарій першого завантаження, є одна очевидна відповідь.

Раніше було практично гарантовано, що хости, оснащені єдиною мережею картки Ethernet, мали лише один інтерфейс "eth0". За допомогою цієї нової схеми адміністратору слід спочатку перевірити, що таке ім'я локального інтерфейсу, перш ніж він зможе викликати команди на ньому, де раніше він мав хороший шанс, що "eth0" було правильним ім'ям.

Мені це не подобається, як це відключити?

У вас є три варіанти:

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

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

Повернення до старих постійних імен інтерфейсу - це не один із варіантів, задокументованих.

Інша альтернатива - це налаштування, коли мережеві інтерфейси включені за замовчуванням, незалежно від їх точної назви. Я думаю, що NetworkManager підтримує це за замовчуванням. systemd-networkd також можна сказати, щоб це зробити .

Як тільки у вас є кілька мережевих пристроїв для VM, вони, ймовірно, потребують конкретної конфігурації в будь-якому випадку ...

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


Чудові пропозиції. Я вважаю, що ln -s /dev/null /etc/systemd/network/99-default.linkце не має ніякого значення. мій vms все ще використовує нову угоду про іменування.
спудер

3

Я відмовився від спроби зробити це чисто, і придумав наступний злом. Запустивши наступний сценарій безпосередньо перед вимкненням vm та міграцією, при включенні він буде мати 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цей файл створюється. Тож подивіться, чи допомагає зворотне відстеження цього файлу, якщо воно стосується вашого розповсюдження, можливо, ви зможете його змінити, щоб вирішити вашу проблему.

Зауважте, це те, що я знаю з версії 11 Suse, що є старим способом 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.