Ще раз про udev - Наш Блогосайт Linux та «лірика»
Автор: Олексій Федорчук
Кілька років тому, майже відразу після впровадження в Linux механізму udev, я написав коротку замітку з перших розбірок з цим. Нині, у зв'язку з обставинами, що знову утворилися, настав час знову звернутися до цієї теми, розширивши і навіть, як сказав би один з наших президентів, куту бив її.
Перш ніж розпочати справжню нотатку, зазначу, що до неї включено весь матеріал нотатки колишньої — той, що зберіг актуальність. Тож звертатися до останньої потреби немає — хіба що в історичному аспекті.
Udev - це механізм підтримки настроюваного динамічного іменування пристроїв в Linux, що прийшла на зміну віртуальній файловій системі пристроїв devfs; у FreeBSD ця функція доручається останню. Перший та основний розробник udev - Грег Кроа-Хартман (Greg Kroah-Hartman).
На відміну від devfs, udev — не файлова система, що підтримується ядром, а звичайна програма користувача. Для свого функціонування udev потребує віртуальної файлової системи - sysfs. Грунтуючись на інформації з неї, udev і присвоює імена різним пристроям, у тому числі при гарячому їх підключенні.
Як відомо, будь-якій POSIX-системі імена конкретних пристроїв більш менш байдужі, оскільки оперує вона не з ними, а з їх ідентифікаторами. Раніше, до впровадження devfs і, пізніше, udev), в якості таких виступали так звані номери пристроїв - старший номер пристрою, що визначає його клас (наприклад, ide-накопичувачі) і його молодший номер, що вказує на конкретний екземпляр даного представника класу. Нині ж використовуються безпосередні ідентифікатори пристроїв - серійний номер вінчестера, його положення на SATA-роз'єм або канал PATA-шини, і так далі.Поєднання їх для кожного диска (розділу, тощо) виявляється унікальним. Так ось, udev отримує ці відомості з файлової системи sysfs і, керуючись певними правилами, ставить їм у відповідність "людські" імена (на зразок тих же /dev/sda і так далі).
Процес включення підтримки udev дуже простий і зводиться до встановлення пакету udev - у всіх сучасних дистрибутивах Linux він входить до базової системи, тому спеціально його встановлювати не потрібно.
Далі слід подбати про запуск демона udevd при старті системи. За це відповідає один із сценаріїв ініціалізації, який залежить від дистрибутива. Наприклад, в Ubuntu це буде файл /etc/init.d/udev. Втім, у будь-якому сучасному дистрибутиві це також відбувається за умовчанням, тож руками нічого правити не треба.
Підключення флеш-накопичувача в USB-роз'єм негайно призводить до появи у списку пристрою з ім'ям /dev/sdb, яке не змінюється, скільки б не повторювати цю процедуру.
Іншими словами, каталог /dev набуває вигляду, звичного за часом статичного іменування пристроїв. З тією тільки різницею, що тепер він не заповнений на користь файлами можливих, але не існуючих пристроїв.
За конфігурування механізму udev відповідає спеціальний файл. /etc/udev/udev.conf, що визначає глобальні параметри, кореневий каталог для файлів пристроїв (за замовчуванням - /dev), файл бази даних пристроїв, файли опису правил іменування пристроїв та прав доступу до них, а також правила створення символічних посилань (подібних) /dev/cdrom). Конкретні імена цих файлів та їх розташування залежать від дистрибутива. Зазвичай це файли виду /etc/udev/rules.d/udev.rules та /etc/udev/permissions.d/udev.permissions.
Ручне втручання у конфігураційні файли потрібно рідко, але інодітака необхідність виникає. Так, на зорі впровадження механізму udev я зіткнувся (у дистрибутив Archlinux) з такою ситуацією: після перезапуску машини з задіяним udev у мене зник звук — і з першого ж погляду на файл /etc/udev/permissions.d/udev.permissions стало зрозуміло, чому. Права доступу до всіх аудіо-пристроїв мали приблизно такий вигляд:
де dsp - ім'я пристрою, root:root - господар і група, відповідно, 0660 - маска, визначальна заборона доступу всім, крім господар і групи. У мене ж раніше пристрої, пов'язані з відтворенням аудіо, належали до групі sound, в яку я і вмикав себе.
Тож довелося терміново замінити друге входження root'а на гурт sound — і після перезапуску зі звуком все стало гаразд.
Для управління механізмом udev “на льоту” служить утиліта udevadm. Зокрема, з її допомогою можна визначити унікальні ідентифікатори будь-яких пристроїв сучасних дистрибутивах, як уже було сказано, саме вони використовуються, наприклад, для автоматичного монтування файлових систем під час старту машини. Для цієї мети слід дати команду udevadm приблизно в такому вигляді:
Тут субкоманда info наказує вивести інформацію, опція –query визначає, яку саме (env – специфікації пристрою), а значенням опції –name буде ім'я файлу пристрою. Серед безлічі параметрів, таких як модель диска, його інтерфейс і багато іншого, буде і шуканий ідентифікатор пристрою приблизно такого вигляду (саме його ми відфільтровуємо, передаючи висновок утиліти команді udevadm grep):
Цей ідентифікатор можна використовувати у файлі /etc/fstab замість імені пристрою, приблизно таким чином:
Що має і свої недоліки, і свої переваги. Недоліки- очевидні: громіздкість і незручність файлу.
Переваги не лежать на поверхні, але також є: зокрема, при перемиканні дисків з одного SATA-роз'єму на інший, або при зміні послідовності звернення до вінчестерів в BIOS Setup, не потрібно думати про зміні відповідних рядків /etc/fstab.
Ще одна сфера застосування UUID, що напрошується, — забезпечення безпеки. Так, внесенням до /etc/fstab рядків виду
можна дозволити монтувати від імені звичайного користувача, скажімо, не флеш-накопичувачі взагалі, а лише зовсім конкретні флешки. Те саме саме можна поширити на CD- і DVD-носії, камери та ін. Спосіб досить клопіткий - потрібно вносити багато рядків в /etc/fstab і відключати автомонтування змінних накопичувачів через HAL (про який мова йтиметься в наступному розділі). Однак можна уявити ситуації, коли він буде виправданий.
Одна з додаткових особливостей udev – можливість створювати файли пристроїв з нестандартними іменами, наприклад /dev/camera — для цифрового фотоапарата, /dev/flash - для флеш-накопичувача, і так далі. Це корисно, зокрема, якщо одночасно підключено кілька пристроїв з інтерфейсом одного типу скажімо, та сама камера і флешка, оскільки не потрібно задати, яке з імен файлів пристроїв виду /dev/sd?# чому відповідає.
Розглянемо це питання на прикладі звичайного флеш-накопичувача з USB-інтерфейсом. Для чого підключаємо пристрій, що цікавить нас, і в за допомогою все тієї ж команди udevadm визначаємо його ідентифікатор:
Тепер нам знадобляться права адміністратора для створення файлу опису правил, одержуваний, наприклад, так:
де значенням змінної ID_FS_UUID будеотриманий вище ідентифікатор пристрою, значенням змінної NAME - якесь менімонічно зручне ім'я, що в даному випадку символізує, що ми маємо справу з флешкою об'ємом 256 Мбайт.
Перезавантаження системи не потрібно: для перевірки правильності виконаних дій достатньо від'єднати пристрій та підключити його заново.
Конфігураційні файли udev при цьому будуть перечитані, в результаті чого каталог /dev/ з'явиться файл з відповідним ім'ям:
Повторюємо процедуру для всіх пристроїв, що цікавлять нас: так, я проробляю це для постійно використовуваних мною флешок обсягом 1 Гбайт і 16 Гбайт, визначаючи їм імена fl1g і fl16g, відповідно.
З камерою все так само, але заради різноманітності проробимо описану процедуру дещо іншим шляхом, зокрема: підключаємо камеру і даємо команду devadm в дещо іншій формі:
Після чого у файл /etc/udev/rules.d/00-flash.rules додаємо відповідний рядок:
І після відключення та повторного приєднання пристрою маємо щастя спостерігати у каталозі /dev новий файл:
Оскільки файли пристроїв створюються динамічно під час завантаження системи, то й посилання повинні створюватися динамічно, що також описується відповідними правилами. У більшості сучасних дистрибутивів Linux'а такі правила задаються за умовчанням під час інсталяції системи. Так, в Ubuntu вони містяться у файлі /etc/udev/rules.d/70-persistent-cd.rules у такому вигляді:
Якщо з будь-яких причин посилань виду /dev/cdrom -> /dev/sr0 при старті системи не створюється, слід прописати правила, за образом та подобою наведених, вручну.