Доступ к устройствам в Linux

Классическая модель доступа к драйверам

В файловой системе Unix существуют специальные объекты - файлы устройств. Как правило, они создаются в каталоге /dev, но могут сбыть созданы и в любом другом каталоге. Каждый специальный файл - это точка доступа к драйверу устройства. Если драйвер предоставляет операции чтения/записи, то файл устройства может быть открыт как обычный файл cat /dev/modem > /dev/null. Для выполнения других операций с устройством (например выдвижение лотка CDROM) требуется отправка команд драйверу через системный вызов ioctl(). Файлам устройств права доступа назначаются так же , как и обычным файлам.

ВНИМАНИЕ: сетевые карты не отображаются в файлы устройств в /dev. Все сетевые интерфейсы живут в своём пространстве имён.

Команда создания специального файла:

mknod <name> <type> <major> <minor>
  • name - имя в файловой системе,
  • type - b|c - блочный или посимвольный тип устройства,
  • major, minor - номер драйвера в таблице драйверов и номер устройства в таблице устройств, обслуживаемых этим драйвером.

Имя устройства не имеет значения для функционирования ОС и выбирается по некоторым мнемоническим правилам. Например, SCSI диск может иметь следующие имена:

  • Linux - /dev/sda1 - первый раздел (1) на первом (a) SCSI диске
  • Solaris - /dev/dsk/c0t2d0s3 - контроллер 0, устройство 2 (SCSI ID), логическое устройство 0 (LUN Logical Unit Number - обычно 0), слайс 3 (Номер раздела)
  • Solaris - /devices/pci@0,0/pci-ide@7,1/ide@0/cmdk@0,0:a - диск на контроллере ide, подключенном по шине pci

Функциональность файла устройства определяется парой чисел major/minor, которые должны соответствовать номерам в некой таблице регистрации драйверов в ядре ОС. Назначение minor, обычно, определяется логикой работы драйвера. Для согласованного назначения номера major драйверам и специальным файлам существует несколько способов :

  • Статические номера major. Разработчики драйверов регистрируются у мантейнеров ядра и получают фиксированные номера major. . Разработчики дистрибутива добавляют в поставку скрипт для создания соответствующих специальных файлов в каталоге /dev.
  • Инициализация драйвера на основе специального файла. При инициализации драйвера в ядре он просматривает каталог /dev, обнаруживает по имени свой специальный файл и читает из него major/minor.
  • Динамическое назначение major/minor. При обнаружении нового устройства ядро инициализирует драйвер и назначает ему major/minor. Специальный сервис (udev) получает через сокет уведомление о найденном устройстве (тип, шина, производитель, идентификатор) и его major/minor. На основании этой информации и набора правил генерации имён сервис, создаёт для устройства специальный файл.

Каталоги /proc и /sys

Традиционно свойства процессов и некоторые параметры ядра отображаются в Linux в каталог /proc через драйвер псевдофайловой системы procfs. Начиная с ядра 2.6 параметры ядра, связанные с драйверами устройств и файловых системам, были вынесены в каталог /sys и псевдофайловую систему sysfs.

/proc

Через файл /proc/cpuinfo можно получить информацию о физических процессорах, физических ядрах и гипертрединговых логических ядрах.

$  cat /proc/cpuinfo
...
model name      : Intel(R) Xeon(R) CPU           E5520  @ 2.27GHz
....
cpu MHz         : 1733.000
...

Через файл /proc/net/dev можно получить список сетевых интерфейсов и статистику по ним

Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
eth0: 1767479002126 7440045654    0 209199 176227535     ...
lo: 809098010894 313483867    0    0    0     0          ...

/sys

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

  • /sys/devices - основной каталог, на который ссылаются остальные
  • /sys/dev - классификация по type, major, minor
  • /sys/bus - классификация по шине - pci, usb, scsi и т.п.
  • /sys/block - драйверы блочных устройств.
  • /sys/class - классификация по типу устройства

Заряд батареи

cat /sys/class/power_supply/BAT0/charge_full
cat /sys/class/power_supply/BAT0/charge_full_design
cat /sys/class/power_supply/BAT0/charge_now

Альтернативный путь к тем же данным

 /proc/acpi/battery/BAT0/*

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

  • dmesg - сообщения ядра. Включают информацию об обнаруженных устройствах.
  • lscpu - список процессоров (ядер). Выводит информацию из /proc/cpuinfo
  • lsusb - список устройств на шине USB (/sys/bus/usb/devices)
  • lspci - список устройств на шине PCI (/sys/bus/pci/devices)
  • lsblk -список дисков, разделов, логических томов и т.п.
  • hdparm - считывание параметров жёстких дисков и управление этими параметрами.
  • smartctl - считывание параметров S.M.A.R.T. жёсткого диска. Диагностика диска.
  • dmidecode - список устройств на материнской плате, в том числе информация о BIOS и о планках памяти.

Утилиты acpi, acpitool отсутствуют в большинстве современных дистрибутивов.