мета-данные страницы
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| notes:howlinuxworks:vol3 [2026/05/13 12:28] – radi0dev | notes:howlinuxworks:vol3 [2026/05/13 14:53] (текущий) – radi0dev | ||
|---|---|---|---|
| Строка 80: | Строка 80: | ||
| </ | </ | ||
| - | ==== 3.4.4. Виртуальные блочные устройства: | + | ==== 3.4.4 Виртуальные блочные устройства: |
| Используется менеджер **LVM** со сопоставителем устройств (device mapper). Подробнее в главе 4. | Используется менеджер **LVM** со сопоставителем устройств (device mapper). Подробнее в главе 4. | ||
| Строка 186: | Строка 186: | ||
| * **udev и devtmpfs** — современная динамическая система управления устройствами | * **udev и devtmpfs** — современная динамическая система управления устройствами | ||
| + | ===== 3.5 Менеджер устройств udev ===== | ||
| + | |||
| + | Ядро Linux может отправлять уведомления процессу пользовательского пространства, | ||
| + | |||
| + | Файлы устройств необходимы еще на этапе загрузки, | ||
| + | |||
| + | ==== 3.5.1 Файловая система devtmpfs ==== | ||
| + | |||
| + | **devtmpfs** разработана для решения проблемы доступности устройства во время загрузки. Ядро создает файлы устройств по мере необходимости и уведомляет **udevd** о наличии нового устройства. | ||
| + | |||
| + | Получив сигнал, | ||
| + | * Не создает файлы устройств | ||
| + | * Выполняет инициализацию устройства | ||
| + | * Настраивает права доступа | ||
| + | * Уведомляет другие процессы о новых устройствах | ||
| + | * Создает символические ссылки в /dev для идентификации устройств | ||
| + | |||
| + | === Символические ссылки в / | ||
| + | |||
| + | Пример ссылок для типичного диска (подключен в /dev/sda): | ||
| + | |||
| + | <code bash> | ||
| + | $ ls -l / | ||
| + | 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 | ||
| + | </ | ||
| + | |||
| + | Процесс udevd назывет ссылки по типу интерфейса, | ||
| + | |||
| + | > **Примечание: | ||
| + | |||
| + | ==== 3.5.2 Работа и настройка менеджера udevd ==== | ||
| + | |||
| + | === Процесс работы udevd === | ||
| + | |||
| + | 1. Ядро отправляет udevd уведомление о событии (uevent) по внутренней сетевой ссылке | ||
| + | 2. Демон udevd загружает все атрибуты события uevent | ||
| + | 3. Демон udevd анализирует правила, | ||
| + | |||
| + | === Пример события uevent === | ||
| + | |||
| + | <code bash> | ||
| + | ACTION=change | ||
| + | DEVNAME=sde | ||
| + | DEVPATH=/ | ||
| + | DEVTYPE=disk | ||
| + | DISK_MEDIA_CHANGE=1 | ||
| + | MAJOR=8 | ||
| + | MINOR=64 | ||
| + | SEQNUM=2752 | ||
| + | SUBSYSTEM=block | ||
| + | UDEV_LOG=3 | ||
| + | </ | ||
| + | |||
| + | После получения события udevd узнает имя устройства, | ||
| + | |||
| + | === Расположение файлов правил === | ||
| + | |||
| + | ^ Каталог ^ Назначение ^ | ||
| + | | / | ||
| + | | / | ||
| + | |||
| + | === Алгоритм чтения правил udevd === | ||
| + | |||
| + | 1. udevd считывает правила от начала до конца файла | ||
| + | 2. После чтения и выполнения правила udevd продолжает чтение текущего файла для получения следующих применимых правил | ||
| + | 3. Директивы (например, | ||
| + | |||
| + | === Пример правил для ATA === | ||
| + | |||
| + | <code bash> | ||
| + | # ATA | ||
| + | KERNEL==" | ||
| + | ATTRS{vendor}==" | ||
| + | |||
| + | # ATAPI devices (SPC-3 or later) | ||
| + | KERNEL==" | ||
| + | ATTRS{type}==" | ||
| + | </ | ||
| + | |||
| + | Эти правила соответствуют дискам ATA и оптическим носителям через подсистему SCSI. Правила пытаются подобрать устройство, | ||
| + | |||
| + | <code bash> | ||
| + | IMPORT{program}=" | ||
| + | </ | ||
| + | |||
| + | === Команда ata_id === | ||
| + | |||
| + | <code bash> | ||
| + | # / | ||
| + | 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 | ||
| + | </ | ||
| + | |||
| + | Импорт устанавливает переменные окружения из вывода команды. Любое следующее правило теперь распознает **ENV{ID_TYPE}** как диск. | ||
| + | |||
| + | === Условные выражения в правилах === | ||
| + | |||
| + | Важное условие для переменной **ID_SERIAL**: | ||
| + | |||
| + | <code bash> | ||
| + | ENV{ID_SERIAL}!="? | ||
| + | </ | ||
| + | |||
| + | Это выражение истинно, | ||
| + | |||
| + | Цель: запустить процесс ata_id для поиска серийного номера, | ||
| + | |||
| + | === Создание символических ссылок === | ||
| + | |||
| + | Когда **ENV{ID_SERIAL}** установлена, | ||
| + | |||
| + | <code bash> | ||
| + | KERNEL==" | ||
| + | SYMLINK+=" | ||
| + | </ | ||
| + | |||
| + | Директива **SYMLINK+=** добавляет символическую ссылку для обнаруженного устройства. | ||
| + | |||
| + | === Отличие условных выражений от директив === | ||
| + | |||
| + | | **Тип** | **Синтаксис** | **Описание** | | ||
| + | | Условные выражения | == или != | Проверка условий | | ||
| + | | Директивы | = или += или := | Выполнение действий | | ||
| + | |||
| + | |||
| + | ==== 3.5.3 Команда udevadm ==== | ||
| + | |||
| + | **udevadm** - инструмент администрирования udevd для поиска устройств, | ||
| + | |||
| + | Просмотр всех атрибутов udev для устройства: | ||
| + | |||
| + | <code bash> | ||
| + | $ udevadm info --query=all --name=/ | ||
| + | </ | ||
| + | |||
| + | Вывод содержит атрибуты с префиксами: | ||
| + | |||
| + | ^ Префикс ^ Значение ^ | ||
| + | | P: | путь в sysfs | | ||
| + | | N: | имя узла устройства (/dev) | | ||
| + | | S: | символические ссылки | | ||
| + | | E: | дополнительная информация | | ||
| + | |||
| + | ==== 3.5.4 Отслеживание устройств ==== | ||
| + | |||
| + | Мониторинг uevent-событий: | ||
| + | |||
| + | <code bash> | ||
| + | $ udevadm monitor | ||
| + | </ | ||
| + | |||
| + | Вывод показывает события ядра (KERNEL) и обработанные udevd события (UDEV). | ||
| + | |||
| + | **Основные параметры: | ||
| + | |||
| + | ^ Параметр ^ Описание ^ | ||
| + | | --kernel | только события ядра | | ||
| + | | --udev | только события udevd | | ||
| + | | --property | показать все атрибуты события | | ||
| + | | --subsystem-match=SUBSYS | фильтр по подсистеме | | ||
| + | |||
| + | Пример фильтрации по SCSI: | ||
| + | |||
| + | <code bash> | ||
| + | $ udevadm monitor --kernel --subsystem-match=scsi | ||
| + | </ | ||
| + | |||
| + | **Примечание: | ||
| + | |||
| + | ===== 3.6 Подробнее об интерфейсе SCSI и ядре Linux ===== | ||
| + | |||
| + | ==== Архитектура SCSI ==== | ||
| + | |||
| + | Традиционная SCSI конфигурация состоит из хост-адаптера, | ||
| + | |||
| + | **Современные варианты: | ||
| + | * Serial Attached SCSI (SAS) — высокая производительность | ||
| + | * USB-накопители с SCSI командами | ||
| + | * ATAPI (CD/ | ||
| + | * SATA диски — транслируются через libata | ||
| + | |||
| + | ==== Пример: | ||
| + | |||
| + | <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 | ||
| + | </ | ||
| + | |||
| + | **Формат [H: | ||
| + | |||
| + | ^ Позиция ^ Значение ^ | ||
| + | | H | номер хост-адаптера SCSI | | ||
| + | | B | номер шины SCSI | | ||
| + | | T | SCSI-ID устройства (целевой номер) | | ||
| + | | L | LUN (номер логического блока) | | ||
| + | |||
| + | ==== Трёхуровневая архитектура подсистемы SCSI ==== | ||
| + | |||
| + | **Верхний уровень** — обработка операций класса устройств (драйвер **sd** для дисков, | ||
| + | |||
| + | **Средний уровень** — модерирование и маршрутизация сообщений SCSI между верхним и нижним уровнями, | ||
| + | |||
| + | **Нижний уровень** — обработка действий, | ||
| + | |||
| + | **Ключевое правило: | ||
| + | |||
| + | ===== 3.6.1 USB-накопитель и SCSI ===== | ||
| + | |||
| + | USB-накопитель, | ||
| + | |||
| + | **Драйвер USB-накопителя** выступает переводчиком между SCSI и USB протоколами, | ||
| + | |||
| + | Для связи подсистем используется **простой SCSI-мост** (нижний уровень SCSI подключается к драйверу хранения USB-подсистемы). | ||
| + | |||
| + | ===== 3.6.2 Интерфейсы SCSI и ATA ===== | ||
| + | |||
| + | Диски SATA и ATAPI-приводы подключаются к подсистеме SCSI через драйвер-мост **libata**. | ||
| + | |||
| + | ^ Устройство ^ Протокол ^ Сложность ^ | ||
| + | | ATAPI привод (CD/DVD) | SCSI команды в ATA | простая упаковка/ | ||
| + | | Диск SATA | нет SCSI команд | полный перевод команд | | ||
| + | |||
| + | **Аналогия: | ||
| + | |||
| + | ===== 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 | ||
| + | </ | ||
| + | |||
| + | **Причина использования: | ||
| + | |||
| + | ===== 3.6.4 Множественный доступ к одному устройству ===== | ||
| + | |||
| + | Одно физическое устройство может быть доступно через несколько точек входа. | ||
| + | |||
| + | **Пример: | ||
| + | * **sr** (/dev/sr0) — чтение через блочный драйвер | ||
| + | * **sg** (/dev/sg1) — запись через обобщённое SCSI устройство | ||
| + | |||
| + | Такие процессы обычно **не запускаются одновременно** для одного устройства. | ||
| + | |||
| + | **Примечание: | ||