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

Это старая версия документа!


Глава 3: Устройства

3.1 Файлы устройств

linux использует тот же дизайн для файлов устройств, что и другие системы Unix: помещает спеицальные файлы устрйоств в /dev. Такие файлы называются узлами устройств. Хотя не все возможности устройств доступны через файловый ввод-вывод.

Первый символ в выводе ls -l /dev - символ типа файла. Если это символы b, c, p или s, то файл является устройством. Эти буквы обозначают block (блочное устройство), character (символьное устройство), pipe (конвейер) и socket (сокет) соответственно.

  • Блочное устройство. Программы получают доступ к данным с блочного устройства фиксированными частями. Устройство sda1 в приведенном ранее примере - это дисковое устройство, тип блочного устройства. Диски можно легко разбить на блоки данных. Поскольку общий размер блочного устройства фиксирован и его легко индексировать, процессы имеют быстрый произвольный доступ к любому блоку в устройстве с помощью ядра.
  • Символьное устройство. Символьные устройства работают с потоками данных. Вы можете считывать символы с символьных устройств или записывать их на символьные устройства, как было показано ранее на устройстве /dev/null. Символьные устройства не имеют размера: когда вы читаете из одного из них или записываете в него, ядро обычно выполняет на нем операцию чтения или записи. Принтеры, непосредственно подключенные к компьютеру, представляются символьными устройствами. Важно отметить, что во время взаимодействия с символьным устройством ядро не может создавать резервные копии и повторно выполнять проверку после передачи данных устройству или процессу.
  • Конвейер. Именованный конвейер по структуре такой же, как символьные устройства, но с другим процессом на другом конце потока ввода-вывода вместо драйвера ядра.
  • Сокет. Сокеты - это специальные интерфейсы, которые используются для межпроцессной связи. Они часто находятся за пределами каталога /dev. Файлы сокетов представляют собой доменные сокеты Unix (подробнее о них вы узнаете в главе 10).
Не у всех устройств есть файлы, поскольку интерфейсы ввода-вывода блочных и символьных устройств подходят не во всех случаях. Например, сетевые интерфейсы не содержат файлов устройств. Теоретически возможно взаимодействовать с сетевым интерфейсом с помощью одного символьного устройства, но поскольку это проблематично, ядро предлагает другие интерфейсы ввода-вывода.

3.2 Путь к устройству sysfs

Традиционный каталог Unix /dev удобен для того, чтобы пользовательские процессы ссылались на устройства, поддерживаемые ядром, и взаимодействовали с ними, но это очень упрощенная схема. Имя устройства в /dev немногое говорит об устройстве. Другая проблема заключается в том, что ядро назначает устройства в том порядке, в котором они найдены, поэтому между перезагрузками устройство может получить другое имя.

Чтобы обеспечить единообразное представление подключенных устройств на основе их фактических аппаратных атрибутов, ядро Linux предлагает интерфейс sysfs для обозначения файлов и каталогов. Базовый путь для устройств - /sys/devices.

Например, жесткий диск SATA в /dev/sda может иметь следующий путь в интерфейсе sysfs: /sys/devices/pci0000:00/0000:00:17.0/ata3/host0/target0:0:0/0:0:0:0/block/sda

Файл /dev позволяет пользовательским процессам применять устройство, в то время как путь /sys/devices задействуется для просмотра информации и управления устройством.

В каталоге /sys есть несколько ярлыков. Например, /sys/block должен содержать все блочные устройства, доступные в системе. Однако это всего лишь символические ссылки: лучше запустить команду ls -l /sys/block, чтобы выявить истинные sysfs пути.

3.3 Утилита dd и устройства

Программа dd чрезвычайно полезна в работе с блочными и символьными устройствами. Ее единственная функция заключается в чтении из входного файла или потока и записи в выходной файл или поток с выполнением некоторых преобразований кодирования по мере необходимости.

Параметр Описание
if=file Файл ввода (по умолч. stdin)
of=file Файл вывода (по умолч. stdout)
bs=size Размер блока для чтения/записи. Суффиксы: b (512 байт), k (1024 байта)
ibs=size, obs=size Размеры блоков ввода и вывода (если разные)
count=num Количество блоков для копирования
skip=num Пропустить первые num блоков входного потока

3.4 Имена устройств

Найти имя устройства можно несколькими способами:

  • Использовать udevadm (см. раздел 3.5)
  • Найти в каталоге /sys
  • Проверить journalctl -k или журнал ядра
  • Для дисков: mount
  • Выполнить cat /proc/devices для просмотра драйверов

Первый метод наиболее надежен, но требует udev. В следующих разделах рассмотрены основные типы устройств Linux.

3.4.1 Жесткие диски: /dev/sd*

Большинство дисков в Linux именуются с префиксом sd (/dev/sda, /dev/sdb и т.д.). «sd» расшифровывается как SCSI-диск (Small Computer System Interface). Ядро создает отдельные файлы для разделов (/dev/sda1, /dev/sda2).

Список SCSI-устройств:

$ 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

Система назначает устройства в порядке обнаружения драйверами. Проблема: при удалении диска остальные переименовываются (/dev/sdc становится /dev/sdb). Решение: UUID или LVM (Logical Volume Manager).

3.4.2 Виртуальные диски: /dev/xvd*, /dev/vd*

Дисковые устройства для виртуальных машин (AWS, VirtualBox, Xen).

3.4.3 Устройства долговременной памяти: /dev/nvme*

Интерфейс NVMe для SSD. Просмотр:

nvme list

3.4.4. Виртуальные блочные устройства: /dev/dm-*, /dev/mapper/*

Используется менеджер LVM со сопоставителем устройств (device mapper). Подробнее в главе 4.

3.4.5 CD- и DVD-приводы: /dev/sr*

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-устройство, это означает, что диск работает в режиме совместимости с пониженной производительностью. Проверьте BIOS для переключения контроллера SATA в собственный режим.

3.4.7 Терминалы: /dev/tty*, /dev/pts/* и /dev/tty

Терминалы - устройства для передачи символов между процессом пользователя и устройством ввода-вывода.

Большинство современных терминалов - это псевдотерминальные устройства, эмулирующие реальные терминалы через интерфейс ввода-вывода ядра (окно оболочки).

Основные устройства:

  • /dev/tty1 - первая виртуальная консоль
  • /dev/pts/0 - первое псевдотерминальное устройство (/dev/pts - выделенная файловая система)
  • /dev/tty - управляющий терминал текущего процесса

Режимы отображения и виртуальные консоли

Linux поддерживает два режима: текстовый и графический. Каждая виртуальная консоль может работать в любом режиме.

В текстовом режиме переключение между консолями:

  • Alt+F1 → /dev/tty1
  • Alt+F2 → /dev/tty2 и т. д.

В графическом режиме требуется Ctrl+Alt+Fn для переключения, или Ctrl+Alt+F1 для перехода в текстовую консоль.

Если переключение не работает, используйте команду:

# chvt 1

3.4.8 Последовательные порты: /dev/ttyS*, /dev/ttyUSB*, /dev/ttyACM*

Устройство Windows Устройство Linux Назначение
COM1 /dev/ttyS0 Последовательный порт RS-232
COM2 /dev/ttyS1 Последовательный порт RS-232
USB-адаптер /dev/ttyUSB0, /dev/ttyUSB1… USB последовательный адаптер
USB-адаптер ACM /dev/ttyACM0, /dev/ttyACM1… USB ACM-устройство

Для подключения используйте команду screen:

screen /dev/ttyS0

Может потребоваться добавить пользователя в группу dialout для доступа к портам. Полезно для платформ на микроконтроллерах (Arduino, CircuitPython и т. д.).

3.4.9 Параллельные порты: /dev/lp0 и /dev/lp1

Устаревший интерфейс, заменен USB и сетями. Однонаправленные параллельные портовые устройства:

Устройство Linux Аналог Windows
/dev/lp0 LPT1
/dev/lp1 LPT2

Можно отправлять файлы непосредственно на параллельный порт с помощью команды cat, но может потребоваться подать страницу или перезагрузить принтер. Сервер печати, такой как CUPS, эффективнее справляется при взаимодействии с принтером.

Двунаправленные параллельные порты: /dev/parport0 и /dev/parport1.

3.4.10 Аудиоустройства: /dev/snd/*, /dev/dsp, /dev/audio и другие

Linux имеет два набора аудиоустройств:

Система Описание
ALSA (Advanced Linux Sound Architecture) Устройства в /dev/snd, сложны для прямого использования
OSS (Open Sound System) Более старая открытая звуковая система

Системы Linux с ALSA поддерживают обратную совместимость OSS (при загрузке поддержки в ядре).

С драйвером dsp OSS возможны элементарные операции. Например, воспроизведение WAV-файла:

cat file.wav > /dev/dsp

Однако могут возникнуть проблемы с несоответствием частоты, и устройство часто уже занято.

Примечание: Звуки в Linux — это запутанная история множества слоев. Помимо устройств уровня ядра, в пользовательском пространстве работают серверы (pulse-audio), управляющие звуком из разных источников и выступающие посредниками между звуковыми устройствами и процессами пользовательского пространства.

3.4.11 Создание файла устройства

В новых системах Linux файлы устройств создаются автоматически утилитами devtmpfs и udev (см. раздел 3.5). Однако полезно знать, как создать устройство вручную (редко требуется для именованных конвейеров или файлов сокетов).

Команда mknod создает одно устройство. Необходимо знать его имя, основной и второстепенный номера:

# mknod /dev/sda1 b 8 1

Параметр `b 8 1` указывает на блочное устройство с основным номером 8 и второстепенным номером 1. Для символьных устройств используйте параметр `c` вместо `b` (для именованных конвейеров опустите номера).

История управления устройствами

В старых версиях Unix и Linux каталог /dev требовал ручного обслуживания. С каждым обновлением ядра возникали новые номера устройств, решаемые программой MAKEDEV. Эта статическая система оказалась неэффективной:

  • devfs — реализация /dev в пространстве ядра (имела ограничения)
  • udev и devtmpfs — современная динамическая система управления устройствами