При старте системы после первого запуска udev в каталоге /dev/.udev/failed оказывается набор файлов вида "%2fclass%2fnet%2feth0". Названия, естественно, идут, как получилось при загрузке модулей. После этого в какой-то момент выполняется запуск службы network, которая часть или все из них может переименовать в совершенно другие имена, а уже после запускается udevd-final. Он для сгенерированных failed events предпринимает попытку их обработать, для чего использует закодированное в имени файла старое имя. В результате очень просто попытаться обработать события не для тех интерфейсов, которые к этому моменту будут представлены в системе. Решение этой проблемы то же, которое я когда-то сделал для cardmgr: сохранять ifindex. Для данного случая можно дописывать его в конец имени файла, чтобы потом ф-я scan_failed() извлекала именно ifindex, игнорируя имя интерфейса, и передавала в device_list_insert() имя, восстановленное по ifindex. Для преобразования ifname в ifindex и назад удобна libnetlink. После решения этой проблемы станет возможным использование takeover в etcnet, что в свою очередь разблокирует ликвидацию ещё нескольких накопившихся в системе костылей.
Очень не хочется тащить libnetlink в udev - в частности, из-за использования его в initramfs. В новой версии udev можно решить эту проблему другим способом - передавать окончательное значение devpath через файл в /dev/.udev/queue, создаваемый в процессе обработки события. Правда, такой вариант будет правильно работать только при условии переименования интерфейсов средствами udev - например, так, как это сделано в 19-udev-ifrename.rules в пакете ifrename (точнее, сейчас этот файл там, похоже, не совсем правильный). В etcnet нужно добавить скрипт, который только выдаёт в stdout имя, которое должен получить интерфейс, но не пытается переименовывать его самостоятельно (это также исправит другую проблему - если переименование интерфейсов выполняется в обход udev, неверные имена интерфейсов от udev попадают в hal).
Имя, которое должно получиться, можно получить вызовом ifrename с опцией -D. Но я бы хотел в конечном итоге видеть систему, в которой udev не трогает имена интерфейсов вообще. Касательно libnetlink: проитерироваться по интерфейсам можно и без неё, сишный код в этом отношении не связан ничем. Могу поискать образец, если нужно. Касательно HAL: предлагаю передавать ему ifindex вместо имени, если это возможно. Если же он не оперирует индексом вообще, то это плохо.
(In reply to comment #2) > Но я бы хотел в конечном итоге видеть систему, в которой udev не трогает имена > интерфейсов вообще. Похоже, в апстриме подход полностью противоположный - никто, кроме udev, не должен трогать имена интерфейсов. > Касательно libnetlink: проитерироваться по интерфейсам можно и без неё, сишный > код в этом отношении не связан ничем. Могу поискать образец, если нужно. Понятно, что кусок кода можно просто скопировать, просто это лишние зависимости от SUBSYSTEM=="net" в тех местах, где их раньше не было. > Касательно HAL: предлагаю передавать ему ifindex вместо имени, если это > возможно. Если же он не оперирует индексом вообще, то это плохо. Там есть ещё и дублирование устройств (Bug #14015 - что лично я считаю багом в hal, а не в udev). В принципе linux.ifindex в hal есть, но в devpath всё равно входит имя интерфейса.
И что с этим теперь ввиду /etc/udev/rules.d/70-persistent-net.rules и закрытой bug #19313?
осталось смириться