мета-данные страницы
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| notes:howlinuxworks:vol3 [2026/05/12 18:32] – radi0dev | notes:howlinuxworks:vol3 [2026/05/13 14:53] (текущий) – radi0dev | ||
|---|---|---|---|
| Строка 8: | Строка 8: | ||
| обозначают **block** (блочное устройство), | обозначают **block** (блочное устройство), | ||
| - | * Блочное устройство. Программы получают доступ к данным с блочного устройства фиксированными частями. Устройство sda1 в приведенном ранее примере | + | * Блочное устройство. Программы получают доступ к данным с блочного устройства фиксированными частями. Устройство sda1 в приведенном ранее примере |
| * Символьное устройство. Символьные устройства работают с потоками данных. Вы можете считывать символы с символьных устройств или записывать их на символьные устройства, | * Символьное устройство. Символьные устройства работают с потоками данных. Вы можете считывать символы с символьных устройств или записывать их на символьные устройства, | ||
| * Конвейер. Именованный конвейер по структуре такой же, как символьные устройства, | * Конвейер. Именованный конвейер по структуре такой же, как символьные устройства, | ||
| - | * Сокет. Сокеты | + | * Сокет. Сокеты |
| + | |||
| + | <note important> | ||
| + | Не у всех устройств есть файлы, поскольку интерфейсы ввода-вывода блочных и символьных устройств подходят не во всех случаях. Например, | ||
| + | </ | ||
| + | |||
| + | ===== 3.2 Путь к устройству sysfs ===== | ||
| + | |||
| + | Традиционный каталог Unix /dev удобен для того, чтобы пользовательские процессы ссылались на устройства, | ||
| + | может получить другое имя. | ||
| + | |||
| + | Чтобы обеспечить единообразное представление подключенных устройств на основе их фактических аппаратных атрибутов, | ||
| + | |||
| + | Например, | ||
| + | |||
| + | Файл /dev позволяет пользовательским процессам применять устройство, | ||
| + | |||
| + | В каталоге /sys есть несколько ярлыков. Например, | ||
| + | |||
| + | ===== 3.3 Утилита dd и устройства ===== | ||
| + | |||
| + | Программа dd чрезвычайно полезна в работе с блочными и символьными устройствами. Ее единственная функция заключается в чтении из входного файла или потока и записи в выходной файл или поток с выполнением некоторых преобразований кодирования по мере необходимости. | ||
| + | |||
| + | ^ Параметр ^ Описание ^ | ||
| + | | if=file | Файл ввода (по умолч. stdin) | | ||
| + | | of=file | Файл вывода (по умолч. stdout) | | ||
| + | | bs=size | Размер блока для чтения/ | ||
| + | | ibs=size, obs=size | Размеры блоков ввода и вывода (если разные) | | ||
| + | | count=num | Количество блоков для копирования | | ||
| + | | skip=num | Пропустить первые num блоков входного потока | | ||
| + | |||
| + | |||
| + | ===== 3.4 Имена устройств ===== | ||
| + | |||
| + | Найти имя устройства можно несколькими способами: | ||
| + | * Использовать **udevadm** (см. раздел 3.5) | ||
| + | * Найти в каталоге **/sys** | ||
| + | * Проверить **journalctl -k** или журнал ядра | ||
| + | * Для дисков: | ||
| + | * Выполнить **cat / | ||
| + | |||
| + | Первый метод наиболее надежен, | ||
| + | |||
| + | ==== 3.4.1 Жесткие диски: /dev/sd* ==== | ||
| + | |||
| + | Большинство дисков в Linux именуются с префиксом **sd** (/dev/sda, /dev/sdb и т.д.). «sd» расшифровывается как **SCSI-диск** (Small Computer System Interface). Ядро создает отдельные файлы для разделов (/dev/sda1, / | ||
| + | |||
| + | Список SCSI-устройств: | ||
| + | |||
| + | <code bash> | ||
| + | $ lsscsi | ||
| + | [0:0:0:0] disk ATA WDC WD3200AAJS-2 01.0 /dev/sda | ||
| + | [2:0:0:0] disk FLASH Drive UT_USB20 0.00 /dev/sdb | ||
| + | </ | ||
| + | |||
| + | Система назначает устройства в порядке обнаружения драйверами. **Проблема**: | ||
| + | |||
| + | ==== 3.4.2 Виртуальные диски: /dev/xvd*, /dev/vd* ==== | ||
| + | |||
| + | Дисковые устройства для виртуальных машин (AWS, VirtualBox, Xen). | ||
| + | |||
| + | ==== 3.4.3 Устройства долговременной памяти: | ||
| + | |||
| + | Интерфейс **NVMe** для SSD. Просмотр: | ||
| + | |||
| + | <code bash> | ||
| + | nvme list | ||
| + | </ | ||
| + | |||
| + | ==== 3.4.4 Виртуальные блочные устройства: | ||
| + | |||
| + | Используется менеджер **LVM** со сопоставителем устройств (device mapper). Подробнее в главе 4. | ||
| + | |||
| + | ==== 3.4.5 CD- и DVD-приводы: | ||
| + | |||
| + | Linux распознает оптические накопители как SCSI-устройства (/dev/sr0, /dev/sr1). Для **чтения** используйте /dev/sr*, для **записи** - /dev/sg0. | ||
| + | |||
| + | ==== 3.4.6 Жесткие диски PATA: /dev/hd* ==== | ||
| + | |||
| + | **PATA** - устаревший интерфейс хранения. Устройства /dev/hda, /dev/hdb, /dev/hdc, /dev/hdd используются в старых ядрах Linux и оборудовании. Если диск SATA распознается как PATA-устройство, | ||
| + | |||
| + | ==== 3.4.7 Терминалы: | ||
| + | |||
| + | Терминалы - устройства для передачи символов между процессом пользователя и устройством ввода-вывода. | ||
| + | |||
| + | Большинство современных терминалов - это **псевдотерминальные устройства**, | ||
| + | |||
| + | Основные устройства: | ||
| + | * **/ | ||
| + | * **/ | ||
| + | * **/ | ||
| + | |||
| + | === Режимы отображения и виртуальные консоли === | ||
| + | |||
| + | Linux поддерживает два режима: | ||
| + | |||
| + | **В текстовом режиме** переключение между консолями: | ||
| + | * **Alt+F1** → /dev/tty1 | ||
| + | * **Alt+F2** → /dev/tty2 и т. д. | ||
| + | |||
| + | **В графическом режиме** требуется **Ctrl+Alt+Fn** для переключения, | ||
| + | |||
| + | Если переключение не работает, | ||
| + | |||
| + | <code bash> | ||
| + | # chvt 1 | ||
| + | </ | ||
| + | |||
| + | ==== 3.4.8 Последовательные порты: /dev/ttyS*, / | ||
| + | |||
| + | ^ Устройство Windows ^ Устройство Linux ^ Назначение ^ | ||
| + | | COM1 | /dev/ttyS0 | Последовательный порт RS-232 | | ||
| + | | COM2 | /dev/ttyS1 | Последовательный порт RS-232 | | ||
| + | | USB-адаптер | / | ||
| + | | USB-адаптер ACM | / | ||
| + | |||
| + | Для подключения используйте команду screen: | ||
| + | |||
| + | <code bash> | ||
| + | screen / | ||
| + | </ | ||
| + | |||
| + | Может потребоваться добавить пользователя в группу dialout для доступа к портам. Полезно для платформ на микроконтроллерах (Arduino, CircuitPython и т. д.). | ||
| + | |||
| + | ==== 3.4.9 Параллельные порты: /dev/lp0 и /dev/lp1 ==== | ||
| + | |||
| + | Устаревший интерфейс, | ||
| + | |||
| + | ^ Устройство Linux ^ Аналог Windows ^ | ||
| + | | /dev/lp0 | LPT1 | | ||
| + | | /dev/lp1 | LPT2 | | ||
| + | |||
| + | Можно отправлять файлы непосредственно на параллельный порт с помощью команды **cat**, но может потребоваться подать страницу или перезагрузить принтер. Сервер печати, | ||
| + | |||
| + | Двунаправленные параллельные порты: **/ | ||
| + | |||
| + | ==== 3.4.10 Аудиоустройства: | ||
| + | |||
| + | Linux имеет два набора аудиоустройств: | ||
| + | |||
| + | ^ Система ^ Описание ^ | ||
| + | | **ALSA** (Advanced Linux Sound Architecture) | Устройства в /dev/snd, сложны для прямого использования | | ||
| + | | **OSS** (Open Sound System) | Более старая открытая звуковая система | | ||
| + | |||
| + | Системы Linux с ALSA поддерживают обратную совместимость OSS (при загрузке поддержки в ядре). | ||
| + | |||
| + | С драйвером **dsp** OSS возможны элементарные операции. Например, | ||
| + | |||
| + | <code bash> | ||
| + | cat file.wav > /dev/dsp | ||
| + | </ | ||
| + | |||
| + | Однако могут возникнуть проблемы с несоответствием частоты, | ||
| + | |||
| + | > **Примечание: | ||
| + | |||
| + | ==== 3.4.11 Создание файла устройства ==== | ||
| + | |||
| + | В новых системах Linux файлы устройств создаются автоматически утилитами **devtmpfs** и **udev** (см. раздел 3.5). Однако полезно знать, как создать устройство вручную (редко требуется для именованных конвейеров или файлов сокетов). | ||
| + | |||
| + | Команда **mknod** создает одно устройство. Необходимо знать его имя, основной и второстепенный номера: | ||
| + | |||
| + | <code bash> | ||
| + | # mknod /dev/sda1 b 8 1 | ||
| + | </ | ||
| + | |||
| + | Параметр `b 8 1` указывает на **блочное устройство** с основным номером 8 и второстепенным номером 1. Для символьных устройств используйте параметр `c` вместо `b` (для именованных конвейеров опустите номера). | ||
| + | |||
| + | === История управления устройствами === | ||
| + | |||
| + | В старых версиях Unix и Linux каталог /dev требовал ручного обслуживания. С каждым обновлением ядра возникали новые номера устройств, | ||
| + | |||
| + | * **devfs** — реализация /dev в пространстве ядра (имела ограничения) | ||
| + | * **udev и devtmpfs** — современная динамическая система управления устройствами | ||
| + | |||
| + | ===== 3.5 Менеджер устройств udev ===== | ||
| + | |||
| + | Ядро Linux может отправлять уведомления процессу пользовательского пространства, | ||
| + | |||
| + | Файлы устройств необходимы еще на этапе загрузки, | ||
| + | |||
| + | ==== 3.5.1 Файловая система devtmpfs ==== | ||
| + | |||
| + | **devtmpfs** разработана для решения проблемы доступности устройства во время загрузки. Ядро создает файлы устройств по мере необходимости и уведомляет **udevd** о наличии нового устройства. | ||
| + | |||
| + | Получив сигнал, | ||
| + | * Не создает файлы устройств | ||
| + | * Выполняет инициализацию устройства | ||
| + | * Настраивает права доступа | ||
| + | * Уведомляет другие процессы о новых устройствах | ||
| + | * Создает символические ссылки в /dev для идентификации устройств | ||
| + | |||
| + | === Символические ссылки в / | ||
| + | |||
| + | Пример ссылок для типичного диска (подключен в / | ||
| + | |||
| + | <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 -> ../ | ||
| + | lrwxrwxrwx 1 root root 10 Jul 26 10:23 scsi-SATA_WDC_WD3200AAJS-_WD-WMAV2FU80671-part2 -> ../ | ||
| + | lrwxrwxrwx 1 root root 10 Jul 26 10:23 scsi-SATA_WDC_WD3200AAJS-_WD-WMAV2FU80671-part5 -> ../ | ||
| + | </ | ||
| + | |||
| + | Процесс 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 устройство | ||
| + | |||
| + | Такие процессы обычно **не запускаются одновременно** для одного устройства. | ||
| + | |||
| + | **Примечание: | ||