Автор Тема: etcnet + bond vs systemd  (Прочитано 5624 раз)

Оффлайн klark973

  • Давно тут
  • **
  • Сообщений: 597
  • Неспящий саппорт
Re: etcnet + bond vs systemd
« Ответ #30 : 19.02.2021 01:13:07 »
Если etcnet грузит модули до udev
udev никогда ничего не грузит. Без него в /dev всё принадлежало бы руту и имело бы права 0600 -- это в случае новомодного devtmpfs. Но можно и статический /dev иметь. Загрузка модуля (modprobe) приводит к автоматическому наполнению /dev, /sys, а отдаваемое ядром демону udev событие (о том, что появился новый девайс) позволяет сменить имя устройству, сделать симлинк, дать особые права и назначить иного владельца.

кто переименовывает интерфейсы в новые модные имена. Ядро же само именует их как ethN?
udev

А если udev грузится до etcnet, грузит модули и переименовывает, то как тогда это всё зависит от MODULE= у etcnet?
Когда запущен etcnet, он не смотрит интерфейсы, он смотрит /etc/net/ifaces/* и делает всё, что в них сказано. :-) Сказано MODULE=... -- он и грузит указанный модуль, а далее начинает ждать интерфейса $(basename $(dirname /path/to/options)) -- он появится, когда udev отработает событие. Но ждать не придётся, если такой интерфейс уже есть.

systemd тут совсем сбоку: он загрузил etcnet и где-то параллельно работает systemd-udevd. Ядро тоже параллельно: найдя устройство, пытается загрузить его модуль через хук sysctl, на который обычно натравлен /sbin/modprobe. То есть, неважно, кто именно загрузит модуль сетевой карты, главное синхронизировать процесс загрузки при настройке etcnet, который появился во времена hotplug и до systemd.
« Последнее редактирование: 19.02.2021 01:21:37 от klark973 »
To moan or to solve -- that is the question!

Оффлайн asy

  • alt linux team
  • ***
  • Сообщений: 7 412
  • Sunny 273 RUS crew
Re: etcnet + bond vs systemd
« Ответ #31 : 19.02.2021 09:21:31 »
udev никогда ничего не грузит.
Всё-таки иногда грузит. :-) Но да, похоже я заблуждался с тем, что грузит всегда и, по возможности, всё.
Когда запущен etcnet, он не смотрит интерфейсы, он смотрит /etc/net/ifaces/* и делает всё, что в них сказано. :-) Сказано MODULE=... -- он и грузит указанный модуль, а далее начинает ждать интерфейса $(basename $(dirname /path/to/options)) -- он появится, когда udev отработает событие. Но ждать не придётся, если такой интерфейс уже есть.
Это понятно, но если есть  /etc/net/ifaces/eth0, а модуль этой сетевой карты уже загружен, и имя интерфейса какое-нибудь eno1, то MODULE= уже никак не спасёт.
systemd тут совсем сбоку: он загрузил etcnet и где-то параллельно работает systemd-udevd.
Вот именно это "параллельно" и проблема: загрузка udev должна произойти до etcnet, чтобы всё было переименовано и готово. Может быть загрузку модулей можно оставить и etcnet, если уже запущенный udev успеет переименовать.

Я вчера успел посмотреть ещё раз, как всё грузится с sysvinit, и, надо заметить, удивился. Я думал, что udev грузится из initrd, и потом уже стартует ещё раз как S02udevd. Но нет, есть ещё третий запуск, уже из /etc/rc.d/init.d, но ещё при корне в ro. И вот тут всё и происходит похоже: запускается udev, потом грузятся модули и строится /dev, потом ФС перемонтируется в rw и дело доходит до S02udevd. Но это наспех и перед сном, надо ещё раз внимательно посмотреть.

Оффлайн klark973

  • Давно тут
  • **
  • Сообщений: 597
  • Неспящий саппорт
Re: etcnet + bond vs systemd
« Ответ #32 : 19.02.2021 12:24:46 »
udev никогда ничего не грузит.
Всё-таки иногда грузит. :-) Но да, похоже я заблуждался с тем, что грузит всегда и, по возможности, всё.
Нет, же. См.: https://www.kernel.org/doc/html/latest/admin-guide/sysctl/kernel.html#modprobe -- запишите пустую строку или /bin/false на раннем этапе загрузки, и увидите, кто и что грузит. udevd это костыль сбоку для принятия уведомлений от ядра о появлении устройств, которые ядро прекрасно и без udev разместит в /dev и /sys. Полезная нагрузка, которую вы предполагаете, это преобразование алиасов sysfs для загрузки нужных модулей -- кто-то из userspace должен дать команду modprobe $MODALIAS. Но это может быть и ваш скрипт, алиасы все известны и самому ядру. :-)

Вот именно это "параллельно" и проблема: загрузка udev должна произойти до etcnet, чтобы всё было переименовано и готово.
За это не стоит беспокоиться, достаточно глянуть на вывод ps x с номерами PID'ов.
To moan or to solve -- that is the question!