WebMoney: WMZ Z294115950220 WMR R409981405661 WME E134003968233 |
Visa 4274 3200 2453 6495 |
В главе 6 мы
установили пакет Udev. Сначала мы детально расмотрим, как это работает и
короткую историю предыдущих методов поддержки устройств. Системы Linux в основном традиционно используют метод создания статических
устройств, из-за чего создается огромное количество нод устройств в каталоге
/dev (иногда буквально сотни нод),
несмотря на наличие соответствующих реальных аппаратных устройств.
Это типично для работы скрипта MAKEDEV,
который содержит большое количество вызовов к программе
mknod с уместными
старшими и младшими номерами устройств для каждого возможного устройства,
которое может существовать в мире. Используя метод udev, только те устройства,
которые обнаружены ядром, получат ноды устройств, созданные для них.
Поскольку эти ноды устройств будут создаваться при каждой загрузке системы,
они будут сохраняться в ramfs (файловой системе,
которая размещается непосредственно в памяти и не занимает места на диске).
Ноды устройств не требуют много места на диске, поэтому используемая
ими память незначительна. В феврале 2000 года новая файловая система, названная
devfs, была добавлена в ядро 2.3.46 и стала
доступной в стабильных ядрах серии 2.4. Хотя сама она присутствовала в
исходниках ядра, метод динамического создания устройств никогда не получал
подавляющую поддержку разработчиков ядра. Основные проблемы, приведшие к такому подходу, заимствованные
devfs, это способ поддержки определения,
создания и именования устройств. Возможно, последняя проблема именования нод
устройств была более критичной. Обычно принималось, что имена устройств
доступны для конфигурации, затем политика именования устройств
должна быть передана системному администратору,
не навязана ему любым разработчиком. Файловая система
devfs также страдала от обстоятельств, связанных с ее разработкой,
и не могла быть исправлена без обоснования пересмотра ядра.
Для нее также не хватало новых разработчиков. С разработкой нестабильной ветки ядра 2.5, в конце выпущенной как
серия стабильных ядер 2.6, появилась новая виртуальная файловая система,
названная sysfs. Работа
sysfs это экспорт видимой для процессов системной структуры в
пространстве пользователя. С таким пространством пользователя замена
devfs стала более реальной. Файловая система 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
определить устройства и создать подходящие ноды устройств. Зметьте, что на медленных машинах или для драйверов, создающих много
нод устройств, процессы создания устройств могут занять несколько секунд.
Это означает, что некоторые ноды устройств могут не быть доступны немедленно.
Если Вы подключаете устройство, такое как Universal Serial Bus (USB)
MP3-проигрыватель, ядро определяет, что устройство подключилось и
генерирует событие hotplug. Если драйвер уже загружен (потому что он был
вкомпилирован в ядро или был загружен как модуль через скрипт
S05modules), будет вызван
udev для создания уместной
ноды устройства согласно данным sysfs,
доступным в /sys. Если драйвер для только что
подключенного устройства доступен в виде модуля, но в данный момент
выгружен, то присоединение устройства к системе только вызовет
драйвер шины ядра для генерации события hotplug, которое сообщает
пространству пользователя о новом подключении устройства и
присоединения к драйверу не будет. В результате ничего не происходит,
и само устройство еще не готово к использованию. Если для собираемой системы, имеющей много драйверов, исполнение их в виде
модулей лучше, чем прямое встраивание в ядро, использование скрипта
S05modules может быть не практичным.
Пакет Hotplug (смотрите
http://linux-hotplug.sourceforge.net/)
может быть более предпочтительным в этом случае. Когда пакет Hotplug
установлен, он будет отвечать на вышеупомянутые события hotplug
драйвера шины ядра. Пакет Hotplug загрузит подходящий модуль и сделает это
устройство доступным созданием для него ноды (нод) устройства. Есть несколько известных проблем при автоматическом создании нод устройств:
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 “
когда загружаешь тот модуль, также одновременно загрузи и другой модуль
”. Например: Это заставит систему загружать оба модуля
snd-pcm и snd-pcm-oss,
когда сделан запрос для загрузки драйвера snd-pcm
. Дополнительная полезная документация доступна на следующих сайтах: Реализация devfs
http://www.kroah.com/linux/talks/ols_2003_udev_paper/Reprint-Kroah-Hartman-OLS2003.pdf
. udev FAQ
http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev-FAQ.
Модель драйвера ядра Linux
http://public.planetmirror.com/pub/lca/2003/proceedings/papers/Patrick_Mochel/Patrick_Mochel.pdf
.
Linux From Scratch. Версия 6.0
Глава 7. Установка системных скриптов загрузки
7.4. Поддержка устройств и модулей в LFS-системе
7.4.1. История
7.4.2. Внедрение Udev
7.4.3. Поддержка динамических устройств и
устройств с горячим подключением
7.4.4. Проблемы с созданием устройств
install snd-pcm modprobe -i snd-pcm ; modprobe \
snd-pcm-oss ; true
7.4.5. Полезное чтение
Найди своих коллег! |