summaryrefslogtreecommitdiff
path: root/lfs-12.2-sysv/chapter09/udev.html
diff options
context:
space:
mode:
Diffstat (limited to 'lfs-12.2-sysv/chapter09/udev.html')
-rw-r--r--lfs-12.2-sysv/chapter09/udev.html490
1 files changed, 490 insertions, 0 deletions
diff --git a/lfs-12.2-sysv/chapter09/udev.html b/lfs-12.2-sysv/chapter09/udev.html
new file mode 100644
index 0000000..82b8bec
--- /dev/null
+++ b/lfs-12.2-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.2">
+ <div class="navheader">
+ <h4>
+ Линукс с нуля - Версия 12.2
+ </h4>
+ <h3>
+ Глава 9. Системные настройки
+ </h3>
+ <ul>
+ <li class="prev">
+ <a accesskey="p" href="bootscripts.html" title=
+ "LFS-Bootscripts-20240825">Пред.</a>
+ <p>
+ LFS-Bootscripts-20240825
+ </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.2">Начало</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. Установка базового системного программного обеспечения">Глава&nbsp;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.10.5, 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.10.5 это
+ относится к шиной 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>&lt;filename&gt;</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. Управление устройствами">Раздел&nbsp;9.4, «Управление
+ устройствами»</a> и <a class="xref" href="network.html" title=
+ "9.5. Настройка сети">Раздел&nbsp;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-20240825">Пред.</a>
+ <p>
+ LFS-Bootscripts-20240825
+ </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.2">Начало</a>
+ </li>
+ </ul>
+ </div>
+ </body>
+</html>