Авторские статьи

Ubuntu и Debian переходят на новую схему именования сетевых устройств.


Ядро Linux обнаруживает сетевые интерфейсы (eth0, wlan1, ...) в непредсказуемом и нестабильном порядке. Но для того, чтобы из различных мест (ifupdown, networkd, firewall) работать с интерфейсом, нужно обладать единственным и постоянным именем.

Общая идея состоит в том, что для udev делается правило, которое находит по критерию нужный интерфейс и присваивает ему имя NAME="foo". Интерфейсы с указанной NAME будут названы, а остальные получат от ядра имена, традиционно ethN, wlanN или что-то подобное.

Решения по именованию сетевых интерфейсов.

На протяжение многих лет появилось несколько решений по именам сетевых интерфейсов:

  • mac. Давным давно было создано правило /lib/udev/rules.d/75-persistent-net-generator.rules, которое при первой загрузке создаёт соответствие MAC -> имя и записывает его в /etc/udev/rules.d/70-persistent-net.rules.
    Пример:
    # PCI device 0x10ec:0x8168 (r8169)
    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="60:a4:4c:2e:88:64", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
  • biosdevname. Данная система именования была создана в своё время Dell (IIRC), она читала порт/индекс/слот из BIOS и использовала /lib/udev/rules.d/71-biosdevname.rules
  • ifnames. Примерно 2 года назад, с версии udev 197, апстрим udev начал применять встроенный генератор постоянных имён, который проверял прошивку/BIOS, обеспечивая индексными числами и именами слотов (подобно biosdevname). Если предыдущий шаг не удавался, то использовались имена слотов (числа PCI в духе /dev/disk/by-*). Если и этот шаг не удавался, то опционально (не по дефолту) использовались MAC адреса (подобно mac). Всё происходит в /lib/udev/rules.d/80-net-setup-link.rules

Заметьте, что выше перечисленные решения могут и на практике объединены. Первое правило, которое задаст имя, побеждает. В настоящее время biosdevname побеждает mac, побеждая ifnames.

Детали о схеме mac.

Это решение применяется в данный момент на большинстве оборудования, но, то, что хорошо работало много лет назад, начинает показывает свои возрастные проблемы:

  • Схеме mac присуще впадать в состояние гонки (race conditions) в ситуации обнаружение нового устройства vs переименование существующего, что приводит имя устройства к renameX и ломает загрузку системы.
  • Такая схема требует для записи каталог /etc/udev/rules.d/ для сохранения соответствия MAC -> имя. Разработчики Canonical не хотели бы такого поведения, так как есть проекты Ubuntu Phone (Touch) и Snappy, которые используют философию read-only system-image.
  • Схема mac несовместима с операциями над облачными образами ОС. В среде виртуализации сетевой интерфейс гостя эмулируется из хоста и может меняться между загрузками. Приходится поддерживать вечно растущий blacklist, который вы найдёте в файле /lib/udev/rules.d/75-persistent-net-generator.rules
    после строк
    # ignore interfaces with locally administered or null MAC addresses
    # and VMWare, Hyper-V, KVM, Virtualbox and Xen virtual interfaces

Поддержка схемы mac была закончена 2 года назад в апстриме проекта udev и с того времени поддерживалась силами Debian и Ubuntu.

Детали о схеме biosdevname.

Схему biosdevname используют много лет в образах для серверов и никогда для десктопных. В целом неплохой подход, но, к сожалению, большинство BIOS настольных ПК не заполняют нужную информацию и такое же поведение свойственно не-x86 машинам. Получается, что данная схема охватывает небольшое количество случаев и обычно всё скатывается к схеме mac.

Детали о схеме ifnames.

Это решение расширяет идею biosdevname и применимо для множества случаев и архитектур. Данной схеме не нужно сохранять состояние (значит не нужен каталог для записи типа /etc/udev/rules.d/) и нет race conditions.

Основным, косметическим недостатком можно посчитать вычурные имена сетевых устройств, так как бородатые админы привыкли к eth. Для выданных BIOS имена могут быть вида ens0. Для сетевых карт в PCI слоте - enp1s1 (ethernet) или wlp3s0 (wlan). Это необходимая плата и, к слову сказать, имена в схеме biosdevname выглядят похоже.

Разработчики Debian и Ubuntu отключили такую схему до всестороннего её обсуждения. Можно загрузиться с параметром net.ifnames=1 и увидеть её работу в действии.

Итоговое решение.

17 июня 2015 года разработчик Мартин Питт (Martin Pitt) объявил, что Ubuntu 15.10 Wily Werewolf и Debian GNU/Linux 9 Stretch будут использовать схему "постоянные сетевые имена без сохранения состояния" (stateless persistent network interface names - ifnames) при установке системы в чистую. Ubuntu будет использовать схему ifnames на всех своих платформах (десктоп, сервер, touch, snappy), чтобы перестать делать различия и ещё чуть-чуть приблизиться к своей цели - конвергенции.

Обновление существующей системы у пользователя данный переход не затронет, так как разработчики не могут гарантированно знать текущее состояние сети у каждого пользователя и не могут безопасно удалить схему, создавшую её. Разработчики надеются, что со временем и переустановленными системами, старая схема безопасно уйдёт в прошлое. Генератор для схемы mac будет удалён.

Пока не понятен один очень важный момент. Для Ubuntu 16.10 (следующая за 16.04 LTS) и релизам Debian Stretch + 1 и Stretch + 2 рекомендуется создать проверки на наличие файла /etc/udev/rules.d/70-persistent-net.rules в udev.preinst. При наличии данного файла рекомендуется показывать критическое сообщение debconf и отказаться от обновления! На 16.10 нельзя будет обновиться с 16.04 LTS, в которой сохранится старая схема из-за долгоподдерживаемого статуса релиза!!!

Привожу кусочек email переписки разработчиков в оригинале, чтобы вы оценили масштаб трагедии:

Ubuntu 16.10 (after next LTS) / stretch+1 (or maybe +2) (Debian)
  - Check existance/non-emptiness of
    /etc/udev/rules.d/70-persistent-net.rules in udev.preinst,
    Show critical debconf note, and refuse to upgrade

Считаю, что панику разводить рано. Разработчики призрачно и безболезненно переводили наши системы с использования систем инициализации Upstart на Systemd. Никто не заметил прыжок в версии загрузчика GRUB. Тут какое-то простое изменение в именах сетевых устройств!

Дата последней правки: 2015-07-15 13:16:30

RSS vasilisc.com   


Разделы

Главная
Новости
Ворох бумаг
Видео Linux
Игры в Linux
Безопасность
Статьи об Astra Linux
Статьи о FreeBSD
Статьи об Ubuntu
Статьи о Snappy
Статьи об Ubuntu Phone
Статьи о Kubuntu
Статьи о Xubuntu
Статьи о Lubuntu
Статьи об Open Source
Карта сайта