удев
этой статьи Начальный раздел может быть слишком коротким, чтобы адекватно суммировать ключевые моменты . ( ноябрь 2014 г. ) |
Разработчик(и) | Грег Кроа-Хартман и Кей Сиверс |
---|---|
Первоначальный выпуск | ноябрь 2003 г |
Стабильная версия | 256.4 [1] / 24 июля 2024 г |
Репозиторий | |
Написано в | С |
Операционная система | Линукс |
Тип | Узел устройства |
Лицензия | лицензия GPLv2 |
Веб-сайт | Официальный сайт |
udev (пространство пользователя /dev ) — диспетчер устройств ядра Linux . Будучи преемником devfsd и hotplug, udev в первую очередь управляет узлами устройств в /dev каталог . В то же время udev также обрабатывает все события пользовательского пространства , возникающие при добавлении аппаратных устройств в систему или удалении из нее, включая загрузку встроенного ПО , требуемую определенными устройствами.
Обоснование
[ редактировать ]Это операционной системы , ядро которое отвечает за предоставление абстрактного интерфейса оборудования для остального программного обеспечения. Будучи монолитным ядром , ядро Linux делает именно это: драйверы устройств являются частью ядра Linux и составляют более половины его исходного кода. [2] Доступ к оборудованию можно получить через системные вызовы или через узлы его устройств .
Чтобы иметь возможность работать с периферийными устройствами, поддерживающими горячее подключение , удобным для пользователя способом, часть обработки всех этих аппаратных устройств с возможностью горячего подключения была передана от ядра демону, работающему в пользовательском пространстве. Работа в пространстве пользователя служит целям безопасности и стабильности.
Дизайн
[ редактировать ]Драйверы устройств являются частью ядра Linux, в котором их основные функции включают обнаружение устройств, обнаружение изменений состояния устройства и аналогичные аппаратные функции низкого уровня. После загрузки драйвера устройства в память из ядра обнаруженные события отправляются демону пользовательского пространства udevd. Это диспетчер устройств udevd , который улавливает все эти события и затем решает, что произойдет дальше. Для этого, udevd имеет очень полный набор файлов конфигурации, которые администратор компьютера может настроить в соответствии со своими потребностями.
- Если новое запоминающее устройство подключено через USB, udevd уведомляется ядром и сам уведомляет демон udisksd. Затем этот демон сможет смонтировать файловые системы.
- Если к сетевой плате Ethernet подключен новый кабель Ethernet, udevd уведомляется ядром и сам уведомляет демон NetworkManager. Демон NetworkManager может запустить dhclient для этого сетевого адаптера или настроить его в соответствии с некоторой ручной настройкой.
Сложность этого заставила авторов приложений заново реализовать логику аппаратной поддержки. Некоторым аппаратным устройствам также требовались привилегированные вспомогательные программы для подготовки их к использованию. Их часто приходится вызывать способами, которые сложно выразить с помощью модели разрешений Unix (например, позволяя пользователям подключаться к беспроводным сетям только в том случае, если они вошли в видеоконсоль). Авторы приложений прибегали к использованию двоичных файлов setuid или запускали сервисные демоны , чтобы обеспечить собственный контроль доступа и разделение привилегий, каждый раз потенциально создавая дыры в безопасности. [3]
HAL был создан для решения этих проблем, но в настоящее время он устарел в большинстве дистрибутивов Linux, и его функциональность заменяется udevd.
Обзор
[ редактировать ]В отличие от традиционных Unix систем , где узлы устройств находятся в /dev представляет собой статический набор файлов, диспетчер устройств Linux udev динамически предоставляет только узлы для устройств, фактически присутствующих в системе. Хотя devfs раньше предоставлял аналогичную функциональность, Грег Кроа-Хартман назвал ряд причин. [4] за предпочтение udev над devfs:
- udev поддерживает постоянное именование устройств, которое не зависит, например, от порядка подключения устройств к системе. Настройка udev по умолчанию предоставляет постоянные имена для устройств хранения. Любой жесткий диск распознается по его уникальному идентификатору файловой системы, имени диска и физическому расположению на оборудовании, к которому он подключен.
- udev полностью выполняется в пространстве пользователя devfs , в отличие от пространства ядра . Одним из последствий является то, что udev вынес политику именования из ядра и может запускать произвольные программы для составления имени устройства из свойств устройства до создания узла; там весь процесс также прерываем и выполняется с более низким приоритетом.
В целом udev делится на три части:
- Библиотека libudev , обеспечивающая доступ к информации об устройстве; он был включен в пакет программного обеспечения systemd 183. [5]
- пользовательского пространства Демон udevd , который управляет виртуальным /дев .
- Административная утилита командной строки udevadm для диагностики.
Система получает вызовы от ядра через netlink сокет . Более ранние версии использовали hotplug , добавляя ссылку на себя в /etc/hotplug.d/default для этой цели.
Операция
[ редактировать ]udev — это универсальный менеджер устройств, работающий в качестве демона в системе Linux и прослушивающий (через сокет netlink ) события, которые ядро отправляет, если инициализируется новое устройство или устройство удаляется из системы. Пакет udev поставляется с обширным набором правил, которые соответствуют экспортированным значениям события и свойствам обнаруженного устройства. Соответствующее правило может дать имя и создать узел устройства, а также запустить настроенные программы для установки и настройки устройства.
Правила udev могут совпадать по таким свойствам, как подсистема ядра, имя устройства ядра, физическое расположение устройства или такие свойства, как серийный номер устройства. Правила также могут запрашивать информацию из внешних программ для присвоения имени устройству или указывать собственное имя, которое всегда будет одинаковым, независимо от порядка обнаружения устройств системой.
В прошлом обычным способом использования udev в системах Linux было разрешение отправлять события через сокет в HAL , который выполнял дальнейшие действия, специфичные для устройства. Например, HAL уведомит другое программное обеспечение, работающее в системе, о прибытии нового оборудования, отправив широковещательное сообщение по системе D-Bus IPC всем заинтересованным процессам . Таким образом, настольные компьютеры, такие как GNOME или K Desktop Environment 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 и других интерфейсов ядра и предоставляет высокоуровневый интерфейс для управления питанием и доступен через dbus для приложений.
- NetworkManager — это демон, который находится поверх libudev и других интерфейсов ядра (и нескольких других демонов) и обеспечивает высокоуровневый интерфейс для конфигурации и настройки сети, а также доступен через dbus для приложений. [9]
udev получает сообщения от ядра и передает их демонам подсистемы, таким как Network Manager. Приложения взаимодействуют с Network Manager через D-Bus.
HAL устарел и используется только устаревшим кодом. Ubuntu 10.04 поставляется без HAL. Первоначально планировалось, что новый демон DeviceKit заменит некоторые аспекты HAL, но в марте 2009 года DeviceKit был объявлен устаревшим в пользу добавления в udev того же кода в виде пакета: udev-extras, а некоторые функции теперь перенесены в собственно udev.
История
[ редактировать ]udev был представлен в Linux 2.5 . В ядре Linux версии 2.6.13 представлена или обновлена новая версия интерфейса uevent . Система, использующая новую версию udev, не будет загружаться с ядрами старше 2.6.13, если udev не отключен и не установлен традиционный Каталог /dev используется для доступа к устройству.
udev В апреле 2012 года кодовая база была объединена с деревом исходного кода systemd , в результате чего systemd 183 стала первой версией, включающей udev. [5] [10] [11] В октябре 2012 года Линус Торвальдс раскритиковал Кея Сиверса подход к обслуживанию udev и исправлению ошибок, связанных с загрузкой прошивки , заявив: [12]
Да, делать это в ядре «более надежно». Но не играйте в игры и прекратите лгать. Он более надежен, потому что у нас есть заботливые сопровождающие, и потому что мы знаем, что регрессии — это не то, с чем мы можем играть быстро и бездумно. Если что-то сломается, и мы не знаем, как правильно исправить эту поломку, мы вернем то, что сломалось. Так что да, нам явно лучше сделать это в ядре. Не потому, что загрузку прошивки нельзя выполнить в пользовательском пространстве. Но просто потому, что обслуживание udev с тех пор, как Грег отказался от него, пошло под откос.
В 2012 году проект Gentoo Linux создал ответвление кодовой базы udev systemd, чтобы избежать зависимости от архитектуры systemd. Получившийся форк называется eudev и делает функциональность udev доступной без systemd. Заявленная цель проекта — сохранить независимость eudev от любого дистрибутива Linux или системы инициализации . [13] Проект Gentoo описывает eudev следующим образом: [14]
eudev — это форк systemd-udev, цель которого — добиться лучшей совместимости с существующим программным обеспечением, таким как OpenRC и Upstart , старыми ядрами, различными наборами инструментов и всем остальным, что требуется пользователям и различным дистрибутивам.
29 мая 2014 г. из systemd была удалена поддержка загрузки прошивки через udev, поскольку было решено, что загрузка прошивки является задачей ядра. [15] Двумя днями позже Леннарт Пёттеринг предложил отложить выпуск этого патча до тех пор, пока kdbus udev не начнет использовать ; на тот момент планировалось переключить udev на использование kdbus в качестве базовой системы обмена сообщениями и избавиться от транспорта на основе сетевых связей между пользовательскими пространствами. [16]
Авторы
[ редактировать ]udev был разработан Грегом Кроа-Хартманом и Кей Сиверс , при большой помощи , среди прочего, Дэна Стеклоффа .
Ссылки
[ редактировать ]- ^ «Выпуск 256.4» . 24 июля 2024 г. Проверено 28 июля 2024 г.
- ^ Марти, Дон (2 июля 2007 г.). «Лучшие разработчики Linux теряют желание писать код?» . ComputerworldUK . Архивировано из оригинала 19 июля 2016 года . Проверено 2 июня 2024 г.
- ^ Пеннингтон, Havoc (10 июля 2003 г.), Заставить оборудование просто работать
- ^ Грег Кроа-Хартман . «udev и devfs — последнее слово» . Архивировано из оригинала ( обычный текст ) 9 июля 2011 г. Проверено 24 января 2008 г.
- ^ Jump up to: а б с «системд/системд» . Гитхаб . Проверено 21 августа 2016 г.
- ^ «Динамическое управление устройствами в Udev» (PDF) . Журнал Линукс. 01.10.2006 . Проверено 14 июля 2008 г. [ постоянная мертвая ссылка ]
- ^ «Удаление HAL» . 28 июня 2011 г. Проверено 13 сентября 2011 г.
- ^ «Тунар-волман и отказ от HAL в Xfce» . 17 января 2010 г. Архивировано из оригинала 26 декабря 2017 г. Проверено 25 декабря 2017 г.
- ^ Леннарт Поттеринг (25 апреля 2010 г.). «Отношения между udev, hal, Dbus и DeviceKit?» .
- ^ Сиверс, Кей (3 апреля 2012 г.). «Будущее дерева исходного кода udev» . linux-hotplug (список рассылки) . Проверено 22 мая 2013 г.
- ^ Сиверс, Кей, «Обязательство импортировать udev в systemd» , systemd , получено 22 мая 2013 г.
- ^ Линус Торвальдс (3 октября 2012 г.). "Re: поломки udev" . linux-kernel (список рассылки) . Проверено 28 октября 2014 г.
- ^ «gentoo/eudev – README.md» . Гитхаб . Проверено 25 декабря 2017 г.
- ^ «Проекты Gentoo Linux – проект Gentoo eudev» . Архивировано из оригинала 4 сентября 2015 г. Проверено 25 декабря 2017 г.
- ^ «[systemd-devel] [ИСПРАВЛЕНИЕ] Удалите загрузчик прошивки udev» . 29 мая 2014 г.
- ^ «[systemd-devel] [ИСПРАВЛЕНИЕ] Удалите загрузчик прошивки udev» . 31 мая 2014 г.