diff options
Diffstat (limited to 'lfs-12.0-sysv/chapter09/udev.html')
-rw-r--r-- | lfs-12.0-sysv/chapter09/udev.html | 489 |
1 files changed, 0 insertions, 489 deletions
diff --git a/lfs-12.0-sysv/chapter09/udev.html b/lfs-12.0-sysv/chapter09/udev.html deleted file mode 100644 index 2cec39d..0000000 --- a/lfs-12.0-sysv/chapter09/udev.html +++ /dev/null @@ -1,489 +0,0 @@ -<!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 V1.79.1" /> - <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.0"> - <div class="navheader"> - <h4> - Линукс с нуля - Версия 12.0 - </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.0">Начало</a> - </li> - </ul> - </div> - <div class="sect1" lang="en" xml:lang="en"> - <h1 class="sect1"> - <a id="ch-config-udev" name="ch-config-udev"></a>9.3. Взаимодействие - с устройствами и модулями - </h1> - <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="en" xml:lang="en"> - <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="en" xml:lang="en"> - <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, и имеет псевдоним <span class="quote">«<span class= - "quote">pci:v00001319d00000801sv*sd*bc04sc01i*</span>»</span>. - Для большинства устройств, драйвер шины экспортирует псевдонимы - драйвера, которые будет обрабатывать устройство через - <code class="systemitem">sysfs</code>. Например, файл - <code class="filename">/sys/bus/pci/devices/0000:00:0d.0/modalias</code> - может содержать строку <span class="quote">«<span class= - "quote">pci:v00001319d00000801sv00001319sd00001319bc04sc01i00</span>»</span>. - Правила по умолчанию, которые предоставлены 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="en" xml:lang="en"> - <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.4.12, 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.4.12 это - относится к шиной 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> - зависимости. Обратитесь к документации <code class= - "filename">modprobe.d(5)</code> для изучения синтаксиса и - возможностей <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="en" xml:lang="en"> - <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.0">Начало</a> - </li> - </ul> - </div> - </body> -</html> |