diff options
Diffstat (limited to 'lfs-12.1-sysv/chapter09/udev.html')
-rw-r--r-- | lfs-12.1-sysv/chapter09/udev.html | 490 |
1 files changed, 490 insertions, 0 deletions
diff --git a/lfs-12.1-sysv/chapter09/udev.html b/lfs-12.1-sysv/chapter09/udev.html new file mode 100644 index 0000000..fdcde06 --- /dev/null +++ b/lfs-12.1-sysv/chapter09/udev.html @@ -0,0 +1,490 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" /> + <title> + 9.3. Взаимодействие с устройствами и модулями + </title> + <link rel="stylesheet" type="text/css" href="../stylesheets/lfs.css" /> + <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot" /> + <link rel="stylesheet" href="../stylesheets/lfs-print.css" type= + "text/css" media="print" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + </head> + <body class="lfs" id="lfs-12.1"> + <div class="navheader"> + <h4> + Линукс с нуля - Версия 12.1 + </h4> + <h3> + Глава 9. Системные настройки + </h3> + <ul> + <li class="prev"> + <a accesskey="p" href="bootscripts.html" title= + "LFS-Bootscripts-20230728">Пред.</a> + <p> + LFS-Bootscripts-20230728 + </p> + </li> + <li class="next"> + <a accesskey="n" href="symlinks.html" title= + "Управление устройствами">След.</a> + <p> + Управление устройствами + </p> + </li> + <li class="up"> + <a accesskey="u" href="chapter09.html" title= + "Глава 9. Системные настройки">Наверх</a> + </li> + <li class="home"> + <a accesskey="h" href="../index.html" title= + "Линукс с нуля - Версия 12.1">Начало</a> + </li> + </ul> + </div> + <h1 class="sect1"> + <a id="ch-config-udev" name="ch-config-udev"></a>9.3. Взаимодействие с + устройствами и модулями + </h1> + <div class="sect1" lang="ru" xml:lang="ru"> + <p> + В <a class="xref" href="../chapter08/chapter08.html" title= + "Глава 8. Установка базового системного программного обеспечения">Глава 8</a>, + мы установили демон udev во время сборки <span class= + "phrase">udev</span> . Прежде чем мы углубимся в детали того, как + работает udev, необходимо кратко рассказать о предыдущих методах + взаимодействия с устройствами. + </p> + <p> + Системы Linux традиционно использовали метод статического создания + устройств, при котором огромное количество узлов устройств(иногда + буквально тысячи узлов) создавалось в <code class= + "filename">/dev</code>, независимо от того, существовали ли + соответствующие аппаратные устройства на самом деле. Обычно это + делалось с помощью скрипта <span class= + "command"><strong>MAKEDEV</strong></span>, который содержал ряд + вызовов команды <span class="command"><strong>mknod</strong></span> с + соответствующими основными и второстепенными номерами устройств, для + всех возможных вариантов, которые только могут существовать в мире. + </p> + <p> + Используя метод udev, узлы устройств создаются только для тех + устройств, которые обнаружены ядром. Эти узлы устройств создаются + каждый раз при загрузке системы; они хранятся в файловой системе + <code class="systemitem">devtmpfs</code> (виртуальная файловая + система, которая полностью находится в оперативной памяти). Узлы не + занимают много места в памяти и их общий размер незначителен. + </p> + <div class="sect2" lang="ru" xml:lang="ru"> + <h2 class="sect2"> + 9.3.1. История + </h2> + <p> + В феврале 2000 года, новая файловая система <code class= + "systemitem">devfs</code> была принята в ветку ядра 2.3.46 и была + доступна на протяжении выпуска стабильных релизов ветки 2.4. Хотя + она и присутствовала в ядре, такой способ динамического создания + устройств никогда не получал поддержки от разработчиков ядра. + </p> + <p> + Основная проблема с подходом, принятым <code class= + "systemitem">devfs</code> была связана с обработкой обнаружения, + создания и назначения имен устройствам. Проблема связанная с + именованием узлов была самой важной. Общепринято, что если имена + устройств можно настраивать, политика именования устройств должна + выбираться системными администраторами, а не навязываться + разработчиками. Файловая система <code class= + "systemitem">devfs</code> также страдала от состояния гонки, + присущего её архитектуре; оно не могло быть исправлено без + существенной переработки ядра. <code class= + "systemitem">devfs</code> долгое время была помечена как устаревшая + и, наконец, была удалена из ядра в июне 2006 года. + </p> + <p> + При разработке нестабильной ветки ядра 2.5, позднее, выпущенной как + стабильный релиз 2.6, появилась новая виртуальная файловая система + <code class="systemitem">sysfs</code>. Задача этой файловой системы + заключалась в предоставление информации о конфигурации оборудования + системы процессам пользовательского пространства. С помощью этого + представления, видимого в пользовательском пространстве, стало + возможным разработать замену пользовательского пространства для + <code class="systemitem">devfs</code>. + </p> + </div> + <div class="sect2" lang="ru" xml:lang="ru"> + <h2 class="sect2"> + 9.3.2. Реализация Udev + </h2> + <div class="sect3"> + <h3 class="sect3"> + 9.3.2.1. Sysfs + </h3> + <p> + Краткое описание файловой системы <code class= + "systemitem">sysfs</code> было представлено выше. Можно задаться + вопросом, как <code class="systemitem">sysfs</code> получает + информацию об устройствах в системе, и о том, какие номера + устройств должны использоваться для них. Драйверы, + скомпилированные в ядро, регистрируют свои объекты в <code class= + "systemitem">sysfs</code> (внутри <code class= + "systemitem">devtmpfs</code>), по мере обнаружения ядром. Для + драйверов, которые скомпилированы в виде модулей, регистрация + происходит при его загрузке. После монтирования файловой системы + <code class="systemitem">sysfs</code> (в каталог <code class= + "filename">/sys</code>), данные, зарегистрированные драйверами, в + <code class="systemitem">sysfs</code>, станут доступны для + пользовательского пространства и udevd для обработки (включая + модификацию узлов устройств). + </p> + </div> + <div class="sect3"> + <h3 class="sect3"> + <a id="ch-config-udev-device-node-creation" name= + "ch-config-udev-device-node-creation"></a>9.3.2.2. Создание узла + устройства + </h3> + <p> + Файлы устройств создаются ядром в файловой системе <code class= + "systemitem">devtmpfs</code>. Любой драйвер, которому необходимо + зарегистрировать узел устройства, будет использовать для этого + <code class="systemitem">devtmpfs</code> (через системный драйвер + ядра). Когда экземпляр <code class="systemitem">devtmpfs</code> + монтируется в каталог <code class="filename">/dev</code>, узел + устройства будет доступен в пользовательском пространстве с + фиксированным именем, разрешениями и владельцем. + </p> + <p> + Через некоторое время, ядро отправит uevent в <span class= + "command"><strong>udevd</strong></span>. На основе правил, + которые указанны в файлах в каталогах <code class= + "filename">/etc/udev/rules.d</code>, <code class= + "filename">/lib/udev/rules.d</code>, и <code class= + "filename">/run/udev/rules.d</code>, <span class= + "command"><strong>udevd</strong></span> создаст дополнительные + символические ссылки на узлы устройств, или сменит разрешения, + владельца или группу, или изменит запись (имя) во внутренней базе + данных <span class="command"><strong>udevd</strong></span> для + этого объекта. + </p> + <p> + Правила в этих трёх каталогах пронумерованы и используются + совместно. Если <span class= + "command"><strong>udevd</strong></span> не может найти правило + для устройства, он оставит права доступа и владельца на + <code class="systemitem">devtmpfs</code>, которые были + установлены изначально. + </p> + </div> + <div class="sect3"> + <h3 class="sect3"> + <a id="module-loading" name="module-loading"></a>9.3.2.3. + Загрузка модуля + </h3> + <p> + Драйверы устройств, скомпилированные в виде модулей ядра могут + содержать встроенные псевдонимы. Псевдонимы можно увидеть + просмотрев вывод программы <span class= + "command"><strong>modinfo</strong></span>, обычно они связаны со + специфичными для шины идентификаторами устройств, которые + поддерживается модулем. Например, драйвер <span class= + "emphasis"><em>snd-fm801</em></span> подерживает PCI устройства с + идентификатором поставщика 0x1319 и идентификатором устройства + 0x0801, и имеет псевдоним <code class= + "literal">pci:v00001319d00000801sv*sd*bc04sc01i*</code>. Для + большинства устройств, драйвер шины экспортирует псевдонимы + драйвера, которые будет обрабатывать устройство через + <code class="systemitem">sysfs</code>. Например, файл + <code class="filename">/sys/bus/pci/devices/0000:00:0d.0/modalias</code> + может содержать строку <code class= + "literal">pci:v00001319d00000801sv00001319sd00001319bc04sc01i00</code>. + Правила по умолчанию, которые предоставлены Udev, заставят + <span class="command"><strong>udevd</strong></span> вызвать + <span class="command"><strong>/sbin/modprobe</strong></span> с + содержимым, которое находится в значении переменной окружения + <code class="envar">MODALIAS</code> uevent (которое должно + совпадать с содержимым файла <code class= + "filename">modalias</code> в sysfs), тем самым загружая все + модули, чьи псевдонимы совпадают в строке после расширения + подстановочных знаков + </p> + <p> + В указанном примере, это означает, что в дополнение к + <span class="emphasis"><em>snd-fm801</em></span> будет загружен + устаревший (и нежелательный) драйвер <span class= + "emphasis"><em>forte</em></span>, если он будет доступен. Ниже + приведены способы, как можно предотвратить загрузку нежелательных + драйверов. + </p> + <p> + Само ядро также способно загружать модули для сетевых протоколов, + файловых систем и поддержки NLS по запросу. + </p> + </div> + <div class="sect3"> + <h3 class="sect3"> + 9.3.2.4. Работа с устройствами с горячей заменой или + динамическими устройствами + </h3> + <p> + При подключении устройства, например, MP3-плеер, к универсальной + последовательной шине (USB), ядро распознает, что устройство + подключено, и генерирует событие uevent. Затем это событие + обрабатывается <span class= + "command"><strong>udevd</strong></span>, как было описано выше. + </p> + </div> + </div> + <div class="sect2" lang="ru" xml:lang="ru"> + <h2 class="sect2"> + 9.3.3. Проблемы с загрузкой модулей и созданием устройств + </h2> + <p> + Существует несколько возможных проблем, связанных с автоматическим + созданием узлов устройств. + </p> + <div class="sect3"> + <h3 class="sect3"> + 9.3.3.1. Модуль ядра не загружается автоматически + </h3> + <p> + Udev загрузит модуль только в том случае, если у него есть + псевдоним, специфичный для шины, и драйвер шины правильно + экспортирует необходимые псевдонимы в <code class= + "systemitem">sysfs</code>. В других случаях следует организовать + загрузку модуля иными способами. Известно, что, начиная с версии + Linux-6.7.4, udev, выполняет загрузку правильно написанных + драйверов для INPUT, IDE, PCI, USB, SCSI, SERIO, и FireWire + устройств. + </p> + <p> + Чтобы определить, имеет ли требуемый драйвер устройства + необходимую поддержку Udev, запустите <span class= + "command"><strong>modinfo</strong></span> с именем модуля в + качестве аргумента. Далее, попробуйте найти каталог устройства в + <code class="filename">/sys/bus</code> и проверьте, есть ли там + файл <code class="filename">modalias</code>. + </p> + <p> + Если файл <code class="filename">modalias</code> существует в + <code class="systemitem">sysfs</code>, то драйвер, который + поддерживает устройство, может обращаться к нему напрямую, но не + имеет псевдонима, это ошибка в драйвере. Загрузите драйвер без + помощи Udev и ожидайте, что проблема будет исправлена позднее. + </p> + <p> + Если же в каталоге <code class="filename">/sys/bus</code> нет + файла <code class="filename">modalias</code>, это означает, что + разработчики ядра еще не добавили поддержку <code class= + "filename">modalias</code> к этому типу шины. В Linux-6.7.4 это + относится к шиной ISA. Ожидайте, что эта проблема будет + исправлена в более поздних версиях ядра. + </p> + <p> + Udev не предназначен для загрузки драйверов <span class= + "quote">«<span class="quote">обёрток</span>»</span>, таких как + <span class="emphasis"><em>snd-pcm-oss</em></span> и не + аппаратных драйверов, например, <span class= + "emphasis"><em>loop</em></span>. + </p> + </div> + <div class="sect3"> + <h3 class="sect3"> + 9.3.3.2. Модуль ядра не загружается автоматически и Udev не + предназначен для его загрузки + </h3> + <p> + Если модуль <span class="quote">«<span class= + "quote">обёртка</span>»</span> только расширяет функциональность, + предоставляемую каким-либо другим модулем (например модуль + <span class="emphasis"><em>snd-pcm-oss</em></span> расширяет + функциональность модуля <span class= + "emphasis"><em>snd-pcm</em></span>, давая возможность звуковым + картам быть доступными для OSS приложений), настройте + <span class="command"><strong>modprobe</strong></span> для + загрузки оболочки после того, как Udev загрузит обернутый модуль. + Для этого добавьте строку <span class="quote">«<span class= + "quote">softdep</span>»</span> в файл, который находится в + каталоге <code class="filename">/etc/modprobe.d/<em class= + "replaceable"><code><filename></code></em>.conf</code>. + Например: + </p> + <pre class="screen"><code class= + "literal">softdep snd-pcm post: snd-pcm-oss</code></pre> + <p> + Обратите внимание, что команда <span class="quote">«<span class= + "quote">softdep</span>»</span> разрешает добавлять <code class= + "literal">pre:</code> зависимости, или одновременно <code class= + "literal">pre:</code> и <code class="literal">post:</code> + зависимости. Обратитесь к документации <a class="ulink" href= + "https://man.archlinux.org/man/modprobe.d.5">modprobe.d(5)</a> + для изучения синтаксиса и возможностей <span class= + "quote">«<span class="quote">softdep</span>»</span>. + </p> + <p> + Если рассматриваемый модуль не является обёрткой, и полезен сам + по себе, настройте загрузочный скрипт <span class= + "command"><strong>modules</strong></span>, чтобы он + инициализировался при загрузке системы. Для этого добавьте имя + модуля в файл <code class= + "filename">/etc/sysconfig/modules</code> в отдельной строке. Этот + способ сработает и для модулей-обёрток, но не является + оптимальным. + </p> + </div> + <div class="sect3"> + <h3 class="sect3"> + 9.3.3.3. Udev загружает какой-то нежелательный модуль + </h3> + <p> + Либо не создавайте модуль, либо занесите его в черный список в + файле <code class= + "filename">/etc/modprobe.d/blacklist.conf</code>, как это сделано + с модулем <span class="emphasis"><em>forte</em></span> в примере + ниже: + </p> + <pre class="screen"><code class= + "literal">blacklist forte</code></pre> + <p> + Модули, занесенные в черный список, можно загрузить вручную с + помощью явной команды <span class= + "command"><strong>modprobe</strong></span>. + </p> + </div> + <div class="sect3"> + <h3 class="sect3"> + 9.3.3.4. Udev неправильно создает устройство или делает + неправильную символическую ссылку + </h3> + <p> + Это обычно происходит, если правило неожиданно совпадает с другим + устройством. Например, плохо написанное поставщиком оборудования + правило может соответствовать как диску SCSI(искомое устройство), + так и универсальному устройству SCSI (неправильно). Найдите + ошибочное правило и исправьте его с помощью команды <span class= + "command"><strong>udevadm info</strong></span>. + </p> + </div> + <div class="sect3"> + <h3 class="sect3"> + 9.3.3.5. Правило Udev работает ненадежно + </h3> + <p> + Это может быть проявлением предыдущей проблемы. В ином случае, + если правило использует атрибуты файловой системы <code class= + "systemitem">sysfs</code>, то это может быть проблемой + синхронизации ядра, которая будет исправлена в более поздних + версиях ядра. Но вы можете обойти проблему, создав правило, + которое ожидает используемый атрибут <code class= + "systemitem">sysfs</code> и добавляет его к файлу правил + <code class= + "filename">/etc/udev/rules.d/10-wait_for_sysfs.rules</code> + (создайте его, если файл не существует). Пожалуйста, сообщите в + списке рассылки разработчиков LFS, если это решение вам поможет. + </p> + </div> + <div class="sect3"> + <h3 class="sect3"> + 9.3.3.6. Udev не создаёт устройство + </h3> + <p> + Во-первых, убедитесь, что драйвер встроен в ядро или уже загружен + как модуль, и, что udev не создает устройство с неправильным + именем. + </p> + <p> + Если драйвер ядра не экспортирует свои данные в <code class= + "systemitem">sysfs</code>, udev не хватает информации, + необходимой для создания узла устройства. Это, вероятнее всего, + произойдет со сторонними драйверами, которых нет в дереве + исходного кода ядра. Создайте статический узел в каталоге + <code class="filename">/usr/lib/udev/devices</code> с + соответствующими старшим/младшим номерами (смотрите файл + devices.txt в документации к ядру или документации, + предоставленной сторонним поставщиком драйвера). Статический узел + будет скопирован в <code class="filename">/dev</code> с помощью + <span class="command"><strong>udev</strong></span>. + </p> + </div> + <div class="sect3"> + <h3 class="sect3"> + 9.3.3.7. Порядок присвоения имен устройствам меняется случайным + образом после перезагрузки + </h3> + <p> + Это связано с тем, что udev обрабатывает события uevents и + загружает модули параллельно, а значит в непредсказуемом порядке. + Это никогда не будет <span class="quote">«<span class= + "quote">исправлено</span>»</span>. Вы не должны полагаться на то + что имена устройств ядра стабильны. Вместо этого создайте свои + собственные правила, которые делают символические ссылки со + стабильными именами на основе некоторых неизменяемых атрибутов + устройства, таких как серийный номер или вывод различных утилит + *_id, установленных Udev. Смотрите <a class="xref" href= + "symlinks.html" title= + "9.4. Управление устройствами">Раздел 9.4, «Управление + устройствами»</a> и <a class="xref" href="network.html" title= + "9.5. Настройка сети">Раздел 9.5, «Настройка сети»</a> для + примера. + </p> + </div> + </div> + <div class="sect2" lang="ru" xml:lang="ru"> + <h2 class="sect2"> + 9.3.4. Полезная информация + </h2> + <p> + Дополнительную документацию можно получить на следующих сайтах: + </p> + <div class="itemizedlist"> + <ul> + <li class="listitem"> + <p> + Реализация пользовательского пространства в <code class= + "systemitem">devfs</code> <a class="ulink" href= + "http://www.kroah.com/linux/talks/ols_2003_udev_paper/Reprint-Kroah-Hartman-OLS2003.pdf"> + http://www.kroah.com/linux/talks/ols_2003_udev_paper/Reprint-Kroah-Hartman-OLS2003.pdf</a> + </p> + </li> + <li class="listitem"> + <p> + Файловая система <code class="systemitem">sysfs</code> + <a class="ulink" href= + "https://www.kernel.org/pub/linux/kernel/people/mochel/doc/papers/ols-2005/mochel.pdf"> + https://www.kernel.org/pub/linux/kernel/people/mochel/doc/papers/ols-2005/mochel.pdf</a> + </p> + </li> + </ul> + </div> + </div> + </div> + <div class="navfooter"> + <ul> + <li class="prev"> + <a accesskey="p" href="bootscripts.html" title= + "LFS-Bootscripts-20230728">Пред.</a> + <p> + LFS-Bootscripts-20230728 + </p> + </li> + <li class="next"> + <a accesskey="n" href="symlinks.html" title= + "Управление устройствами">След.</a> + <p> + Управление устройствами + </p> + </li> + <li class="up"> + <a accesskey="u" href="chapter09.html" title= + "Глава 9. Системные настройки">Наверх</a> + </li> + <li class="home"> + <a accesskey="h" href="../index.html" title= + "Линукс с нуля - Версия 12.1">Начало</a> + </li> + </ul> + </div> + </body> +</html> |