Исследование аппаратных устройств в Linux

CompTIABeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы освоите ключевые навыки исследования, идентификации и проверки аппаратных устройств в среде Linux. Вы получите практический опыт работы с мощными утилитами командной строки, чтобы понять принципы взаимодействия операционной системы с физическими компонентами. Цель работы — сформировать базовое понимание управления оборудованием в Linux, что критически важно для системного администрирования, настройки производительности и поиска неисправностей.

Вы начнете с вывода списка блочных устройств с помощью lsblk и lshw, чтобы получить общее представление о хранилищах данных. После этого вы воспользуетесь udevadm для детального изучения свойств устройств и правил их обработки. Затем руководство поможет вам изучить иерархию шин PCI и SCSI, чтобы увидеть, как устройства подключены к системе. Наконец, вы погрузитесь в низкоуровневую системную информацию, исследуя виртуальные файловые системы /proc и /sys, что даст вам полное представление об аппаратном обеспечении вашего компьютера с точки зрения ядра.

Просмотр списка блочных устройств с помощью lsblk и lshw

На этом этапе вы научитесь идентифицировать и выводить список блочных устройств, подключенных к вашей системе. Блочные устройства — это устройства хранения, которые передают данные блоками фиксированного размера, такие как жесткие диски, твердотельные накопители (SSD) и USB-флешки. Для этой цели мы будем использовать две популярные команды: lsblk и lshw.

Сначала воспользуемся командой lsblk, чтобы получить древовидное представление всех доступных блочных устройств. Эта команда считывает данные из файловой системы sysfs и базы данных udev.

Выполните команду lsblk в терминале:

lsblk

Вы увидите вывод, похожий на этот, со списком устройств и их разделов:

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0    7:0    0  89.4M  1 loop /snap/lxd/31333
loop1    7:1    0     4K  1 loop /snap/bare/5
loop2    7:2    0  63.9M  1 loop /snap/core20/2318
loop3    7:3    0 242.9M  1 loop /snap/firefox/2710
loop4    7:4    0 244.5M  1 loop /snap/firefox/2800
loop5    7:5    0 349.7M  1 loop /snap/gnome-3-38-2004/140
loop6    7:6    0 349.7M  1 loop /snap/gnome-3-38-2004/143
loop7    7:7    0  91.7M  1 loop /snap/gtk-common-themes/1535
loop9    7:9    0    87M  1 loop /snap/lxd/28373
loop10   7:10   0  73.9M  1 loop /snap/core22/2010
loop11   7:11   0  38.8M  1 loop /snap/snapd/21759
loop12   7:12   0  50.9M  1 loop /snap/snapd/24718
loop13   7:13   0  63.8M  1 loop /snap/core20/2599
vda    252:0    0    40G  0 disk
├─vda1 252:1    0     1M  0 part
├─vda2 252:2    0   200M  0 part /boot/efi
└─vda3 252:3    0  39.8G  0 part /var/snap/firefox/common/host-hunspell
                                 /

Краткое пояснение столбцов:

  • NAME: Имя устройства.
  • MAJ:MIN: Основной и второстепенный номера устройства, используемые ядром для идентификации.
  • RM: Съемное устройство (1 — да, 0 — нет).
  • SIZE: Размер устройства.
  • RO: Устройство только для чтения (1 — да, 0 — нет).
  • TYPE: Тип устройства (например, disk — диск, part — раздел, loop — петлевое устройство).
  • MOUNTPOINTS: Точки монтирования устройства в файловой системе.

Хотя lsblk отлично подходит для быстрого обзора, команда lshw (list hardware) предоставляет гораздо более подробную информацию. Команда lshw может быть не установлена по умолчанию. Давайте сначала установим ее.

sudo apt-get update && sudo apt-get install -y lshw

После завершения установки вы можете использовать lshw для получения подробных сведений о конкретных классах оборудования. Например, чтобы увидеть информацию о контроллерах хранения (таких как SATA или NVMe), используйте опцию -class storage.

sudo lshw -class storage

В выводе будет представлена информация о самом интерфейсе хранения.

  *-pnp00:03
       product: PnP device PNP0700
       physical id: 3
       capabilities: pnp
  *-ide
       description: IDE interface
       product: 82371SB PIIX3 IDE [Natoma/Triton II]
       vendor: Intel Corporation
       physical id: 1.1
       bus info: pci@0000:00:01.1
       version: 00
       width: 32 bits
       clock: 33MHz
       capabilities: ide isa_compat_mode bus_master
       configuration: driver=ata_piix latency=0
       resources: irq:0 ioport:1f0(size=8) ioport:3f6 ioport:170(size=8) ioport:376 ioport:c060(size=16)
  *-scsi
       description: SCSI storage controller
       product: Virtio block device
       vendor: Red Hat, Inc.
       physical id: 4
       bus info: pci@0000:00:04.0
       version: 00
       width: 64 bits
       clock: 33MHz
       capabilities: scsi msix bus_master cap_list
       configuration: driver=virtio-pci latency=0
       resources: irq:0 memory:fe000000-fe000fff memory:fe001000-fe001fff

Чтобы получить более детальную информацию о разделах и логических томах (аналогично lsblk, но подробнее), используйте опцию -class volume.

sudo lshw -class volume

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

  *-volume:0
       description: BIOS Boot partition
       vendor: EFI
       physical id: 1
       bus info: scsi@0:0.0.0,1
       logical name: /dev/vda1
       serial: xxxx-xxxx
       size: 1MiB
       capacity: 1MiB
       capabilities: primary
  *-volume:1
       description: EFI partition
       vendor: EFI
       physical id: 2
       bus info: scsi@0:0.0.0,2
       logical name: /dev/vda2
       serial: XXXX-XXXX
       size: 200MiB
       capacity: 200MiB
       capabilities: boot fat initialized
       configuration: FATs=32 filesystem=fat mount.fstype=vfat mount.options=rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro state=mounted
  *-volume:2
       description: Linux filesystem
       physical id: 3
       bus info: scsi@0:0.0.0,3
       logical name: /dev/vda3
       size: 39GiB
       capacity: 39GiB
       capabilities: primary ext4 initialized
       configuration: filesystem=ext4 lastmountpoint=/ modified=2024-xx-xx mounted=2024-xx-xx state=mounted

Используя lsblk и lshw, вы можете получить как высокоуровневый обзор, так и детальное низкоуровневое представление устройств хранения в вашей системе Linux.

Проверка свойств устройств с помощью udevadm

На предыдущем этапе вы научились выводить список блочных устройств. Теперь мы углубимся и изучим специфические свойства этих устройств с помощью команды udevadm. udev — это менеджер устройств для ядра Linux, который динамически управляет узлами устройств в каталоге /dev. Команда udevadm является инструментом управления для udev, позволяющим запрашивать подробную информацию из базы данных udev. Это особенно полезно перед созданием пользовательских правил udev для автоматического управления устройствами.

Давайте проверим свойства основного диска /dev/vda, который вы идентифицировали ранее.

Чтобы отобразить свойства /dev/vda в простом формате «ключ-значение», выполните следующую команду. Флаг -q property указывает udevadm запросить в базе данных все известные свойства устройства, а -n /dev/vda задает имя узла устройства.

udevadm info -q property -n /dev/vda

Выводом будет список переменных окружения, описывающих устройство:

DEVPATH=/devices/pci0000:00/0000:00:04.0/virtio1/block/vda
DEVNAME=/dev/vda
DEVTYPE=disk
MAJOR=252
MINOR=0
SUBSYSTEM=block
USEC_INITIALIZED=xxxxxxxxx
ID_VENDOR=Virtio
ID_MODEL=Block_Device
ID_MODEL_ENC=Block\x20Device\x20\x20\x20\x20\x20\x20\x20
ID_REVISION=
ID_SERIAL=Virtio_Block_Device
ID_SERIAL_SHORT=Block_Device
ID_TYPE=disk
ID_BUS=virtio
ID_PATH=pci-0000:00:04.0-virtio-1
ID_PATH_TAG=pci-0000_00_04_0-virtio-1
DEVLINKS=/dev/disk/by-id/virtio-Block_Device /dev/disk/by-path/pci-0000:00:04.0-virtio-1
TAGS=:systemd:

Этот вывод содержит ценные сведения, такие как ID_MODEL, ID_VENDOR и уникальный ID_SERIAL. Эти свойства часто используются для написания правил udev, которые применяются к конкретному устройству независимо от порядка его обнаружения ядром.

Для еще более детального иерархического представления можно запросить устройство, используя его путь в sysfs. Сначала найдите путь sysfs для /dev/vda:

udevadm info -q path -n /dev/vda

Выводом будет путь устройства внутри файловой системы /sys:

/devices/pci0000:00/0000:00:04.0/virtio1/block/vda

Теперь используйте этот путь с флагами -a (обход атрибутов) и -p (путь), чтобы увидеть все атрибуты устройства, начиная от родительских устройств и заканчивая указанным. Это дает полную картину устройства и его родительских контроллеров.

udevadm info -a -p $(udevadm info -q path -n /dev/vda)

Эта команда генерирует гораздо более длинный вывод, показывая атрибуты самого блочного устройства, а также родительского устройства virtio и контроллера PCI. Такой уровень детализации необходим для продвинутого управления устройствами и устранения неполадок. Мы не приводим здесь полный вывод из-за его объема, но вы можете изучить его самостоятельно.

Просмотр иерархии шин PCI и SCSI

На этом этапе вы узнаете, как устройства организованы на системных шинах. Шина — это коммуникационная система, которая передает данные между компонентами внутри компьютера. Мы сосредоточимся на двух важных шинах: PCI (Peripheral Component Interconnect) и SCSI (Small Computer System Interface). Понимание их иерархии помогает в диагностике проблем с оборудованием и понимании того, как устройства (например, ваш жесткий диск) подключены к системе.

Сначала изучим шину PCI, к которой подключено большинство высокоскоростных компонентов на материнской плате. Стандартным инструментом для этого является команда lspci. Пакет pciutils, предоставляющий эту команду, обычно предустановлен, но мы убедимся в этом.

sudo apt-get update && sudo apt-get install -y pciutils

Теперь, чтобы отобразить иерархию шины PCI в виде дерева, используйте команду lspci с опцией -t.

lspci -t

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

-[0000:00]-+-00.0
           +-01.0
           +-01.1
           +-01.3
           +-04.0
           \-05.0

Это дерево показывает соединения, но не указывает, что это за устройства. Чтобы сделать его более информативным, добавьте опцию -v (подробно). Это позволит включить имена устройств и используемый драйвер ядра для каждого из них. Поскольку вывод может быть длинным, мы перенаправим его в more, чтобы вы могли прокручивать текст. Нажимайте пробел для прокрутки вниз и q для выхода.

lspci -tv | more

Вывод станет гораздо более детальным:

-[0000:00]-+-00.0  Intel Corporation 440FX - 82441FX PMC [Natoma]
           +-01.0  Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
           +-01.1  Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
           +-01.3  Intel Corporation 82371AB/EB/MB PIIX4 ACPI
           +-04.0  Red Hat, Inc. Virtio block device
           \-05.0  Red Hat, Inc. Virtio network device

Из этого вывода вы можете увидеть конкретные аппаратные компоненты, подключенные к шине PCI, такие как IDE-контроллер и устройства Virtio.

Далее рассмотрим шину SCSI. В нашей виртуальной среде жесткий диск /dev/vda представлен как блочное устройство Virtio, но мы все равно можем исследовать устройства SCSI, если они присутствуют. Удобный способ просмотра этой информации — команда systool. Установим пакет sysfsutils, который ее содержит.

sudo apt-get install -y sysfsutils

Теперь используйте systool с опцией -b scsi, чтобы вывести список устройств на шине SCSI.

systool -b scsi

Эта команда покажет устройства, подключенные к шине SCSI:

Bus = "scsi"

  Device = "host0"
  Device = "host1"

Изучение низкоуровневых системных ресурсов в /proc

На этом этапе вы погрузитесь в виртуальную файловую систему /proc для проверки низкоуровневых системных ресурсов. Файловая система /proc не содержит реальных файлов на диске; вместо этого она является прямым интерфейсом к структурам данных ядра. Читая файлы в /proc, вы можете в реальном времени наблюдать, как система управляет аппаратными ресурсами, такими как каналы DMA, прерывания и порты ввода-вывода (I/O).

Сначала рассмотрим каналы прямого доступа к памяти (DMA). DMA позволяет определенным аппаратным устройствам обращаться к системной памяти напрямую, минуя центральный процессор, что повышает производительность. Чтобы увидеть, какие каналы DMA используются в данный момент, просмотрите содержимое файла /proc/dma.

cat /proc/dma

Вывод обычно очень прост, особенно в современных или виртуализированных системах.

 4: cascade

Здесь показаны зарегистрированные каналы DMA. Канал cascade используется для каскадирования контроллеров прерываний старого типа и часто является единственным в списке на современном оборудовании.

Затем изучим запросы на прерывание (IRQ). Когда аппаратному устройству требуется внимание процессора, оно посылает сигнал прерывания. Файл /proc/interrupts предоставляет статистику о том, сколько прерываний было получено для каждого номера IRQ.

cat /proc/interrupts

Вывод показывает подробную разбивку активности прерываний по ядрам процессора.

           CPU0
  0:         10   IO-APIC   2-edge      timer
  1:          2   IO-APIC   1-edge      i8042
  8:          1   IO-APIC   8-edge      rtc0
  9:          0   IO-APIC   9-fasteoi   acpi
 11:        ...   IO-APIC  11-fasteoi   ata_piix, uhci_hcd
 12:          4   IO-APIC  12-edge      i8042
NMI:          0   Non-maskable interrupts
LOC:      ...   Local timer interrupts
...

Значение столбцов:

  • Первый столбец — номер IRQ.
  • Столбец CPU0 (и другие столбцы CPU, если они есть) показывает количество прерываний, обработанных этим ядром процессора.
  • Последний столбец показывает имя драйвера устройства, связанного с этим прерыванием. Это очень полезно для отладки конфликтов оборудования.

Наконец, взглянем на порты ввода-вывода (I/O ports). Это специальные адреса памяти, которые процессор использует для прямой связи с аппаратными устройствами. Файл /proc/ioports перечисляет области портов ввода-вывода, зарезервированные в данный момент для устройств. Поскольку список может быть длинным, лучше просматривать его с помощью less. Вы можете прокручивать список стрелками и нажать q для выхода.

less /proc/ioports

Вы увидите список диапазонов памяти и использующих их устройств.

0000-0cf7 : PCI Bus 0000:00
  0020-0021 : PIC1
  0040-0043 : timer0
  0050-0053 : timer1
  0060-0060 : keyboard
  0064-0064 : keyboard
  0070-0077 : rtc0
  0080-008f : dma page reg
  00a0-00a1 : PIC2
  00c0-00df : dma2
  00f0-00ff : fpu
0170-0177 : 0000:00:01.1
  0170-0177 : ata_piix
01f0-01f7 : 0000:00:01.1
  01f0-01f7 : ata_piix
...

Этот вывод показывает диапазон адресов памяти и устройство, которое его заняло. Например, вы можете увидеть диапазоны для клавиатуры, таймеров и дискового контроллера ata_piix, который мы видели на предыдущем этапе.

Исследование информации об устройствах в файловой системе /sys

На этом заключительном этапе вы изучите файловую систему sysfs, смонтированную в /sys. В то время как /proc предоставляет информацию о процессах и некоторых аппаратных ресурсах, /sys предлагает более структурированное представление модели устройств системы. Она экспортирует иерархическое представление объектов ядра, устройств и драйверов. Многие инструменты, которые вы использовали ранее, такие как lsblk и udevadm, получают информацию именно из /sys.

Сначала посмотрим, как представлены блочные устройства. Каталог /sys/block содержит подкаталог для каждого блочного устройства, известного системе.

Выведите содержимое /sys/block, чтобы увидеть устройства:

ls -l /sys/block

В выводе отобразятся блочные устройства, включая петлевые устройства (loop) и наш основной диск vda. Обратите внимание, что это символические ссылки, указывающие на их реальное расположение в иерархии /sys/devices.

total 0
lrwxrwxrwx 1 root root 0 Jan  1 00:00 loop0 -> ../devices/virtual/block/loop0
lrwxrwxrwx 1 root root 0 Jan  1 00:00 loop1 -> ../devices/virtual/block/loop1
...
lrwxrwxrwx 1 root root 0 Jan  1 00:00 vda -> ../devices/pci0000:00/0000:00:04.0/virtio1/block/vda

Теперь изучим каталог устройства vda. Этот каталог содержит различные файлы, представляющие атрибуты устройства.

ls /sys/block/vda

Вы увидите список файлов и каталогов:

alignment_offset  bdi  capability  dev  device  discard_alignment  events  events_async  events_poll_msecs  ext_range  holders  inflight  integrity  power  queue  range  removable  ro  vda1  vda2  vda3  size  slaves  stat  subsystem  trace  uevent

Каждый файл содержит определенную информацию. Например, чтобы узнать размер диска, можно прочитать файл size.

cat /sys/block/vda/size

Выводом будет число:

83886080

Это число представляет размер устройства в 512-байтовых секторах. Вы также можете увидеть каталоги для каждого раздела, такие как vda1, vda2 и vda3, которые содержат свои собственные наборы атрибутов.

Далее изучим, как устройства организованы по типам шин в каталоге /sys/bus. Это альтернативный способ навигации по иерархии устройств.

ls /sys/bus

Вы увидите список различных типов шин, поддерживаемых ядром:

acpi  amba  clocksource  container  cpu  event_source  hid  i2c  i8042  ide  mdio_bus  memory  pci  pci_express  platform  scsi  serial  serio  soc  system  usb  virtio  workqueue

Поскольку мы знаем, что наш диск /dev/vda является блочным устройством Virtio, заглянем в каталог /sys/bus/virtio/devices. Там перечислены все обнаруженные устройства Virtio.

ls -l /sys/bus/virtio/devices

Вывод показывает устройства Virtio, идентифицированные по их ID. Это также символические ссылки, указывающие обратно на основное дерево устройств.

total 0
lrwxrwxrwx 1 root root 0 Jan  1 00:00 virtio0 -> ../../../devices/pci0000:00/0000:00:05.0/virtio0
lrwxrwxrwx 1 root root 0 Jan  1 00:00 virtio1 -> ../../../devices/pci0000:00/0000:00:04.0/virtio1

Исследуя /sys, вы получаете прямой доступ к необработанным данным, которые инструменты более высокого уровня используют для отчетов об оборудовании системы. Это мощный способ понять, как ядро Linux видит и организует устройства.

Резюме

В этой лабораторной работе вы научились идентифицировать и проверять аппаратные устройства в среде Linux. Вы попрактиковались в использовании команды lsblk для вывода списка блочных устройств и их разделов в древовидном формате, а также команды lshw для получения более подробных технических характеристик оборудования. Лабораторная работа также охватила использование udevadm для проверки свойств устройств, управляемых подсистемой udev, и способы просмотра иерархий системных шин для устройств PCI и SCSI.

Кроме того, вы изучили низкоуровневую информацию, предоставляемую ядром через псевдофайловые системы. Вы исследовали файловую систему /proc для просмотра необработанных данных о системных ресурсах и перемещались по файловой системе /sys, чтобы изучить структурированное представление устройств системы и их атрибутов. Это дало вам всестороннее понимание того, как находить и интерпретировать информацию об оборудовании непосредственно из операционной системы.