%general-entities; ]> Обработка устройств и модулей Udev usage Ранее, в шестой главе, был установлен пакет eudev systemd. Перед тем, как приступить к описанию процесса как это работает, будет кратко рассказана история предыдущих методов работы устройств. Системы Linux традиционно используют метод статического создания устройств, посредством чего, большое число узлов устройств (иногда буквально тысячи узлов) создается в каталоге /dev, независимо от того, существуют ли соответствующие аппаратные устройства. Это обычно делается средствами сценария MAKEDEV, который содержит команды вызова программы mknod с соответствующим числом для каждого возможного устройства которое только может существовать в мире. Используя метод Udev, только те устройства, которые были обнаружены ядром, получают свой узел. Поскольку эти узлы будут создаваться каждый раз, при загрузке системы, они будут располагаться в каталоге виртуальной файловой системы devtmpfs (виртуальная файловая система, которая полностью находится в оперативной памяти). Узлы не занимают много места в памяти, и их общий размер незначителен. История В феврале 2000 года, новая файловая система devfs была принята в ветку ядра 2.3.46 и была доступна на протяжении выпуска стабильных релизов ветки 2.4. Хотя она и присутствовала в ядре, такой способ динамического создания устройств никогда не получал поддержки от разработчиков ядра. Главная проблема в этом подходе заключалась в механизме обнаружения, создания и назначения имен устройствам. Последняя из которых, связанная с назначением имен узлам устройств была, самой важной. Как правило, если имена устройствам можно настраивать, то политика назначения имён должна быть установлена системным администратором и не должна быть навязана разработчиками. Файловая система devfs также страдала от условий гонки, которые были присущи ее дизайну и не могли быть исправлены без существенной переработки самого ядра. В конечном счёте, эта файловая система была отмечена как устаревшая, на протяжении достаточно долгого периода, по причине отсутствия её ненадлежащей поддержки, и была удалена из ветки ядра в июне 2006 года. При развитии нестабильной ветки ядра 2.5, позднее, выпущенной как стабильный релиз 2.6, появилась новая виртуальная файловая система sysfs. Задача этой файловой системы заключалась в экспорте представления об аппаратной конфигурации системы в процессах пользовательского окружения. Благодаря этому, разработка замены пользовательского окружения для devfs стала гораздо реалистичнее. Реализация Udev Sysfs Краткое описание файловой системы sysfs было представлено выше. Можно задаться вопросом, как sysfs получает информацию об устройствах в системе, и о том, какие номера устройств должны использоваться для них. Драйверы, скомпилированные в ядро, напрямую регистрируют объекты с помощью sysfs ( внутри devtmpfs ), так как они обнаруживаются ядром. Для драйверов, которые скомпилированы в виде модулей, регистрация будет происходить при его загрузке. После того, как файловая система sysfs будет примонтирована в каталог /sys, данные, которые регистрируются драйверами, с помощью sysfs, станут доступны для процессов пользовательского окружения и для udevd, для последующей обработки (включая изменения узлов устройств). Создание узлов устройств Файлы устройств создаются ядром при помощи файловой системы devtmpfs. Любой драйвер, которому необходимо зарегистрировать узел устройства, будет проходить через файловую систему devtmpfs (через системный драйвер ядра). Когда экземпляр devtmpfs монтируется в каталог /dev, узел устройства будет создан с фиксированным наименованием, соответствующими разрешениями и владельцем. Через некоторое время, ядро отправит uevent в udevd. На основе правил, которые указанны в файлах в каталогах /etc/udev/rules.d, /lib/udev/rules.d, и /run/udev/rules.d, udevd создаст дополнительные символические ссылки на узлы устройств, или сменит разрешения, владельца или группу, или сменит запись (наименование) во внутренней базе данных udevd для этого объекта. Правила в этих трёх каталогах нумеруются и объединяются вместе. Если udevd не может найти правило для устройства, он оставит права доступа и права собственности на все первоначально используемые devtmpfs. Загрузка модулей Драйверы устройств, скомпилированные в виде модулей ядра могут содержать встроенные псевдонимы. Псевдонимы можно увидеть просмотрев вывод программы modinfo. Они, как правило, связаны с идентификаторам шины устройства, поддерживаемым модулем. Например, драйвер snd-fm801 подерживает PCI устройства с идентификатором поставщика 0x1319 и идентификатором устройства 0x0801, и имеет псевдоним pci:v00001319d00000801sv*sd*bc04sc01i*. Для большинства устройств, драйвер шины экспортирует псевдонимы драйвера, которые будет обрабатывать устройство через sysfs. Например, файл /sys/bus/pci/devices/0000:00:0d.0/modalias может содержать строку pci:v00001319d00000801sv00001319sd00001319bc04sc01i00. Правила по умолчанию, которые предоставлены Udev, заставят udevd вызвать /sbin/modprobe с содержимым, которое находится в значении переменной окружения MODALIAS uevent (которая должна совпадать с содержимым файла modalias в sysfs), тем самым загружая все модули, чьи псевдонимы совпадают в строке после расширение подстановочных знаков. К указанному выше примеру, это означает, что в дополнение к snd-fm801 устаревший (и нежелательный) драйвер forte будет загружен, если он будет доступен. Ниже описано, как можно предотвратить загрузку нежелательных драйверов. Само ядро также может загружать модули для сетевых протоколов, файловых систем и поддержки NLS по требованию. Обработка устройств с горячей заменой или динамических устройств При подключении устройства, например, MP3-плеер, к универсальной последовательной шине (USB), ядро распознает, что устройство подключено, и сгенерирует событие uevent. Это событие затем обрабатывается udevd, как было описано выше. Проблемы с загрузкой модулей и созданием устройств Есть несколько возможных проблем, когда дело доходит до автоматического создания узлов устройств. Модуль ядра не загружается автоматически Udev будет загружать модуль, только если он имеет указанный псевдоним шины, и драйвер шины правильно экспортирует необходимые псевдонимы в sysfs. В других случаях следует организовать загрузку модуля другими способами. начиная с версии Linux-&linux-version;, в udev, как известно,выполняет загрузку правильно написанных драйверов для INPUT, IDE, PCI, USB, SCSI, SERIO, и FireWire устройств. Чтобы определить, имеет ли требуемый драйвер устройства необходимую поддержку Udev, запустите modinfo с именем модуля в качестве аргумента. Далее, попробуйте найти каталог устройства в /sys/bus и проверьте, есть ли там файл modalias. Если файл modalias существует в sysfs, то драйвер, который поддерживает устройство, может общаться с ним напрямую, но не имеет псевдонима, это ошибка в драйвере. Загрузите драйвер без помощи Udev и ожидайте, что проблема будет исправлена позднее. Если же в каталоге /sys/bus нет файла modalias, это означает, что разработчики ядра еще не добавили поддержку modalias к этому типу шины. В Linux-&linux-version;, это относится к шинам ISA. Ожидайте, что эта проблема будет исправлена в более поздних версиях ядра. Udev не предназначен для загрузки драйверов обёрток, таких как snd-pcm-ossи драйверов, не относящихся к оборудованию, например loop Модуль ядра не загружается автоматически, и Udev не предназначен для его загрузки Если модуль обёртка только расширяет функциональность, которая может быть предоставлена иным модулем (например модуль snd-pcm-oss расширяет функциональность модуля snd-pcm, давая возможность звуковым картам быть доступными для OSS приложений), настройте modprobe для загрузки оболочки после того, как Udev загрузит обернутый модуль. Для этого добавьте строку softdep в файл, который находится в каталоге /etc/modprobe.d/<filename>.conf. Например: softdep snd-pcm post: snd-pcm-oss Обратите внимание, что команда softdep разрешает добавлять pre: зависимости, или одновременно pre: и post:. Обратитесь к документации modprobe.d(5) для изучения синтаксиса и возможностей softdep. Если модуль не является обёрткой, и полезен сам по себе, настройте загрузочный сценарий модулей, чтобы он добавлялся при загрузке системы. Для этого добавьте имя модуля в файл /etc/sysconfig/modules в отдельной строке. Этот способ сработает и для оберточных модулей, но не является оптимальным. Udev загружает ненужные модули Либо не создавайте модуль, либо занесите его в черный список в файле /etc/modprobe.d/blacklist.conf, как это сделано с модулем forte в примере ниже: blacklist forte Блокированные модули могут быть загружены вручную с явным указанием в команде modprobe. Udev создает устройство неправильно или создает некорректную символическую ссылку Это обычно происходит, если правило неожиданно совпадает с устройством. Например, плохо написанное правило может соответствовать как диску SCSI (по желанию), так и соответствующему универсальному устройству SCSI (неправильно) указанному поставщиком. Найдите нарушающее правило и уточните его с помощью команды udevadm info. Правило Udev работает ненадежно Это может быть проявлением предыдущей проблемы. В ином случае, если правило использует атрибуты файловой системы sysfs, то это может быть проблемой синхронизации ядра, которая будет исправлена в более поздних версиях ядра. Но вы можете обойти проблему, создав правило, которое ожидает используемый атрибут sysfs и добавляет его к файлу правил (создайте его, если он не существует). Пожалуйста, оповестите в списке рассылки разработчиков LFS, если вы делаете это, и это помогает. Udev не создаёт устройство Предполагается, что драйвер статически встроен в ядро или уже загружен как модуль, и что вы уже проверили, что Udev не создает устройство с неправильным наименованием. Udev не обладает информацией, необходимой для создания узла устройства, если драйвер ядра не экспортирует свои данные в sysfs. Как правило, такое происходит с внешними драйверами, которых нет в дереве исходного кода ядра. Создайте статический узел в каталоге /lib/udev/devices с соответствующими первичными и второстепенными номерами (см. файл devices.txt внутри документации ядра или документации, предоставленной сторонним поставщиком драйвера). Статический узел будет скопирован в /dev с помощью udev. Порядок именования устройств изменяется случайным образом после перезагрузки Это связано с тем, что Udev обрабатывает события и загружает модули параллельно, а значит в непредсказуемом порядке. Это никогда не будет исправлено. Не следует полагаться на стабильность имен устройств ядра. Вместо этого создайте свои собственные правила, которые делают символические ссылки со стабильными именами на основе некоторых стабильных атрибутов устройства, таких как серийный номер или вывод различных утилит *_id, установленных Udev. В разделе и , есть примеры. Полезно для ознакомления Дополнительная полезная документация доступна по следующим ссылкам: Реализация devfs в пользовательском окружении Файловая система sysfs