Гаряче підключення hotplug
9.11.1. Вступ
Підсистема ядра hotplug динамічно обробляє підключення і відключення пристроїв, завантажуючи відповідні драйвери і створюючи файли пристроїв (за допомогою udevd). З сучасним обладнанням і виртуализацией можна підключати «на льоту» майже все: від звичайних периферійних пристроїв USB / PCMCIA / IEEE 1394 до жорстких дисків SATA, і навіть процесорів і пам'яті.
У ядра є база даних для зіставлення ідентифікатора кожного пристрою необхідного драйверу. Ця база даних використовується при завантаженні для підключення драйверів всіх периферійних пристроїв, виявлених на різних шинах, а також при гарячому підключенні додаткового пристрою. Коли пристрій готовий до використання, відправляється повідомлення udevd. щоб він створив відповідний запис в / dev /.
9.11.2. проблема іменування
До появи гарячих підключень було дуже просто привласнити пристрою фіксоване ім'я. Воно грунтувалося просто на розташуванні пристроїв на їх шині. Але це неможливо, коли такі пристрої можуть з'явитися і почати використовувати шину. Типовим випадком є використання цифрового фотоапарата або USB-брелока, які представляються комп'ютера як жорсткі диски. Перший підключений може стати / dev / sdb. а другий - / dev / sdc (якщо / dev / sda є локальний жорсткий диск комп'ютера). Ім'я пристрою не є фіксованою; воно залежить від порядку, в якому пристрої підключаються.
Крім того, все більше пристроїв використовують динамічні значення своїх старшого і молодшого номерів, через що стає неможливим використовувати для даних пристроїв статичні записи, адже ці найважливіші характеристики можуть змінюватися після перезавантаження.
udev був створений спеціально для вирішення цієї проблеми.
НА ПРАКТИЦІ Управління мережевими картами
Many computers have multiple network cards (sometimes two wired interfaces and a wifi interface), and with hotplug support on most bus types, the Linux kernel does not guarantee fixed naming of network interfaces. But users who want to configure their network in / etc / network / interfaces need a fixed name!
This mechanism has some side effects that you should know about. Let's consider the case of a computer that has only one PCI network card. The network interface is named eth0. logically. Now say the card breaks down, and the administrator replaces it; the new card will have a new MAC address. Since the old card was assigned the name, eth0. the new one will be assigned eth1. even though the eth0 card is gone for good (and the network will not be functional because / etc / network / interfaces likely configures an eth0 interface). In this case, it is enough to simply delete the /etc/udev/rules.d/70-persistent-net.rules file before rebooting the computer. The new card will then be given the expected eth0 name.
9.11.3. Як працює udev
Озброївшись цією інформацією, udev звіряється з усіма правилами, що містяться в /etc/udev/rules.d/ і /lib/udev/rules.d/. В ході цього процесу він приймає рішення, яке ім'я присвоїти пристрою, які символічні посилання створити (щоб дати альтернативні імена) та які команди запустити. Перевіряються всі ці файли, і всі правила виконуються послідовно (якщо в файлах не використовуються директиви «GOTO»). Так що може бути кілька правил, відповідних окремим події.
Синтаксис файлів правил досить простий: кожен ряд містить критерії вибору і присвоювання значень змінним. Перші використовуються для відбору подій, на які потрібно реагувати, а останні визначають дію, яке потрібно зробити. Вони все розділяються комами, і оператор використовується для того, щоб у спосіб відрізнити критерій вибору (з операторами порівняння, такими як == або! =) Від директиви присвоювання (з такими операторами як =. + = Або: =).
Оператори порівняння використовуються з наступними змінними:
KERNEL - ім'я, яке ядро привласнює пристрою;
ACTION - дія, відповідне події ( «add» при додаванні пристрою, «remove» при його видаленні);
DEVPATH - шлях до запису пристрою в / sys /;
SUBSYSTEM - підсистема ядра, від якої прийшов запит (їх багато, наприклад «usb», «ide», «net», «firmware» і т. П.);
ATTRattribute>. file contents of the attribute file in the / sys / $ devpath / directory of the device. This is where you find the MAC address and other bus specific identifiers;
KERNELS. SUBSYSTEMS і ATTRSатрібути> - це варіації, які намагаються знайти відповідність різним опцій одного з пристроїв, які є батьківськими по відношенню до поточного;
PROGRAM - делегує перевірку зазначеній програмі (істина якщо вона повертає 0, брехня в іншому випадку). Вміст стандартного виводу програми зберігається, так що його можна використовувати в перевірці RESULT;
RESULT - виконує перевірки стандартного виводу, збереженого при останньому виклику PROGRAM.
У правих операндах можна використовувати шаблонні вирази, відповідні декільком значенням одночасно. Наприклад, * відповідає будь-якому рядку (навіть порожній) ;. відповідає будь-якому символу, а [] відповідає набору символів, перерахованих всередині квадратних дужок (або навпаки, якщо першим символом є знак оклику, а безперервні діапазони символів вказуються як a-z).
Що стосується операторів присвоювання, = привласнює значення (і замінює поточне значення); в разі списку він очищається і містить тільки присвоєне значення. = Робить те ж саме, але забороняє зміну змінної в подальшому. + = Додає запис у список. Можна змінювати такі змінні:
NAME - ім'я файлу пристрою, який належить створити в / dev /. Враховується тільки перше присвоювання, інші ігноруються;
SYMLINK - список символьних посилань, які будуть вказувати на той же пристрій;
OWNER. GROUP і MODE визначають користувача і групу, що володіють пристроєм, а також призначені йому дозволу;
RUN - список програм, які повинні бути запущені у відповідь на подію.
У значеннях, що привласнюються цим змінним, можуть використовуватися такі підстановки:
$ Kernel або% k - еквівалент KERNEL;
$ Number або% n - порядковий номер пристрою, наприклад для sda3 він був би рівний «3»;
$ Devpath або% p - еквівалент DEVPATH;
$ Attrатрібут> або% sатрібут> - еквівалент ATTRSатрібут>;
$ Major або% M - старший номер пристрою в ядрі;
$ Minor або% m - молодший номер пристрою в ядрі;
$ Result або% c - строковий висновок останньої програми, викликаної PROGRAM;
і нарешті, %% і $$ означають, відповідно, знак відсотка і знак долара.
The above lists are not complete (they include only the most important parameters), but the udev (7) manual page should be exhaustive.
9.11.4. конкретний приклад
Розглянемо випадок простого USB-брелока і спробуємо привласнити йому фіксоване ім'я. По-перше, необхідно знайти елементи, які ідентифікують його унікальним чином. Для цього треба підключити його і запустити udevadm info -a -n / dev / sdc (замінивши / dev / sdc на дійсне ім'я, присвоєне брелоку).
Щоб створити нове правило, можна використовувати перевірки змінних як пристрої, так і його батьківських пристроїв. У наведеному прикладі можна створити два правила на зразок цих:
Після того, як ці правила прописані у файлі з ім'ям, наприклад, /etc/udev/rules.d/010_local.rules. можна просто від'єднати і заново підключити USB-брелок. Після цього можна буде переконатися, що / dev / usb_key / disk представляє диск, асоційований з USB-брелоком, а / dev / usb_key / part1 - його перший розділ.
Like many daemons, udevd stores logs in /var/log/daemon.log. But it is not very verbose by default, and it is usually not enough to understand what is happening. The udevadm control --log-priority = info command increases the verbosity level and solves this problem. udevadm control --log-priority = err returns to the default verbosity level.