Udev
udev — диспетчер устройств для ядра Linux. Являясь преемником devfsd и hotplug, udev в первую очередь управляет устройствами в каталоге /dev. Помимо этого, udev обрабатывает все события пользовательского пространства, возникающие при подключении и отключении аппаратных устройств, включая загрузку прошивки для некоторых устройств. Разработка велась Грегом Кроах-Хартманом и Каем Зиверсом при участии Дана Стеклоффа и других.
Общие сведения
| udev | |
|---|---|
| Тип | диспетчер устройств |
| Разработчики | Грег Кроах-Хартман и Кай Зиверс |
| Написана на | C |
| Операционная система | Linux |
| Последняя версия |
|
| Репозиторий | github.com/systemd/syste… |
| Лицензия | GPLv2 |
| Сайт | systemd.io |
Обоснование
Операционные системы с монолитным ядром, такие как ядро Linux, предоставляют абстракцию аппаратного обеспечения другим программам. Драйверы устройств — часть ядра Linux, причём они составляют более половины исходного кода ядра[2]. Доступ к оборудованию может осуществляться через системные вызовы или посредством файлов устройств.
Для удобной работы с периферийными устройствами с поддержкой горячего подключения часть работы по их обработке была перенесена из ядра в демон в пространстве пользователя. Запуск в пространстве пользователя необходим для повышения безопасности и надёжности системы.
Архитектура
Драйверы устройств реализованы в ядре Linux и отвечают за обнаружение устройств, определение изменений их состояния и выполнение других низкоуровневых функций. После загрузки драйвера события передаются демону пользователей udevd. Именно этот диспетчер устройств — udevd — получает события и определяет дальнейшие действия. Для настройки работы используется гибкая система конфигурационных файлов, доступная для изменения администратором.
- Если подключается новое устройство хранения по USB, ядро уведомляет udevd, который затем оповещает демон udisksd — тот, в свою очередь, может смонтировать файловые системы.
- При подключении Ethernet-кабеля к сетевой карте ядро уведомляет udevd, который через демон NetworkManager может инициировать запуск dhclient или прочую настройку интерфейса согласно конфигурации.
Реализация такого механизма вынуждала разработчиков прикладных программ повторно реализовывать логику работы с оборудованием. Некоторые устройства требовали специальных привилегированных вспомогательных программ для подготовки к работе, что усложняло организацию прав доступа в привычной для Unix модели безопасности. Разработчикам приходилось применять setuid-бинарники или отдельные сервисы-демоны для управления доступом и раздельного предоставления привилегий, из-за чего возникали потенциальные угрозы безопасности[3].
Система HAL была разработана для решения этих проблем, но в большинстве дистрибутивов Linux она признана устаревшей — её функции заменены udevd.
Общее описание
В отличие от традиционных Unix-систем, где в каталоге /dev содержится статический набор файлов устройств, диспетчер устройств udev динамически создаёт ноды только для реально присутствующих в системе устройств. Хотя devfs реализовывал схожую функциональность, Грег Кроах-Хартман выделил ряд причин[4] в пользу использования udev вместо devfs:
- udev поддерживает постоянные (предсказуемые) имена устройств, независимые, например, от порядка их подключения; по умолчанию каждому накопителю назначается имя на основе уникального идентификатора файловой системы, наименования диска или физического местоположения.
- udev работает полностью в пользовательском пространстве, в отличие от devfs, работающего в пространстве ядра. Благодаря этому политика именования устройств вынесена за пределы ядра, а для формирования имени можно запускать произвольные программы и анализировать свойства устройства до создания файла; к тому же этот процесс прерываем и имеет низкий приоритет.
Весь udev состоит из трёх основных компонентов:
- Библиотека libudev для доступа к информации об устройствах; была интегрирована в систему systemd с версии 183[5].
- Демон udevd, управляющий виртуальным каталогом /dev.
- Административная утилита командной строки udevadm для диагностики и настройки.
Сигналы от ядра система получает через netlink-сокет. В ранних версиях использовался hotplug — добавлялась ссылка в /etc/hotplug.d/default для соответствующей интеграции.
Работа
udev — универсальный диспетчер устройств, работающий как демон в Linux и принимающий по netlink-сокету uevent’ы, которые ядро отправляет при появлении или отключении устройства. udev включает систему правил, которые сопоставляются с параметрами события и свойствами обнаруженного устройства. При совпадении udev может создавать или именовать устройство и запускать заданные программы для его настройки.
Правила udev могут анализировать параметры ядра, имя устройства, физическое положение или уникальные свойства, такие как серийный номер. Возможен запрос внешних программ для формирования имени либо задание постоянного имени, не зависящего от порядка обнаружения устройств.
Ранее udev мог передавать события по сокету системе HAL, которая выполняла дальнейшие действия, например, через D-Bus оповещала запущенные приложения о появлении нового оборудования. Таким образом, среды рабочего стола — например GNOME, KDE 3 — могли автоматически открывать файловый менеджер для просмотра накопителей (USB, SD-карта)[6].
К середине 2011 HAL стала устаревшей для большинства дистрибутивов Linux, а также для среды KDE, GNOME[7] и Xfce[8]. Функциональность HAL была либо интегрирована напрямую в udev, либо перенесена в отдельные сервисы вроде udisks и upower.
- udev предоставляет низкоуровневый доступ к дереву устройств Linux — позволяет программам перечислять устройства, получать их свойства и уведомления об изменениях.
- dbus — система межпроцессного взаимодействия, предоставляющая надёжную и безопасную инфраструктуру обмена сообщениями.
- udisks (ранее DeviceKit-disks) — демон, работающий поверх libudev и ядра; предоставляет высокоуровневый интерфейс к накопителям и доступен приложениям через dbus.
- upower (ранее DeviceKit-power) — демон поверх libudev и ядра, обеспечивает доступ к управлению питанием.
- NetworkManager — демон для управления сетевой конфигурацией; доступен приложениям через dbus[9].
udev получает сообщения от ядра и передаёт их в подсистемные демоны (например, Network Manager). Взаимодействие приложений с Network Manager происходит по D-Bus.
- Kernel → udev → Network Manager ⇄ D-Bus ⇄ Firefox
HAL признан устаревшим и используется только в старом программном обеспечении. Уже Ubuntu 10.04 выпускалась без HAL. Первоначально планировалось заменить HAL новым демоном DeviceKit, однако с марта 2009 часть кода DeviceKit переведена в udev (udev-extras), а некоторые функции полностью реализованы в udev.
История
udev был представлен в ядре Linux серии 2.5. Версия ядра 2.6.13 ввела обновлённый интерфейс uevent, и система с новой версией udev не будет работать с ядрами старше 2.6.13, если не отключить udev и использовать традиционный каталог /dev.
В апреле 2012 кодовая база udev была объединена с исходным кодом systemd, начиная с версии systemd 183[5][10][11]. В октябре 2012 Линус Торвальдс критиковал подход Кая Зиверса к сопровождению udev и исправлению ошибок при загрузке прошивок:
Да, выполнение этого в ядре «надёжнее». Но не стоит вводить в заблуждение. Это надёжнее, потому что у нас есть поддерживающие проект люди, и потому что мы не позволяем себе игнорировать регрессии. Если что-то ломается, и мы не знаем, как правильно это починить, мы просто откатываем ошибочное изменение. Так что да, ядро здесь предпочтительнее. Не потому, что загрузку прошивки нельзя выполнять в пользовательском пространстве; а потому, что сопровождение udev с тех пор, как Грег перестал этим заниматься, ухудшилось.
В 2012 проект Gentoo Linux выделил форк исходного кода udev от systemd для возможности использования без самого systemd. Получившийся проект получил название eudev и предоставляет возможности udev без зависимости от systemd. Заявленная цель проекта — поддержка eudev в качестве независимого решения для любых дистрибутивов и систем инициализации[12][13].
eudev — это форк systemd-udev с целью обеспечения лучшей совместимости с существующим ПО (например, OpenRC, Upstart), старыми ядрами, различными инструментальными цепочками и др.
29 мая 2014 поддержка загрузки прошивки средствами udev была удалена из systemd, поскольку решено, что загрузкой прошивки должно заниматься ядро[14]. Через два дня Леннарт Поттеринг предложил отложить это изменение до внедрения kdbus в udev; тогда планировалось перейти на kdbus как новую систему обмена сообщениями и отказаться от netlink между пользовательскими пространствами[15].
Примечания
- ↑ Release 257.9 — 2025.
- ↑ Marti, Don Are top Linux developers losing the will to code? (брит. англ.). ComputerworldUK (2 июля 2007). Дата обращения: 8 апреля 2026. Архивировано 19 июля 2016 года.
- ↑ Pennington, Havoc (2003-07-10), Making Hardware Just Work, <http://ometer.com/hardware.html>
- ↑ Greg Kroah-Hartman. udev and devfs — The final word (Plain text). Дата обращения: 24 января 2008. Архивировано 9 июля 2011 года.
- ↑ 1 2 3 systemd/systemd. GitHub. Дата обращения: 21 августа 2016. Архивировано 3 октября 2025 года.
- ↑ Dynamic Device Management in Udev (англ.). Linux Magazine (1 октября 2006). Дата обращения: 14 июля 2008.
- ↑ HALRemoval (28 июня 2011). Дата обращения: 8 апреля 2026. Архивировано 26 ноября 2011 года.
- ↑ Thunar-volman and the deprecation of HAL in Xfce (17 января 2010). Дата обращения: 8 апреля 2026. Архивировано 26 декабря 2017 года.
- ↑ Lennart Poettering. Relationship between udev, hal, Dbus and DeviceKit? (англ.) (25 апреля 2010). Дата обращения: 2 июня 2024. Архивировано 3 октября 2025 года.
- ↑ Sievers, Kay The future of the udev source tree. Список рассылки (3 апреля 2012).
- ↑ Sievers, Kay, Commit importing udev into systemd, <http://cgit.freedesktop.org/systemd/systemd/commit/?id=19c5f19d69bb5f520fa7213239490c55de06d99d>. Проверено 22 мая 2013.
- ↑ gentoo/eudev – README.md (англ.). GitHub. Дата обращения: 25 декабря 2017.
- ↑ Gentoo Linux Projects — Gentoo eudev project. Дата обращения: 25 декабря 2017. Архивировано 4 сентября 2015 года.
- ↑ [systemd-devel] [PATCH] Drop the udev firmware loader (англ.) (29 мая 2014). Дата обращения: 2 июня 2024. Архивировано 19 сентября 2025 года.
- ↑ [systemd-devel] [PATCH] Drop the udev firmware loader (англ.) (31 мая 2014). Дата обращения: 2 июня 2024. Архивировано 14 июля 2014 года.
Ссылки
- https://www.freedesktop.org/wiki/Software/systemd/ — раздел о udev на freedesktop.org