Bug 14837

Summary: udev неправильно сохраняет информацию о failed events
Product: Sisyphus Reporter: Denis Ovsienko <pilot>
Component: udevAssignee: Sergey Vlasov <vsu>
Status: CLOSED WONTFIX QA Contact: qa-sisyphus
Severity: normal    
Priority: P2 CC: arseny, ender, mike, rider, shaba, shrek
Version: unstable   
Hardware: all   
OS: Linux   
Bug Depends on:    
Bug Blocks: 11786    

Description Denis Ovsienko 2008-03-09 13:21:46 MSK
При старте системы после первого запуска 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,
что в свою очередь разблокирует ликвидацию ещё нескольких накопившихся в системе
костылей.
Comment 1 Sergey Vlasov 2008-03-10 13:09:36 MSK
Очень не хочется тащить libnetlink в udev - в частности, из-за использования его
в initramfs.

В новой версии udev можно решить эту проблему другим способом - передавать
окончательное значение devpath через файл в /dev/.udev/queue, создаваемый в
процессе обработки события. Правда, такой вариант будет правильно работать
только при условии переименования интерфейсов средствами udev - например, так,
как это сделано в 19-udev-ifrename.rules в пакете ifrename (точнее, сейчас этот
файл там, похоже, не совсем правильный). В etcnet нужно добавить скрипт, который
только выдаёт в stdout имя, которое должен получить интерфейс, но не пытается
переименовывать его самостоятельно (это также исправит другую проблему - если
переименование интерфейсов выполняется в обход udev, неверные имена интерфейсов
от udev попадают в hal).
Comment 2 Denis Ovsienko 2008-03-10 14:25:34 MSK
Имя, которое должно получиться, можно получить вызовом ifrename с опцией -D. 
Но я бы хотел в конечном итоге видеть систему, в которой udev не трогает имена
интерфейсов вообще.

Касательно libnetlink: проитерироваться по интерфейсам можно и без неё, сишный
код в этом отношении не связан ничем. Могу поискать образец, если нужно.
Касательно HAL: предлагаю передавать ему ifindex вместо имени, если это
возможно. Если же он не оперирует индексом вообще, то это плохо.
Comment 3 Sergey Vlasov 2008-03-10 15:21:12 MSK
(In reply to comment #2)
> Но я бы хотел в конечном итоге видеть систему, в которой udev не трогает имена
> интерфейсов вообще.

Похоже, в апстриме подход полностью противоположный - никто, кроме udev, не
должен трогать имена интерфейсов.

> Касательно libnetlink: проитерироваться по интерфейсам можно и без неё, сишный
> код в этом отношении не связан ничем. Могу поискать образец, если нужно.

Понятно, что кусок кода можно просто скопировать, просто это лишние зависимости
от SUBSYSTEM=="net" в тех местах, где их раньше не было.

> Касательно HAL: предлагаю передавать ему ifindex вместо имени, если это
> возможно. Если же он не оперирует индексом вообще, то это плохо.

Там есть ещё и дублирование устройств (Bug #14015 - что лично я считаю багом в
hal, а не в udev). В принципе linux.ifindex в hal есть, но в devpath всё равно
входит имя интерфейса.
Comment 4 Michael Shigorin 2009-06-30 21:03:05 MSD
И что с этим теперь ввиду /etc/udev/rules.d/70-persistent-net.rules и закрытой bug #19313?
Comment 5 Denis Ovsienko 2009-12-05 00:59:06 MSK
осталось смириться