Introduction
Dans ce laboratoire, vous apprendrez les compétences essentielles pour explorer, identifier et inspecter les périphériques matériels dans un environnement Linux. Vous acquerrez une expérience pratique avec de puissants utilitaires en ligne de commande pour comprendre comment le système d'exploitation interagit avec les composants physiques. L'objectif est de construire une compréhension fondamentale de la gestion du matériel sous Linux, ce qui est crucial pour l'administration système, l'optimisation des performances et le dépannage.
Vous commencerez par lister les périphériques de bloc à l'aide de lsblk et lshw pour obtenir une vue d'ensemble du stockage. Ensuite, vous utiliserez udevadm pour inspecter les propriétés détaillées des périphériques et leurs règles. Le laboratoire vous guidera ensuite à travers la visualisation des hiérarchies de bus PCI et SCSI pour comprendre comment les périphériques sont connectés. Enfin, vous plongerez dans les informations système de bas niveau en examinant les systèmes de fichiers virtuels /proc et /sys, vous offrant une vue complète du matériel de votre système du point de vue du noyau.
Lister les périphériques de bloc avec lsblk et lshw
Dans cette étape, vous apprendrez à identifier et lister les périphériques de bloc connectés à votre système. Les périphériques de bloc sont des périphériques de stockage qui transfèrent des données par blocs de taille fixe, tels que les disques durs, les disques SSD et les clés USB. Nous utiliserons deux commandes courantes à cet effet : lsblk et lshw.
Tout d'abord, utilisons la commande lsblk pour obtenir une vue en arborescence de tous les périphériques de bloc disponibles. Cette commande lit le système de fichiers sysfs et la base de données udev pour collecter des informations.
Exécutez la commande lsblk dans votre terminal :
lsblk
Vous verrez une sortie similaire à celle-ci, listant les périphériques et les partitions qu'ils contiennent.
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
/
Le nom de votre disque principal peut être vda, sda ou nvme0n1 selon l'image de la machine virtuelle. Dans les étapes suivantes, utilisez toujours le nom de disque indiqué par lsblk pour le périphérique monté sur /.
Voici une brève explication des colonnes :
NAME: Le nom du périphérique.MAJ:MIN: Les numéros de périphérique majeur et mineur, utilisés par le noyau pour identifier le périphérique.RM: Périphérique amovible (1 si oui, 0 si non).SIZE: La taille du périphérique.RO: Périphérique en lecture seule (1 si oui, 0 si non).TYPE: Le type de périphérique (par exemple, disk, part, loop).MOUNTPOINTS: L'endroit où le périphérique est monté dans le système de fichiers.
Bien que lsblk soit idéal pour une vue d'ensemble rapide, la commande lshw (list hardware) peut fournir des informations beaucoup plus détaillées. La commande lshw peut ne pas être installée par défaut. Installons-la d'abord.
sudo apt-get update && sudo apt-get install -y lshw
Une fois l'installation terminée, vous pouvez utiliser lshw pour obtenir des informations détaillées sur des classes de matériel spécifiques. Par exemple, pour voir les détails sur les contrôleurs de stockage (comme votre contrôleur SATA ou NVMe), vous pouvez utiliser l'option -class storage.
sudo lshw -class storage
La sortie affichera des informations sur l'interface de stockage elle-même.
*-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
Pour obtenir des informations plus détaillées sur les partitions et les volumes logiques, ce qui est comparable mais plus précis que lsblk, utilisez l'option -class volume.
sudo lshw -class volume
Cette commande fournit une mine d'informations, y compris les noms logiques, les numéros de série et les capacités de chaque partition.
*-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
En utilisant lsblk et lshw, vous pouvez obtenir à la fois une vue d'ensemble et une vue détaillée de bas niveau des périphériques de stockage sur votre système Linux.
Inspecter les propriétés des périphériques avec udevadm
À l'étape précédente, vous avez appris à lister les périphériques de bloc. Maintenant, vous allez approfondir et inspecter les propriétés spécifiques de ces périphériques à l'aide de la commande udevadm. udev est le gestionnaire de périphériques du noyau Linux, qui gère dynamiquement les nœuds de périphériques dans le répertoire /dev. La commande udevadm est l'outil de contrôle pour udev, vous permettant d'interroger la base de données udev pour obtenir des informations détaillées sur les périphériques. Ceci est particulièrement utile avant de créer des règles udev personnalisées pour gérer les périphériques automatiquement.
Inspectons les propriétés du disque principal qui contient votre système de fichiers racine. Tout d'abord, identifiez la partition racine et son disque parent :
ROOT_PARTITION=$(findmnt -n -o SOURCE /)
DISK_NAME=$(lsblk -no PKNAME "$ROOT_PARTITION")
echo "$ROOT_PARTITION -> /dev/$DISK_NAME"
Pour afficher les propriétés de ce disque dans un format clé-valeur simple, exécutez la commande suivante. L'indicateur -q property indique à udevadm d'interroger la base de données pour toutes les propriétés connues du périphérique, et -n "/dev/$DISK_NAME" spécifie le nom du nœud de périphérique.
udevadm info -q property -n "/dev/$DISK_NAME"
La sortie sera une liste de variables d'environnement qui décrivent le périphérique. Vos valeurs exactes différeront, mais la sortie devrait ressembler à ceci :
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:
Cette sortie fournit des détails précieux tels que ID_MODEL, ID_PATH et un ID_SERIAL unique. Ces propriétés sont souvent utilisées pour écrire des règles udev qui s'appliquent à un périphérique spécifique, quel que soit l'ordre dans lequel il a été détecté par le noyau.
Pour une vue hiérarchique encore plus détaillée, vous pouvez interroger le périphérique en utilisant son chemin sysfs. Tout d'abord, trouvez le chemin sysfs du disque que vous avez sélectionné :
udevadm info -q path -n "/dev/$DISK_NAME"
La sortie sera le chemin du périphérique dans le système de fichiers /sys :
/devices/pci0000:00/0000:00:04.0/nvme/nvme0/nvme0n1
Maintenant, utilisez ce chemin avec les indicateurs -a (parcours des attributs) et -p (chemin) pour voir tous les attributs du périphérique, depuis les périphériques parents jusqu'au périphérique spécifié. Cela donne une image complète du périphérique et de ses contrôleurs parents.
udevadm info -a -p "$(udevadm info -q path -n "/dev/$DISK_NAME")"
Cette commande produit une sortie beaucoup plus longue, montrant les attributs du périphérique de bloc lui-même, ainsi que son contrôleur de stockage parent et son périphérique PCI. Ce niveau de détail est essentiel pour la gestion avancée des périphériques et le dépannage. Nous ne montrerons pas la sortie complète ici en raison de sa longueur, mais n'hésitez pas à l'explorer.
Visualiser la hiérarchie des bus PCI et SCSI
Dans cette étape, vous explorerez comment les périphériques sont organisés sur les bus système. Un bus est un système de communication qui transfère des données entre les composants à l'intérieur d'un ordinateur. Nous nous concentrerons sur deux bus importants : PCI (Peripheral Component Interconnect) et SCSI (Small Computer System Interface). Comprendre leur hiérarchie aide à diagnostiquer les problèmes matériels et à comprendre comment les périphériques comme votre disque dur sont connectés au système.
Tout d'abord, examinons le bus PCI, qui connecte la plupart des composants à haute vitesse sur la carte mère. La commande lspci est l'outil standard pour cela. Le paquet pciutils qui fournit cette commande est généralement préinstallé, mais nous allons nous en assurer.
sudo apt-get update && sudo apt-get install -y pciutils
Maintenant, pour afficher la hiérarchie du bus PCI dans une structure en arborescence, utilisez la commande lspci avec l'option -t.
lspci -t
La sortie ressemblera à ceci, montrant les connexions entre les bus et les périphériques :
-[0000:00]-+-00.0
+-01.0
+-01.1
+-01.3
+-04.0
\-05.0
Cette arborescence montre les connexions, mais pas ce que sont les périphériques. Pour la rendre plus utile, ajoutez l'option -v (verbose). Cela inclura les noms des périphériques et le pilote du noyau utilisé pour chaque périphérique. Comme la sortie peut être longue, nous allons la rediriger vers more pour que vous puissiez faire défiler. Appuyez sur la barre d'espace pour faire défiler vers le bas et sur q pour quitter.
lspci -tv | more
La sortie sera beaucoup plus détaillée :
-[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
À partir de cette sortie, vous pouvez voir les composants matériels spécifiques connectés au bus PCI, tels que le contrôleur de stockage NVMe et d'autres périphériques virtuels.
Ensuite, regardons le bus SCSI. Dans cette machine virtuelle, le disque principal peut être exposé via NVMe au lieu de Virtio ou SCSI, mais vous pouvez toujours explorer les périphériques SCSI présents. Un moyen convivial de visualiser ces informations est la commande systool. Installons le paquet sysfsutils qui la fournit.
sudo apt-get install -y sysfsutils
Maintenant, utilisez systool avec l'option -b scsi pour lister les périphériques sur le bus SCSI.
systool -b scsi
Cette commande affichera les périphériques attachés au bus SCSI :
Bus = "scsi"
Device = "host0"
Device = "host1"
Examiner les ressources système de bas niveau dans /proc
Dans cette étape, vous plongerez dans le système de fichiers virtuel /proc pour inspecter les ressources système de bas niveau. Le système de fichiers /proc ne contient pas de fichiers réels sur le disque ; il s'agit plutôt d'une interface directe avec les structures de données du noyau. En lisant les fichiers dans /proc, vous pouvez obtenir une vue en temps réel de la façon dont le système gère les ressources matérielles telles que les canaux DMA, les interruptions et les ports d'E/S.
Tout d'abord, regardons les canaux d'accès direct à la mémoire (DMA). Le DMA permet à certains périphériques matériels d'accéder directement à la mémoire système, sans impliquer le processeur, ce qui améliore les performances. Pour voir quels canaux DMA sont actuellement utilisés, vous pouvez afficher le contenu du fichier /proc/dma.
cat /proc/dma
La sortie est généralement très simple, surtout sur les systèmes modernes ou virtualisés.
4: cascade
Cette sortie montre les canaux DMA enregistrés. Le canal cascade est utilisé pour enchaîner les contrôleurs d'interruption de style ancien et est souvent le seul listé sur le matériel moderne.
Ensuite, examinons les requêtes d'interruption (IRQ). Lorsqu'un périphérique matériel a besoin de l'attention du processeur, il envoie un signal d'interruption. Le fichier /proc/interrupts fournit des statistiques sur le nombre d'interruptions reçues pour chaque numéro d'IRQ.
cat /proc/interrupts
La sortie montre une répartition détaillée de l'activité d'interruption par cœur de processeur.
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
...
Voici ce que signifient les colonnes :
- La première colonne est le numéro d'IRQ.
- La colonne
CPU0(et les autres colonnes de processeur si présentes) montre le nombre d'interruptions gérées par ce cœur de processeur. - La dernière colonne montre le nom du pilote de périphérique associé à cette interruption. C'est très utile pour déboguer les conflits matériels.
Enfin, regardons les ports d'E/S. Ce sont des adresses mémoire spéciales que le processeur utilise pour communiquer directement avec les périphériques matériels. Le fichier /proc/ioports liste les régions de ports d'E/S qui sont actuellement réservées aux périphériques. Comme la liste peut être longue, il est préférable de la visualiser avec less. Vous pouvez faire défiler avec les touches fléchées et appuyer sur q pour quitter.
less /proc/ioports
Vous verrez une liste de plages mémoire et les périphériques qui les utilisent.
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
...
Cette sortie montre la plage d'adresses mémoire et le périphérique qui l'a réclamée. Par exemple, vous pouvez voir les plages pour le clavier, les minuteurs et le contrôleur de disque ata_piix que nous avons vu à l'étape précédente.
Explorer les informations sur les périphériques dans le système de fichiers /sys
Dans cette dernière étape, vous explorerez le système de fichiers sysfs, monté sur /sys. Alors que /proc fournit des informations sur les processus et certaines ressources matérielles, /sys offre une vue plus structurée du modèle de périphérique du système. Il exporte une représentation hiérarchique des objets du noyau, des périphériques et des pilotes. Beaucoup d'outils que vous avez utilisés dans les étapes précédentes, comme lsblk et udevadm, obtiennent leurs informations en lisant depuis /sys.
Tout d'abord, regardons comment les périphériques de bloc sont représentés. Le répertoire /sys/block contient un sous-répertoire pour chaque périphérique de bloc connu du système.
Listez le contenu de /sys/block pour voir les périphériques :
ls -l /sys/block
La sortie montre les périphériques de bloc, y compris les périphériques loop et votre disque principal. Notez qu'il s'agit de liens symboliques pointant vers leurs emplacements réels dans la hiérarchie /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
Retrouvez à nouveau le disque parent de votre système de fichiers racine, puis inspectez ce répertoire. Ce répertoire contient divers fichiers qui représentent les attributs du périphérique.
ROOT_PARTITION=$(findmnt -n -o SOURCE /)
DISK_NAME=$(lsblk -no PKNAME "$ROOT_PARTITION")
ls /sys/block/"$DISK_NAME"
Vous verrez une liste de fichiers et de répertoires :
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
Chaque fichier contient une information spécifique. Par exemple, pour trouver la taille du disque, vous pouvez lire le fichier size.
cat /sys/block/"$DISK_NAME"/size
La sortie sera un nombre :
83886080
Ce nombre représente la taille du périphérique en secteurs de 512 octets. Vous pouvez également voir des répertoires pour chaque partition, tels que nvme0n1p1, nvme0n1p2 et nvme0n1p3, qui contiennent leurs propres ensembles d'attributs. Sur d'autres images, les noms des partitions peuvent utiliser un préfixe de périphérique différent.
Ensuite, explorons comment les périphériques sont organisés par type de bus dans le répertoire /sys/bus. Cela fournit un moyen alternatif de naviguer dans la hiérarchie des périphériques.
ls /sys/bus
Vous verrez une liste des différents types de bus pris en charge par le noyau :
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
Même si votre disque de stockage n'est pas un périphérique de bloc Virtio, la machine virtuelle peut toujours exposer d'autres périphériques Virtio. Regardons à l'intérieur du répertoire /sys/bus/virtio/devices pour les lister.
ls -l /sys/bus/virtio/devices
La sortie montre les périphériques Virtio, identifiés par leurs identifiants de périphérique. Ce sont également des liens symboliques pointant vers l'arborescence principale des périphériques.
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
En explorant /sys, vous pouvez accéder directement aux données brutes que les outils de plus haut niveau utilisent pour rapporter des informations sur le matériel système. C'est un moyen puissant de comprendre comment le noyau Linux voit et organise les périphériques.
Résumé
Dans ce laboratoire, vous avez appris à identifier et inspecter les périphériques matériels dans un environnement Linux. Vous vous êtes exercé à utiliser la commande lsblk pour lister les périphériques de bloc et leurs partitions dans un format en arborescence, et la commande lshw pour obtenir des spécifications matérielles plus détaillées. Le laboratoire a également couvert l'utilisation de udevadm pour inspecter les propriétés des périphériques gérées par le sous-système udev, ainsi que la manière de visualiser les hiérarchies de bus du système pour les périphériques PCI et SCSI.
De plus, vous avez exploré les informations de bas niveau présentées par le noyau via des pseudo-systèmes de fichiers. Vous avez examiné le système de fichiers /proc pour visualiser les données brutes des ressources système et navigué dans le système de fichiers /sys pour explorer une représentation structurée des périphériques du système et de leurs attributs. Cela a fourni une compréhension complète de la manière de trouver et d'interpréter les informations matérielles directement depuis le système d'exploitation.



