summaryrefslogtreecommitdiff
path: root/lfs-12.1-sysv/chapter09/udev.html
diff options
context:
space:
mode:
authorSn4il <sn4il@thedroth.rocks>2024-09-02 15:54:35 +0300
committerSn4il <sn4il@thedroth.rocks>2024-09-02 15:54:35 +0300
commit2203e654b389586650d553251b04544a34f189bf (patch)
tree0125b69fc70a2506c53158ba2020993a5b8985b7 /lfs-12.1-sysv/chapter09/udev.html
parent200d528e55ca954d37769f4d143f10c9519b00e7 (diff)
downloadsn4il-site-2203e654b389586650d553251b04544a34f189bf.tar.gz
sn4il-site-2203e654b389586650d553251b04544a34f189bf.zip
LFS 12.2
Diffstat (limited to 'lfs-12.1-sysv/chapter09/udev.html')
-rw-r--r--lfs-12.1-sysv/chapter09/udev.html490
1 files changed, 0 insertions, 490 deletions
diff --git a/lfs-12.1-sysv/chapter09/udev.html b/lfs-12.1-sysv/chapter09/udev.html
deleted file mode 100644
index fdcde06..0000000
--- a/lfs-12.1-sysv/chapter09/udev.html
+++ /dev/null
@@ -1,490 +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 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. Установка базового системного программного обеспечения">Глава&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.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>&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-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>