мета-данные страницы
  •  

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
notes:howlinuxworks:vol3 [2026/05/13 12:28] radi0devnotes:howlinuxworks:vol3 [2026/05/13 14:53] (текущий) radi0dev
Строка 80: Строка 80:
 </code> </code>
  
-==== 3.4.4Виртуальные блочные устройства: /dev/dm-*, /dev/mapper/* ====+==== 3.4.4 Виртуальные блочные устройства: /dev/dm-*, /dev/mapper/* ====
  
 Используется менеджер **LVM** со сопоставителем устройств (device mapper). Подробнее в главе 4. Используется менеджер **LVM** со сопоставителем устройств (device mapper). Подробнее в главе 4.
Строка 186: Строка 186:
   * **udev и devtmpfs** — современная динамическая система управления устройствами   * **udev и devtmpfs** — современная динамическая система управления устройствами
  
 +===== 3.5 Менеджер устройств udev =====
 +
 +Ядро Linux может отправлять уведомления процессу пользовательского пространства, называемому **udevd**, при обнаружении нового устройства в системе (например, когда кто-то подключает USB-накопитель). Процесс udevd может изучить характеристики нового устройства, создать его файл, а затем выполнить любую инициализацию устройства.
 +
 +Файлы устройств необходимы еще на этапе загрузки, так что udevd не должен зависеть от каких-либо устройств. Udevd должна инициализировать устройства очень быстро, что бы остальная система не ждала её во время загрузки.
 +
 +==== 3.5.1 Файловая система devtmpfs ====
 +
 +**devtmpfs** разработана для решения проблемы доступности устройства во время загрузки. Ядро создает файлы устройств по мере необходимости и уведомляет **udevd** о наличии нового устройства.
 +
 +Получив сигнал, udevd:
 +  * Не создает файлы устройств
 +  * Выполняет инициализацию устройства
 +  * Настраивает права доступа
 +  * Уведомляет другие процессы о новых устройствах
 +  * Создает символические ссылки в /dev для идентификации устройств
 +
 +=== Символические ссылки в /dev/disk/by-id ===
 +
 +Пример ссылок для типичного диска (подключен в /dev/sda):
 +
 +<code bash>
 +$ ls -l /dev/disk/by-id
 +lrwxrwxrwx 1 root root 9 Jul 26 10:23 scsi-SATA_WDC_WD3200AAJS-_WD-WMAV2FU80671 -> ../../sda
 +lrwxrwxrwx 1 root root 10 Jul 26 10:23 scsi-SATA_WDC_WD3200AAJS-_WD-WMAV2FU80671-part1 -> ../../sda1
 +lrwxrwxrwx 1 root root 10 Jul 26 10:23 scsi-SATA_WDC_WD3200AAJS-_WD-WMAV2FU80671-part2 -> ../../sda2
 +lrwxrwxrwx 1 root root 10 Jul 26 10:23 scsi-SATA_WDC_WD3200AAJS-_WD-WMAV2FU80671-part5 -> ../../sda5
 +</code>
 +
 +Процесс udevd назывет ссылки по типу интерфейса, информации о производителе, модели, серийному номеру и разделу.
 +
 +> **Примечание:** Часть **tmp** в devtmpfs указывает на то, что файловая система находится в оперативной памяти с возможностью чтения/записи процессами пользовательского пространства. Это позволяет udevd создавать символические ссылки.
 +
 +==== 3.5.2 Работа и настройка менеджера udevd ====
 +
 +=== Процесс работы udevd ===
 +
 +  1. Ядро отправляет udevd уведомление о событии (uevent) по внутренней сетевой ссылке
 +  2. Демон udevd загружает все атрибуты события uevent
 +  3. Демон udevd анализирует правила, фильтрует и обновляет событие, выполняет действия и устанавливает атрибуты
 +
 +=== Пример события uevent ===
 +
 +<code bash>
 +ACTION=change
 +DEVNAME=sde
 +DEVPATH=/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/host4/target4:0:0/4:0:0:3/block/sde
 +DEVTYPE=disk
 +DISK_MEDIA_CHANGE=1
 +MAJOR=8
 +MINOR=64
 +SEQNUM=2752
 +SUBSYSTEM=block
 +UDEV_LOG=3
 +</code>
 +
 +После получения события udevd узнает имя устройства, путь sysfs и атрибуты, затем готов к обработке правил.
 +
 +=== Расположение файлов правил ===
 +
 +^ Каталог ^ Назначение ^
 +| /lib/udev/rules.d | Правила по умолчанию |
 +| /etc/udev/rules.d | Переопределения пользователя |
 +
 +=== Алгоритм чтения правил udevd ===
 +
 +  1. udevd считывает правила от начала до конца файла
 +  2. После чтения и выполнения правила udevd продолжает чтение текущего файла для получения следующих применимых правил
 +  3. Директивы (например, GOTO) позволяют пропускать части правил (обычно в верхней части файла)
 +
 +=== Пример правил для ATA ===
 +
 +<code bash>
 +# ATA
 +KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="scsi",
 +ATTRS{vendor}=="ATA", IMPORT{program}="ata_id --export $devnode"
 +
 +# ATAPI devices (SPC-3 or later)
 +KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="scsi",
 +ATTRS{type}=="5",ATTRS{scsi_level}=="[6-9]*", IMPORT{program}="ata_id --export $devnode"
 +</code>
 +
 +Эти правила соответствуют дискам ATA и оптическим носителям через подсистему SCSI. Правила пытаются подобрать устройство, начинающееся с **sd** или **sr** без номера, с подсистемой SCSI и другими атрибутами. При истинности всех условий выполняется директива:
 +
 +<code bash>
 +IMPORT{program}="ata_id --export $devnode"
 +</code>
 +
 +=== Команда ata_id ===
 +
 +<code bash>
 +# /lib/udev/ata_id --export /dev/sda
 +ID_ATA=1
 +ID_TYPE=disk
 +ID_BUS=ata
 +ID_MODEL=WDC_WD3200AAJS-22L7A0
 +ID_MODEL_ENC=WDC\x20WD3200AAJS22L7A0\x20...\x20\x20
 +ID_REVISION=01.03E10
 +ID_SERIAL=WDC_WD3200AAJS-22L7A0_WD-WMAV2FU80671
 +</code>
 +
 +Импорт устанавливает переменные окружения из вывода команды. Любое следующее правило теперь распознает **ENV{ID_TYPE}** как диск.
 +
 +=== Условные выражения в правилах ===
 +
 +Важное условие для переменной **ID_SERIAL**:
 +
 +<code bash>
 +ENV{ID_SERIAL}!="?*"
 +</code>
 +
 +Это выражение истинно, если **ID_SERIAL** не задана. Если значение уже установлено, условие ложно и udevd пропускает текущее правило.
 +
 +Цель: запустить процесс ata_id для поиска серийного номера, затем добавить атрибуты в рабочую копию uevent.
 +
 +=== Создание символических ссылок ===
 +
 +Когда **ENV{ID_SERIAL}** установлена, используется правило для создания ссылок:
 +
 +<code bash>
 +KERNEL=="sd*|sr*|cciss*", ENV{DEVTYPE}=="disk", ENV{ID_SERIAL}=="?*",
 +SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}"
 +</code>
 +
 +Директива **SYMLINK+=** добавляет символическую ссылку для обнаруженного устройства.
 +
 +=== Отличие условных выражений от директив ===
 +
 +| **Тип** | **Синтаксис** | **Описание** |
 +| Условные выражения | == или != | Проверка условий |
 +| Директивы | = или += или := | Выполнение действий |
 +
 +
 +==== 3.5.3 Команда udevadm ====
 +
 +**udevadm** - инструмент администрирования udevd для поиска устройств, изучения их атрибутов и мониторинга uevent-событий из ядра.
 +
 +Просмотр всех атрибутов udev для устройства:
 +
 +<code bash>
 +$ udevadm info --query=all --name=/dev/sda
 +</code>
 +
 +Вывод содержит атрибуты с префиксами:
 +
 +^ Префикс ^ Значение ^
 +| P: | путь в sysfs |
 +| N: | имя узла устройства (/dev) |
 +| S: | символические ссылки |
 +| E: | дополнительная информация |
 +
 +==== 3.5.4 Отслеживание устройств ====
 +
 +Мониторинг uevent-событий:
 +
 +<code bash>
 +$ udevadm monitor
 +</code>
 +
 +Вывод показывает события ядра (KERNEL) и обработанные udevd события (UDEV).
 +
 +**Основные параметры:**
 +
 +^ Параметр ^ Описание ^
 +| --kernel | только события ядра |
 +| --udev | только события udevd |
 +| --property | показать все атрибуты события |
 +| --subsystem-match=SUBSYS | фильтр по подсистеме |
 +
 +Пример фильтрации по SCSI:
 +
 +<code bash>
 +$ udevadm monitor --kernel --subsystem-match=scsi
 +</code>
 +
 +**Примечание:** Демон **udisksd** автоматически присоединяет диски и уведомляет процессы о новых устройствах.
 +
 +===== 3.6 Подробнее об интерфейсе SCSI и ядре Linux =====
 +
 +==== Архитектура SCSI ====
 +
 +Традиционная SCSI конфигурация состоит из хост-адаптера, связанного с цепочкой устройств на шине SCSI. Каждое устройство имеет **SCSI ID** (8 или 16 идентификаторов в зависимости от версии).
 +
 +**Современные варианты:**
 +  * Serial Attached SCSI (SAS) — высокая производительность
 +  * USB-накопители с SCSI командами
 +  * ATAPI (CD/DVD-приводы) — версия SCSI команд
 +  * SATA диски — транслируются через libata
 +
 +==== Пример: просмотр устройств SCSI ====
 +
 +<code bash>
 +$ lsscsi
 +[0:0:0:0] disk ATA WDC WD3200AAJS-2 01.0 /dev/sda
 +[1:0:0:0] cd/dvd Slimtype DVD A DS8A5SH XA15 /dev/sr0
 +[2:0:0:0] disk USB2.0 CardReader CF 0100 /dev/sdb
 +[3:0:0:0] disk FLASH Drive UT_USB20 0.00 /dev/sdf
 +</code>
 +
 +**Формат [H:B:T:L]:**
 +
 +^ Позиция ^ Значение ^
 +| H | номер хост-адаптера SCSI |
 +| B | номер шины SCSI |
 +| T | SCSI-ID устройства (целевой номер) |
 +| L | LUN (номер логического блока) |
 +
 +==== Трёхуровневая архитектура подсистемы SCSI ====
 +
 +**Верхний уровень** — обработка операций класса устройств (драйвер **sd** для дисков, преобразует запросы ядра в SCSI команды).
 +
 +**Средний уровень** — модерирование и маршрутизация сообщений SCSI между верхним и нижним уровнями, отслеживание шин и устройств.
 +
 +**Нижний уровень** — обработка действий, зависящих от оборудования (отправка/приём SCSI сообщений адаптерам хоста).
 +
 +**Ключевое правило:** для каждого файла устройства ядро использует один драйвер верхнего и один драйвер нижнего уровня. Пример: для /dev/sda используются драйвер **sd** (верхний) и драйвер **ATA bridge** (нижний).
 +
 +===== 3.6.1 USB-накопитель и SCSI =====
 +
 +USB-накопитель, хотя и понимает команды SCSI, требует для взаимодействия с ядром трёхуровневую подсистему USB (подобную подсистеме SCSI): класс устройств, управление шиной, хост-контроллеры.
 +
 +**Драйвер USB-накопителя** выступает переводчиком между SCSI и USB протоколами, переупаковывая команды SCSI в USB-сообщения.
 +
 +Для связи подсистем используется **простой SCSI-мост** (нижний уровень SCSI подключается к драйверу хранения USB-подсистемы).
 +
 +===== 3.6.2 Интерфейсы SCSI и ATA =====
 +
 +Диски SATA и ATAPI-приводы подключаются к подсистеме SCSI через драйвер-мост **libata**.
 +
 +^ Устройство ^ Протокол ^ Сложность ^
 +| ATAPI привод (CD/DVD) | SCSI команды в ATA | простая упаковка/распаковка |
 +| Диск SATA | нет SCSI команд | полный перевод команд |
 +
 +**Аналогия:** ATAPI — как переписывание английского текста (синтаксическая задача), SATA диск — как перевод с немецкого (требует понимания смысла).
 +
 +===== 3.6.3 Обобщенные устройства SCSI =====
 +
 +Обобщённые устройства SCSI (/dev/sg*) позволяют пользовательским процессам напрямую отправлять команды SCSI, минуя драйверы классов устройств.
 +
 +Просмотр обобщённых устройств:
 +
 +<code bash>
 +$ lsscsi -g
 +[0:0:0:0] disk ATA WDC WD3200AAJS-2 01.0 /dev/sda /dev/sg0
 +[1:0:0:0] cd/dvd Slimtype DVD A DS8A5SH XA15 /dev/sr0 /dev/sg1
 +</code>
 +
 +**Причина использования:** сложные операции (например, запись на CD/DVD) выполняются в пользовательском пространстве через sg-устройства, а не в ядре. Это упрощает разработку и поддержку.
 +
 +===== 3.6.4 Множественный доступ к одному устройству =====
 +
 +Одно физическое устройство может быть доступно через несколько точек входа.
 +
 +**Пример:** оптический привод:
 +  * **sr** (/dev/sr0) — чтение через блочный драйвер
 +  * **sg** (/dev/sg1) — запись через обобщённое SCSI устройство
 +
 +Такие процессы обычно **не запускаются одновременно** для одного устройства.
 +
 +**Примечание:** жёсткие диски имеют ещё больше слоёв доступа поверх блочных устройств (описано далее).