Igorka Лекція №30 - Підсистема udev

Дещо про все і все про небагато, або практичний досвід системного адміністратора.

лекція

Березень 2010Пн Вт Ср Чт Пт Сб Нд
«Лютийквітень »
1234567
891011121314
15161718192021
22232425262728
293031

udev

Лекція №30 - Підсистема udev

На попередніх лекціях ми іноді згадували про підсистемуudev. Ви вже повинні розуміти загалом, що таке udev і навіщо вона потрібна. Найпростіше пояснити призначення підсистемиudev на основі шиниUSB і пристроїв, що підключаються до неї. Коли до комп'ютера підключаєтьсяUSB-пристрій, ядро ​​на рівні обслуговування шиниUSB фіксує подію приєднання нового пристрою. Перелік таких подій можна переглянути, виконавши командуdmesg. Ось приклад подій, які реєструє ядро ​​при підключенні флеш-накопичувача:

До появиudev необхідно було вручну знаходити пристрої, що підключаються, і налаштовувати їх роботу в системі. Тепер цю роботу на себе береudev. Коли ви підключаєте флеш-накопичувач до комп'ютера з сучаснимLinux -дистрибутивом, то все налаштування та монтування файлової системи відбувається автоматично.

Дуже тісно зudev пов'язана файлова системаsysfs, яка монтується в каталог/sys. Каталог/sys відображає та надає доступ до апаратної конфігурації комп'ютера. Іншими словами/sys - це відображення апаратної конфігурації комп'ютера. Вміст каталогу/sys динамічно змінюється при зміні апаратної конфігурації.

Якщо зупинити демонudev, то при підключенні флеш-накопичувача, ядро ​​реєструватиме події, каталог/sys буде змінюватися, але файлова система флеш-накопичувача не буде змонтована. Більше того, в каталозі/dev ви також не побачите нового пристрою, тому що самеudev створює там блоковий пристрій, що є флеш-накопичувачем.

Отже, підіб'ємо невеликий підсумок. Завдання ядра визначати зміни в апаратній конфігурації системи, реєструвати ці зміни, та вносити зміни до каталогу/sys. Завдання підсистемиudev виконати подальшу інтеграцію та налаштування пристрою в системі (відобразити його в каталозі/dev ), і надати користувачеві вже готовий до роботи пристрій.

Підсистемаudev налаштовує пристрої відповідно до заданих правил. Правила містяться у файлах каталогу/etc/udev/rules.d/. Також файли з правилами можуть бути і в каталозі/etc/udev/. Усі файли правил проглядаються в алфавітному порядку.

Розглянемо рядок із правилом із файлу правил та познайомимося з основними принципами побудови правил:

У рядку бачимо 4 пари виразів розділених комою. Перші дві пари є так званими фільтрами, що дозволяють ідентифікувати пристрій. У прикладіSUBSYSTEMS==”scsi” вказує на те, що пристрій має бути SCSI-пристроєм, а параKERNEL==”sr[0-9]*” ідентифікує пристрій на ім'я яке воно (пристрій) отримало від ядра системи. Тобто це правило застосовуватиметься до SCSI-пристрою з ім'ямsr0 абоsr1 і т.д.

Далі йдуть пари-дії, які будуть виконуватися з пристроями, які відповідають фільтру.NAME=”scd%n” - цей запис говорить про те, що для пристрою буде створено файл-пристрій у каталозі/dev з ім'ямscd0 абоscd1 і т.д. Цифра буде залежати від цифри в імені пристрою. Замість%n і буде підставлено цифру з імені. Якщо ім'я пристрою будеsr0, тоscd%n перетворюється наscd0. Також дуже часто використовується підстановка%k.%k - це повне ім'я пристрою. Тобто замість%k буде підставленоsr0. Якщо одного імені файлу-пристрою (/dev/scd0 ) недостатньо, можна створити символічні лінки -SYMLINK+=”sr%n”. Цей вираз створить у каталозі/dev символічний лінк з ім'ямsr0 на файл пристрою/dev/scd0. Зверніть увагу, що використовується оператор+=.

Для кожного пристрою ядро ​​створює відповідні записи в каталозі/sys. Пристрій крім приналежності до будь-якої підсистеми та імені також має безліч атрибутів, таких як назва, модель, серійний номер та інші. Ідентифікувати пристрої можна і за іменами атрибутів. І тому використовується виразATTRIB==значення атрибута.

Виконаємо таке практичне завдання. Напишемо правило, яке створить у каталозі/dev символічний лінк на флеш-накопичувач, що підключається. Флеш-накопичувач ідентифікуємо за серійним номером. Підключаємо флеш-накопичувач і за допомогою командиdmesg дивимося ім'я, яке було присвоєно ядром для цього накопичувача:

udevinfo -q all -n sde

P: /devices/pci0000:00/0000:00:13.2/usb2/2-2/2-2:1.0/host8/target8:0:0/8:0:0:0/block/sde N : sde W: 85 S:block/8:64 S: disk/by-id/usb-OCZ_RALLY2_ST1A9BFE-0:0 . . E: DKD_PARTITION_TABLE_SCHEME=mbr E: DKD_PRESENTATION_NOPOLICY=0 E: DEVLINKS=/dev/block/8:64 /dev/disk/ru-us/usb-OCZ_RALLY2_ST1A9BFE-0:0

Нас цікавить перший рядок який містить шлях до іншої інформації про пристрій записаної в каталозі/sys. Щоб отримати цю інформацію, потрібно виконати командуudevinfo -a -p шлях. Щоб не набирати такого довгого шляху можна записати таку команду:

В результаті отримаємо довгий перелік атрибутів та значень у вигляді готовому для використання в правилах udev 15. Нижче невеликий фрагмент результатів:

Тепер можна скласти правило. Наприклад, так:

Це правило буде застосовано до всіх пристроїв підсистемиUSB, у яких серійний номер дорівнюєST1A9BFE. В результаті повинен бути створений символічний лінк на такий пристрій у каталозі/dev.

Створюємо файл/etc/udev/rules.d/10-myudev.rules, вставляємо в нього наше правило. Відключаємо флеш-накопичувач, перевантажуємо демонudev і знову підключаємо флеш-накопичувач. Виконаємо командуls -l /dev grep MyFlash :

Бачимо, що підсистемаudev виконала наше правило і створила символічний лінк на файл-пристрійsde.