udev

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
udev
ТипDevice node
РозробникиGreg Kroah-Hartman та Kay Sievers
Перший випусклистопада 2003
Стабільний випуск204 (9 травня 2013; 11 років тому (2013-05-09))
Операційна системаядро Linux
Мова програмуванняС
ЛіцензіяGPL v2
Репозиторійgithub.com/systemd/systemd
Вебсайтwww.freedesktop.org/software/systemd/libudev/

udev — менеджер пристроїв для нових версій ядра Linux, що є наступником devfs і hotplug. Його основне завдання — обслуговування файлів пристроїв (англ. device nodes) у теці /dev і обробка всіх дій, які виконуються в просторі користувача при додаванні/відключенні зовнішніх пристроїв, включаючи завантаження firmware.

Історія

[ред. | ред. код]

udev з'явився у ядрі Linux 2.5.

Ядро Linux версії 2.6.13 увело або оновило нову версію інтерфейсу uevent. Системи, що використовували нову версію udev, не завантажувалися з ядрами, старішими за 2.6.13 без заборони udev і з використанням традиційної теки /dev для доступу до пристроїв.

У квітні 2012 сирцеве дерево udev було об'єднано з systemd.[1][2] Всі функції обслуговування пристроїв у теці/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 відзначають такі переваги свого рішення[3]:

  • 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.

Примітки

[ред. | ред. код]
  1. Sievers, Kay, Commit importing udev into systemd, systemd, архів оригіналу за 8 липня 2012, процитовано 25 травня 2012
  2. Принято решение о слиянии проектов udev и systemd [Архівовано 3 травня 2012 у Wayback Machine.](рос.)
  3. Архівована копія. Архів оригіналу за 9 липня 2011. Процитовано 4 червня 2012.{{cite web}}: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання)

Посилання

[ред. | ред. код]