Не удалось запустить сетевые интерфейсы Raise после обновления до 16.04

Я только что обновил виртуальную серверную машину 14.04 до 16.04. После перезагрузки виртуальной машины я вижу следующую ошибку:

[FAILED] Failed to start Raise network interfaces. See 'systemctl status networking.service' for details

После входа в систему я могу запустить указанную команду и получить следующий вывод (изображение, поскольку я не могу подключиться):

enter image description here

Конфигурация в /etc/network/interfaces выглядит нормально - с помощью настроенного вручную eth0 (здесь не используется dhcp)

Что заставляет меня задуматься, так это то, что ifconfig -a списки

  • ens160
  • ему

Где я и ожидал бы

  • eth0
  • ему

Попытка подключить устройство eth0 с помощью

sudo ifup -v eth0 

выходы:

...Cannot find device "eth0"Failed to bring up eth0.

Само виртуальное проводное сетевое устройство по-прежнему настроено в самой виртуальной машине, как и раньше.

ip link показывает, а также lo и ens160 - где ens160 имеет mac-адрес, настроенный в vmware для единственного настроенного виртуального сетевого устройства.

ОБНОВЛЕНИЕ

Я могу решить проблему, если я изменю все ссылки eth0 в /etc/network/interfaces к ens160.

но - мне это кажется неправильным по нескольким причинам:

  1. Я хотел бы разобраться в этой проблеме
  2. Я хотел бы придерживаться eth0 вместо ens160

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

Причина

Проблема была вызвана предсказуемыми именами сетевых интерфейсов из systemd/udev.

Возможное решение

Согласно с этот источник вы можете либо:

  • Вы отключаете присвоение фиксированных имен, чтобы снова использовались непредсказуемые имена ядра. Для этого просто замаскируйте файл правил udev для политики по умолчанию: ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules
  • Вы создаете свою собственную схему именования вручную, например, называя свои интерфейсы "internet0", "dmz0" или "lan0". Для этого создайте свои собственные файлы .link в /etc/systemd/network/, которые выбирают явное имя или лучшую схему именования для одного, некоторых или всех ваших интерфейсов. См. systemd.link(5) для получения дополнительной информации.
  • Вы передаете net.ifnames=0 в командной строке ядра

Применяемые решения

Я действительно создал новый файл 10-rename-network.rules в /etc/udev/rules.d/ и добавил к нему следующее содержимое:

SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="ff:ff:ff:ff:ff:ff", NAME="eth0"

где

  • eth0 = желаемое имя сетевого интерфейса, используемое в /etc/network/interfaces
  • ff:ff:ff:ff:ff:ff = аппаратный mac-адрес сетевого устройства

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

Решена путем изменения файла /etc/network/interfaces.d/setup из:

auto loiface lo inet loopbackauto eth0iface eth0 inet dhcp

к:

auto loiface lo inet loopbackallow-hotplug eth0iface eth0 inet dhcp

В моем случае эта проблема была связана с попыткой поднять мой мост br0. Я забыл это сделать:

sudo apt-get install bridge-utils

раньше и поэтому мой адаптер не мог запуститься.

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

Может быть дублирован на: networking - Why is my network interface named enp0s25 instead of eth0? - Ask Ubuntu

Аналогичное описание исправления находится здесь: networking - ifup cannot bring up eth0 after upgrading to 16.04 - Ask Ubuntu