Библиотека сайта rus-linux.net
7.4. Поддержка устройств и модулей в LFS системе
В Главе 6 мы установили пакет Udev. Сначала мы детально расмотрим, как это работает и короткую историю предыдущих методов поддержки устройств.
Системы Linux в основном традиционно используют метод создания статических
устройств, из-за чего создается огромное количество нод устройств в директори
/dev
(иногда буквально сотни нод),
не смотря на наличие соответствующих реальных аппаратных устройств.
Это типично для работы скрипта MAKEDEV, который содержит большое количество вызовов
к программе mknod с уместными
старшими и младшими номерами устройств для каждого возможного устройства,
которое может существовать в мире. Используя метод udev, только те устройства,
которые обнаружены ядром, получат ноды устройств, созданные для них.
Поскольку эти ноды устройств будут создаваться при каждой загрузке системы,
они будут сохраняться в ramfs
(файловой системе,
которая размещается непосредственно в памяти и не занимает места на диске).
Ноды устройств не требуют много места на диске, поэтому используемая ими память
незначительна.
7.4.1. История
В феврале 2000 года новая файловая система, названная devfs
, была добавлена в ядро 2.3.46 и стала
доступной в стабильных ядрах серии 2.4. Хотя сама она присутствовала в
исходниках ядра, метод динамического создания устройств никогда не получал
подавляющую поддержку разработчиков ядра.
Основные проблемы к такому подходу, заимствованые devfs
- это способ поддержки определения,
создания и именования устройств. Возможно, последняя проблема именования нод
устройств была более критичной. Обычно принималось, что имена устройств
доступны для конфигурации, затем политика именования устройств
должна быть передана системному администратору, не навязана ему
любым разработчиком. Файловая система devfs
также страдала от обстоятельств, связанных с ее
разработкой, и не могла быть исправлена без обоснования пересмотра ядра.
Для нее также не хватало новых разработчиков.
С разработкой нестабильной ветки ядра 2.5, в конце выпущенной как
серия 2.6 стабильных ядер, появилась новая виртуальная файловая система,
названная sysfs
. Работа sysfs
- это экспорт видимой для процессов системной
структуры в пространстве пользователя. С таким пространством пользователя
замена devfs
стала более реальной.
7.4.2. Внедрение Udev
Файловая система sysfs
была коротко
упомянута выше. Одно может удивлять, как sysfs
знала о присутствующих в системе устройствах и какие номера устройств
должны быть использованы. Драйвера, которые были вкомпилированы прямо в
ядро, регистрировали свои объекты при помощи sysfs
, поскольку они определялись ядром. Для драйверов,
скомпилированных в виде модулей это произойдет после загрузки модулей.
Как только файловая система sysfs
примонтирована (в /sys
), данные, встроеные
в драйвера и зарегистрированные sysfs
,
становятся доступными для процессов пространства пользователя и для
udev для создания нод устройств.
Стартовый скрипт S10udev заботится
о создании этих нод устройств во время загрузки Linux. Этот скрипт
запускается с регистрацией /sbin/udev
в качестве руководителя событий hotplug (горячих подключений). События hotplug
(обсуждаемые ниже) не должны быть генерированы на этом этапе,
но udev регистрируется только в случае,
если они происходят. Затем программа udevstart проходит по файловой системе
/sys
и создает устройства в директории
/dev
, которые соответствуют описаниям.
Например, /sys/class/tty/vcs/dev
содержит строку “7:0”.
Эта строка используется udevstart
для созданиия /dev/vcs
со старшим номером
7 и младшим 0. Права доступа каждого из устройств,
создаваемых udevstart,
устанавливаются, используя файлы в директории /etc/udev.d/permissions.d/
. Они пронуменованы
в стиле, похожем на стартовые скрипты LFS. Если
udev не может найти файл с правами
доступа для создаваемых устройств, то по умолчанию будут установлены права
доступа 600 и владелец
root:root. Имена созданных в
директории /dev
нод устройств сконфигурированы
соответственно правилам, описанным в файлах в директории
/etc/udev/rules.d/
.
Как только выше описанный этап выполниться, все присутствующие устройства и имеющие вкомпиливованные в ядро драйвера будут доступны для использования. А что с устройствами, имеющими модульные драйвера?
Ранее мы описали концепцию “поддержки событий hotplug”. Когда подключение
нового устройства обнаружено ядром, ядро сренерирует событие
hotplug и обратится к файлу /proc/sys/kernel/hotplug
для поиска программы,
поддерживающей подключение устройств. Стартовый скрипт udev зарегистрирован udev в качестве такой программы. Когда эти события
hotplug сгенерированы, ядро скажет udev проверить файловую систему /sys
для поиска информации, принадлежащей этому
новому устройству, и создать для него объект в /dev
.
Это подводит нас к проблеме, которая присутствует с udev, а также перед ней с devfs
. Для нас это похоже на проблему
“курицы и яйца”.
Большинство Linux дистрибутивов поддерживают загрузку модулей через
содержимое файла /etc/modules.conf
. Доступ к
нодам устройств вызывает загрузку подходящего модуля ядра. С
udev этот метод не будет работать,
так как нода устройства отсутствует во время загрузки модуля.
Для решения этой задачи в пакет lfs-bootscripts был добавлен загрузочный
скрипт S05modules вместе с файлом
/etc/sysconfig/modules
. Добавив
имена модулей в файл modules
, эти модули
будут загружены при старте компьютера. Это позволяет
udev определить устройства и создать подходящие
ноды устройств.
Зметьте, что на медленных машинах или для драйверов, создающих много нод устройств, процессы создания устройств могут занять несколько секунд. Это означает, что некоторые ноды устройств могут не быть доступны немедленно.
7.4.3. Поддержка динамических устройств и устройств с горячим подключением
Если вы подключаете устройство, такое как Universal Serial Bus (USB)
MP3 проигрыватель, ядро определяет, что устройство подключилось и
генерирует событие hotplug. Если драйвер уже загружен (потому
что он был вкомпилирован в ядро или был загружен как модуль через
скрипт S05modules), будет вызван
udev для создания уместной
ноды устройства согласно данным sysfs
,
доступным в /sys
. Если драйвер для только что
подключенного устройства доступен в виде модуля, но в данный момент
выгружен, то присоединение устройства к системе только вызовет
драйвер шины ядра для генерации события hotplug, которое сообщает
пространству пользователя о новом подключении устройства и
присоединения к драйверу не будет. В результате ничего не происходит
и само устройство еще не готово к использованию.
Если для собираемой системы, имеющей много драйверов, исполнение их в виде модулей лучше, чем прямое встраивание в ядро, использование скрипта S05modules может быть не практичным. Пакет Hotplug (смотрите http://linux-hotplug.sourceforge.net/) может быть более предпочтительным в этом случае. Когда пакет Hotplug установлен, он будет отвечать на вышеупомянутые события hotplug драйвера шины ядра. Пакет Hotplug загрузит подходящий модуль и сделает это устройство доступным созданием для него ноды(нод) устройства.
7.4.4. Проблемы с созданием устройств
Есть несколько известных проблем при автоматическом создании нод устройств:
1) Драйвер ядра может не экспортировать свои данные для sysfs
.
Это часто встречается с драйверами, не входящими в дерево ядра.
Используйте файл конфигурации /etc/sysconfig/createfiles
для ручного создания
устройств. Проконсультируйтесь в файле devices.txt
в документации ядра или в документации
для этого драйвера для поиска правильных старших/младших номеров.
2) Требуется не аппаратное устройство.
Это часто встречается с модулем совместимости Open Sound System (OSS) проекта Advanced Linux Sound Architecture (ALSA). Такой тип устройств может поддерживаться двумя способами:
-
Добавлением имен модулей в
/etc/sysconfig/modules
-
Используя строку “install” в
/etc/modprobe.conf
. Это говорит команде modprobe “когда загружаеш тот модуль, также одновременно загрузи и этот другой модуль”. Например:install snd-pcm modprobe -i snd-pcm ; modprobe \ snd-pcm-oss ; true
Это заставит систему загружать оба модуля snd-pcm и snd-pcm-oss когда сделан запрос для загрузки драйвера snd-pcm.
7.4.5. Полезное чтение
Дополнительная полезная документация доступна на следующих сайтах: