Введение
В этой лабораторной работе вы освоите основные навыки поиска, идентификации и проверки аппаратных устройств в среде 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
/
Имя вашего основного диска может быть vda, sda или nvme0n1 в зависимости от образа виртуальной машины. На следующих этапах всегда используйте имя диска, которое lsblk показывает для устройства, смонтированного в /.
Краткое пояснение столбцов:
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 для автоматического управления устройствами.
Давайте проверим свойства основного диска, на котором находится ваша корневая файловая система. Сначала определите корневой раздел и его родительский диск:
ROOT_PARTITION=$(findmnt -n -o SOURCE /)
DISK_NAME=$(lsblk -no PKNAME "$ROOT_PARTITION")
echo "$ROOT_PARTITION -> /dev/$DISK_NAME"
Чтобы отобразить свойства этого диска в простом формате «ключ-значение», выполните следующую команду. Флаг -q property указывает udevadm запросить базу данных для всех известных свойств устройства, а -n "/dev/$DISK_NAME" указывает имя узла устройства.
udevadm info -q property -n "/dev/$DISK_NAME"
Выводом будет список переменных окружения, описывающих устройство. Ваши точные значения будут отличаться, но вывод должен выглядеть примерно так:
DEVPATH=/devices/pci0000:00/0000:00:04.0/nvme/nvme0/nvme0n1
DEVNAME=/dev/nvme0n1
DEVTYPE=disk
MAJOR=259
MINOR=0
SUBSYSTEM=block
USEC_INITIALIZED=xxxxxxxxx
ID_MODEL=Alibaba Cloud Elastic Block Storage
ID_REVISION=1.0
ID_SERIAL=Alibaba_Cloud_Elastic_Block_Storage_xxxxxxxxxxxx
ID_SERIAL_SHORT=xxxxxxxxxxxx
ID_TYPE=disk
ID_PATH=pci-0000:00:04.0-nvme-1
ID_PATH_TAG=pci-0000_00_04_0-nvme-1
DEVLINKS=/dev/disk/by-id/nvme-... /dev/disk/by-path/pci-0000:00:04.0-nvme-1
TAGS=:systemd:
Этот вывод предоставляет ценные детали, такие как ID_MODEL, ID_PATH и уникальный ID_SERIAL. Эти свойства часто используются для написания правил udev, которые применяются к конкретному устройству, независимо от порядка его обнаружения ядром.
Для получения еще более подробного и иерархического представления вы можете запросить устройство, используя его путь в sysfs. Сначала найдите путь sysfs для выбранного диска:
udevadm info -q path -n "/dev/$DISK_NAME"
Выводом будет путь устройства внутри файловой системы /sys:
/devices/pci0000:00/0000:00:04.0/nvme/nvme0/nvme0n1
Теперь используйте этот путь с флагами -a (attribute walk) и -p (path), чтобы увидеть все атрибуты устройства от родительских устройств до указанного. Это дает полное представление об устройстве и его родительских контроллерах.
udevadm info -a -p "$(udevadm info -q path -n "/dev/$DISK_NAME")"
Эта команда выдает гораздо более длинный вывод, показывая атрибуты как самого блочного устройства, так и его родительского контроллера хранилища и 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 (verbose). Это включит имена устройств и используемый драйвер ядра для каждого устройства. Поскольку вывод может быть длинным, мы перенаправим его в 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.3 Intel Corporation 82371AB/EB/MB PIIX4 ACPI
+-02.0 Cirrus Logic GD 5446
+-03.0 Red Hat, Inc. Virtio console
+-04.0 Intel Corporation QEMU NVM Express Controller
+-05.0 Red Hat, Inc. Virtio network device
\-06.0 Red Hat, Inc. Virtio memory balloon
Из этого вывода вы можете увидеть конкретные аппаратные компоненты, подключенные к шине PCI, такие как контроллер хранилища NVMe и другие виртуальные устройства.
Далее давайте посмотрим на шину SCSI. В этой виртуальной машине основной диск может быть представлен через NVMe, а не Virtio или SCSI, но вы все равно можете изучить любые присутствующие устройства 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, прерывания и порты ввода-вывода.
Сначала давайте посмотрим на каналы прямого доступа к памяти (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-устройства и ваш основной диск. Обратите внимание, что это символические ссылки, указывающие на их фактическое расположение в иерархии /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 nvme0n1 -> ../devices/pci0000:00/0000:00:04.0/nvme/nvme0/nvme0n1
Снова найдите родительский диск для вашей корневой файловой системы, а затем изучите этот каталог. Этот каталог содержит различные файлы, представляющие атрибуты устройства.
ROOT_PARTITION=$(findmnt -n -o SOURCE /)
DISK_NAME=$(lsblk -no PKNAME "$ROOT_PARTITION")
ls /sys/block/"$DISK_NAME"
Вы увидите список файлов и каталогов:
alignment_offset diskseq holders nvme0n1p2 ro uevent
bdi events inflight nvme0n1p3 size wwid
capability events_async integrity power slaves
dev events_poll_msecs mq queue stat
device ext_range nsid range subsystem
discard_alignment hidden nvme0n1p1 removable trace
Каждый файл содержит определенную информацию. Например, чтобы узнать размер диска, вы можете прочитать файл size.
cat /sys/block/"$DISK_NAME"/size
Выводом будет число:
83886080
Это число представляет размер устройства в 512-байтовых секторах. Вы также можете увидеть каталоги для каждого раздела, такие как nvme0n1p1, nvme0n1p2 и nvme0n1p3, которые содержат свои собственные наборы атрибутов. В других образах имена разделов могут использовать другой префикс устройства.
Далее давайте изучим, как устройства организованы по типу шины в каталоге /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
Даже если ваш диск хранения не является блочным устройством Virtio, виртуальная машина все равно может предоставлять другие устройства Virtio. Давайте заглянем в каталог /sys/bus/virtio/devices, чтобы перечислить их.
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 для изучения структурированного представления устройств системы и их атрибутов. Это обеспечило всестороннее понимание того, как находить и интерпретировать информацию об оборудовании непосредственно из операционной системы.



