udev
udev — менеджер пристроїв для нових версій ядра Linux, що є наступником devfs і hotplug. Його основне завдання — обслуговування файлів пристроїв (англ. device nodes) у теці /dev
і обробка всіх дій, які виконуються в просторі користувача при додаванні/відключенні зовнішніх пристроїв, включаючи завантаження firmware.
Тип | Device node |
---|---|
Розробники | Greg Kroah-Hartman та Kay Sievers |
Перший випуск | листопада 2003 |
Стабільний випуск | 204 (9 травня 2013 ) |
Версії | 248 (30 березня 2021)[1] |
Репозиторій | github.com/systemd/systemd |
Операційна система | ядро Linux |
Мова програмування | С |
Ліцензія | GPL v2 |
Вебсайт | www.freedesktop.org/software/systemd/libudev/ |
Історія
udev з'явився у ядрі Linux 2.5.
Ядро Linux версії 2.6.13 увело або оновило нову версію інтерфейсу uevent. Системи, що використовували нову версію udev, не завантажувалися з ядрами, старішими за 2.6.13 без заборони udev і з використанням традиційної теки /dev
для доступу до пристроїв.
У квітні 2012 сирцеве дерево udev було об'єднано з systemd.[2][3] Всі функції обслуговування пристроїв у теці/dev
та обробка операцій підключення і відключення зовнішніх пристроїв, які раніше виконувала підсистема udev, відтепер будуть безпосередньо інтегровані в системний менеджер systemd.
Для дистрибутивів, які не бажають використовувати systemd, буде забезпечена можливість використання і складання udev, незалежно від інших частин systemd. Можливість відокремленого використання udev заявлена як офіційно підтримувана функція. Побоювання того, що в майбутньому udev неможливо буде використовувати без systemd, необґрунтовані, оскільки відокремлений udev необхідний для формування образів initrd, не містять компонентів systemd. Цілісність libudev API і сумісність udev зі складу systemd з іншими системами ініціалізації буде збережена протягом тривалого часу.
Таким чином, інтеграція udev і systemd в основному призведе до спрощення процесу розробки обох проектів, які багато в чому взаємозалежні і розвиваються по суті однією командою розробників. Злиття дозволить уникнути дублювання коду і скоротить число залежностей при збірці. Для дистрибутивів всі зміни зведуться до того, що для складання udev доведеться використовувати архів з кодом systemd, а не окремий архів udev. Після злиття systemd продовжить нумерацію версій udev, тобто після 45 випуску відразу буде представлена версія 184.
Опис
Завдяки udev, в каталозі /dev
містяться файли тільки тих пристроїв, які зараз підключені до системи. Кожен пристрій має свій відповідний файл. Якщо пристрій відключається від системи, то його файл вилучається. Вміст каталогу /dev
зберігається на віртуальній файловій системі і всі файли, що перебувають в ньому, створюються при кожному запуску системи. Модифіковані або створені вручну файли не зберігаються після перезавантаження. Файли і теки, які необхідно зберегти або які завжди повинні бути присутніми в каталозі /dev
, незалежно від стану пристрою, необхідно поміщати в каталог /lib/udev/devices
. При запуску системи вміст цього каталогу копіюється в /dev
як є (з тими ж правами доступу).
Таким чином, на відміну від традиційної для Unix схеми управління каталогом /dev
, де його вміст був статичним набором файлів, udev забезпечує динамічне управління пристроями, котрі дійсно перебувають у системі. Хоча раніше подібна функціональність забезпечувалася devfs, прихильники udev відзначають такі переваги свого рішення[4]:
- udev підтримує незмінне іменування пристроїв, не залежне, наприклад, від порядку включення пристроїв в систему. Конфігурація за умовчанням забезпечує незмінне іменування для накопичувачів: тверді диски ідентифікуються за унікальним ідентифікатором файлової системи, іменем диска і розташуванням пристрою, до якого підключений диск.
- udev працює цілком у просторі користувача. Це призводить, зокрема, до того, що udev може виконувати довільні програми для укладання назви пристрою або його ініціалізації.
Принцип роботи
udev запускається як демон і приймає через сокет netlink події uevents від ядра, які генеруються при ініціалізації або вилученні пристрою з системи. Запрограмованих користувачем (системою) правила звіряються з властивостями події та відповідного пристрою, і правило, що збіглося, (яких може бути кілька) може назвати і створити відповідний файл пристроїв, а також виконати інші програми для ініціалізації і конфігурації пристрою. Наприклад, таким чином можна реалізувати автоматичне монтування зовнішніх накопичувачів при їхньому підключенні.
Правила можуть звірятися з таким властивостям, як конкретна ядерна підсистема, ім'я пристрою в ядрі, фізичне розташування пристрою, або за серійним номером пристрою. Правила також можуть запитувати інформацію за допомогою інших програм або вказати, що ім'я пристрою завжди буде одним і тим же, незалежно від порядку виявлення пристроїв системою.
Типовий спосіб використання udev на Linux-системі — дозволити посилати події HAL або DeviceKit, щоб вони виробили подальші залежні від пристроїв дії. Наприклад, HAL/DeviceKit може повідомити інші програми про новий пристрій за допомогою широкомовного повідомлення в D-Bus. Таким чином, робочі середовища типу GNOME або KDE можуть автоматично змонтувати USB-накопичувач і відкрити файловий менеджер для перегляду його вмісту.
Архітектура
udev розділений на три частини:
- Бібліотека libudev, що дозволяє отримувати доступ до інформації про пристрої
- Демон udevd, що працює у просторі користувача та керує вмістом
/dev
- Програма udevadm для налагодження та діагностики.
udev отримує події від ядра через netlink-сокет. Ранні версії використовували hotplug, додаючи в /etc/hotplug.d/default
.
Примітки
- Release 248 — 2021.
- Sievers, Kay. Commit importing udev into systemd. systemd. Процитовано 25 травня 2012.
- Принято решение о слиянии проектов udev и systemd(рос.)
- Архівована копія. Архів оригіналу за 9 липня 2011. Процитовано 4 червня 2012.