Introducción
En este laboratorio, aprenderás las habilidades esenciales para explorar, identificar e inspeccionar dispositivos de hardware dentro de un entorno Linux. Obtendrás experiencia práctica con potentes utilidades de línea de comandos para comprender cómo interactúa el sistema operativo con los componentes físicos. El objetivo es construir una base sólida sobre la gestión de hardware en Linux, lo cual es crucial para la administración de sistemas, el ajuste del rendimiento y la resolución de problemas.
Comenzarás listando dispositivos de bloque mediante lsblk y lshw para obtener una visión general del almacenamiento. A continuación, utilizarás udevadm para inspeccionar propiedades y reglas detalladas de los dispositivos. El laboratorio te guiará luego a través de la visualización de las jerarquías de los buses PCI y SCSI para observar cómo están conectados los dispositivos. Finalmente, profundizarás en la información del sistema de bajo nivel examinando los sistemas de archivos virtuales /proc y /sys, lo que te brindará una visión integral del hardware de tu sistema desde la perspectiva del kernel.
Listar dispositivos de bloque con lsblk y lshw
En este paso, aprenderás a identificar y listar los dispositivos de bloque conectados a tu sistema. Los dispositivos de bloque son dispositivos de almacenamiento que transfieren datos en bloques de tamaño fijo, como discos duros, unidades de estado sólido y unidades flash USB. Utilizaremos dos comandos comunes para este propósito: lsblk y lshw.
Primero, usemos el comando lsblk para obtener una vista en forma de árbol de todos los dispositivos de bloque disponibles. Este comando lee el sistema de archivos sysfs y la base de datos de udev para recopilar información.
Ejecuta el comando lsblk en tu terminal:
lsblk
Verás una salida similar a esta, que lista los dispositivos y las particiones que contienen.
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
/
El nombre de tu disco principal puede ser vda, sda o nvme0n1 dependiendo de la imagen de la máquina virtual. En los siguientes pasos, utiliza siempre el nombre de disco que lsblk muestra para el dispositivo montado en /.
Aquí tienes una breve explicación de las columnas:
NAME: El nombre del dispositivo.MAJ:MIN: Los números mayor y menor del dispositivo, utilizados por el kernel para identificarlo.RM: Dispositivo extraíble (1 si es sí, 0 si es no).SIZE: El tamaño del dispositivo.RO: Dispositivo de solo lectura (1 si es sí, 0 si es no).TYPE: El tipo de dispositivo (por ejemplo, disk, part, loop).MOUNTPOINTS: Dónde está montado el dispositivo en el sistema de archivos.
Aunque lsblk es excelente para una visión general rápida, el comando lshw (list hardware) puede proporcionar información mucho más detallada. Es posible que lshw no esté instalado por defecto. Vamos a instalarlo primero.
sudo apt-get update && sudo apt-get install -y lshw
Una vez completada la instalación, puedes usar lshw para obtener información detallada sobre clases específicas de hardware. Por ejemplo, para ver detalles sobre los controladores de almacenamiento (como tu controlador SATA o NVMe), puedes usar la opción -class storage.
sudo lshw -class storage
La salida mostrará información sobre la interfaz de almacenamiento en sí.
*-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
Para obtener información más detallada sobre las particiones y volúmenes lógicos, que es comparable pero más exhaustiva que lsblk, utiliza la opción -class volume.
sudo lshw -class volume
Este comando proporciona una gran cantidad de información, incluidos nombres lógicos, números de serie y capacidades de cada partición.
*-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
Al usar lsblk y lshw, puedes obtener tanto una visión de alto nivel como una detallada y de bajo nivel de los dispositivos de almacenamiento en tu sistema Linux.
Inspeccionar propiedades de dispositivos con udevadm
En el paso anterior, aprendiste a listar dispositivos de bloque. Ahora, profundizarás e inspeccionarás las propiedades específicas de estos dispositivos utilizando el comando udevadm. udev es el gestor de dispositivos para el kernel de Linux, que gestiona dinámicamente los nodos de dispositivos en el directorio /dev. El comando udevadm es la herramienta de control para udev, lo que te permite consultar la base de datos de udev para obtener información detallada del dispositivo. Esto es particularmente útil antes de crear reglas personalizadas de udev para gestionar dispositivos automáticamente.
Inspeccionemos las propiedades del disco principal que contiene tu sistema de archivos raíz. Primero, identifica la partición raíz y su disco principal:
ROOT_PARTITION=$(findmnt -n -o SOURCE /)
DISK_NAME=$(lsblk -no PKNAME "$ROOT_PARTITION")
echo "$ROOT_PARTITION -> /dev/$DISK_NAME"
Para mostrar las propiedades de ese disco en un formato simple de clave-valor, ejecuta el siguiente comando. El indicador -q property le dice a udevadm que consulte la base de datos para todas las propiedades conocidas del dispositivo, y -n "/dev/$DISK_NAME" especifica el nombre del nodo del dispositivo.
udevadm info -q property -n "/dev/$DISK_NAME"
La salida será una lista de variables de entorno que describen el dispositivo. Tus valores exactos diferirán, pero la salida debería verse similar a esto:
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:
Esta salida proporciona detalles valiosos como ID_MODEL, ID_PATH y un ID_SERIAL único. Estas propiedades se utilizan a menudo para escribir reglas de udev que se aplican a un dispositivo específico, independientemente del orden en que fue detectado por el kernel.
Para una vista jerárquica aún más detallada, puedes consultar el dispositivo utilizando su ruta sysfs. Primero, encuentra la ruta sysfs para el disco que seleccionaste:
udevadm info -q path -n "/dev/$DISK_NAME"
La salida será la ruta del dispositivo dentro del sistema de archivos /sys:
/devices/pci0000:00/0000:00:04.0/nvme/nvme0/nvme0n1
Ahora, usa esta ruta con los indicadores -a (recorrido de atributos) y -p (ruta) para ver todos los atributos del dispositivo desde los dispositivos padres hasta el dispositivo especificado. Esto proporciona una imagen completa del dispositivo y sus controladores padres.
udevadm info -a -p "$(udevadm info -q path -n "/dev/$DISK_NAME")"
Este comando produce una salida mucho más larga, mostrando atributos para el dispositivo de bloque en sí, así como para su controlador de almacenamiento padre y el dispositivo PCI. Este nivel de detalle es esencial para la gestión avanzada de dispositivos y la resolución de problemas. No mostraremos la salida completa aquí debido a su longitud, pero siéntete libre de explorarla.
Ver la jerarquía de buses PCI y SCSI
En este paso, explorarás cómo se organizan los dispositivos en los buses del sistema. Un bus es un sistema de comunicación que transfiere datos entre componentes dentro de una computadora. Nos centraremos en dos buses importantes: PCI (Peripheral Component Interconnect) y SCSI (Small Computer System Interface). Comprender su jerarquía ayuda a diagnosticar problemas de hardware y a entender cómo están conectados al sistema dispositivos como tu disco duro.
Primero, examinemos el bus PCI, que conecta la mayoría de los componentes de alta velocidad en la placa base. El comando lspci es la herramienta estándar para esto. El paquete pciutils que proporciona este comando suele estar preinstalado, pero nos aseguraremos de ello.
sudo apt-get update && sudo apt-get install -y pciutils
Ahora, para mostrar la jerarquía del bus PCI en una estructura de árbol, utiliza el comando lspci con la opción -t.
lspci -t
La salida se verá algo así, mostrando las conexiones entre buses y dispositivos:
-[0000:00]-+-00.0
+-01.0
+-01.1
+-01.3
+-04.0
\-05.0
Este árbol muestra las conexiones, pero no qué son los dispositivos. Para hacerlo más útil, añade la opción -v (verbose). Esto incluirá los nombres de los dispositivos y el controlador del kernel en uso para cada uno. Dado que la salida puede ser larga, la canalizaremos a more para que puedas desplazarte por ella. Presiona la barra espaciadora para bajar y q para salir.
lspci -tv | more
La salida será mucho más detallada:
-[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
A partir de esta salida, puedes ver los componentes de hardware específicos conectados al bus PCI, como el controlador de almacenamiento NVMe y otros dispositivos virtuales.
A continuación, veamos el bus SCSI. En esta máquina virtual, el disco principal puede estar expuesto a través de NVMe en lugar de Virtio o SCSI, pero aún puedes explorar cualquier dispositivo SCSI presente. Una forma fácil de ver esta información es con el comando systool. Instalemos el paquete sysfsutils que lo proporciona.
sudo apt-get install -y sysfsutils
Ahora, usa systool con la opción -b scsi para listar los dispositivos en el bus SCSI.
systool -b scsi
Este comando mostrará los dispositivos conectados al bus SCSI:
Bus = "scsi"
Device = "host0"
Device = "host1"
Examinar recursos del sistema de bajo nivel en /proc
En este paso, profundizarás en el sistema de archivos virtual /proc para inspeccionar los recursos del sistema de bajo nivel. El sistema de archivos /proc no contiene archivos reales en el disco; en cambio, es una interfaz directa a las estructuras de datos del kernel. Al leer archivos en /proc, puedes obtener una visión en tiempo real de cómo el sistema gestiona los recursos de hardware como canales DMA, interrupciones y puertos de E/S.
Primero, veamos los canales de Acceso Directo a Memoria (DMA). DMA permite que ciertos dispositivos de hardware accedan a la memoria del sistema directamente, sin involucrar a la CPU, lo que mejora el rendimiento. Para ver qué canales DMA están actualmente en uso, puedes ver el contenido del archivo /proc/dma.
cat /proc/dma
La salida suele ser muy simple, especialmente en sistemas modernos o virtualizados.
4: cascade
Esta salida muestra los canales DMA registrados. El canal cascade se utiliza para encadenar controladores de interrupción de estilo antiguo y a menudo es el único listado en hardware moderno.
A continuación, examinemos las solicitudes de interrupción (IRQ). Cuando un dispositivo de hardware necesita la atención de la CPU, envía una señal de interrupción. El archivo /proc/interrupts proporciona estadísticas sobre cuántas interrupciones se han recibido para cada número de IRQ.
cat /proc/interrupts
La salida muestra un desglose detallado de la actividad de interrupción por núcleo de CPU.
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
...
Esto es lo que significan las columnas:
- La primera columna es el número de IRQ.
- La columna
CPU0(y otras columnas de CPU si están presentes) muestra el número de interrupciones manejadas por ese núcleo de CPU. - La última columna muestra el nombre del controlador de dispositivo asociado con esa interrupción. Esto es muy útil para depurar conflictos de hardware.
Finalmente, veamos los puertos de E/S. Son direcciones de memoria especiales que la CPU utiliza para comunicarse directamente con los dispositivos de hardware. El archivo /proc/ioports lista las regiones de puertos de E/S que están actualmente reservadas para dispositivos. Dado que la lista puede ser larga, es mejor verla con less. Puedes desplazarte con las teclas de flecha y presionar q para salir.
less /proc/ioports
Verás una lista de rangos de memoria y los dispositivos que los utilizan.
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
...
Esta salida muestra el rango de direcciones de memoria y el dispositivo que lo ha reclamado. Por ejemplo, puedes ver rangos para el teclado, los temporizadores y el controlador de disco ata_piix que vimos en el paso anterior.
Explorar información de dispositivos en el sistema de archivos /sys
En este paso final, explorarás el sistema de archivos sysfs, montado en /sys. Mientras que /proc proporciona información sobre procesos y algunos recursos de hardware, /sys ofrece una visión más estructurada del modelo de dispositivos del sistema. Exporta una representación jerárquica de objetos del kernel, dispositivos y controladores. Muchas de las herramientas que has utilizado en pasos anteriores, como lsblk y udevadm, obtienen su información leyendo desde /sys.
Primero, veamos cómo se representan los dispositivos de bloque. El directorio /sys/block contiene un subdirectorio para cada dispositivo de bloque conocido por el sistema.
Lista el contenido de /sys/block para ver los dispositivos:
ls -l /sys/block
La salida muestra los dispositivos de bloque, incluidos los dispositivos loop y tu disco principal. Observa que estos son enlaces simbólicos que apuntan a sus ubicaciones reales dentro de la jerarquía /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
Encuentra de nuevo el disco padre para tu sistema de archivos raíz, luego inspecciona ese directorio. Este directorio contiene varios archivos que representan los atributos del dispositivo.
ROOT_PARTITION=$(findmnt -n -o SOURCE /)
DISK_NAME=$(lsblk -no PKNAME "$ROOT_PARTITION")
ls /sys/block/"$DISK_NAME"
Verás una lista de archivos y directorios:
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
Cada archivo contiene una pieza específica de información. Por ejemplo, para encontrar el tamaño del disco, puedes leer el archivo size.
cat /sys/block/"$DISK_NAME"/size
La salida será un número:
83886080
Este número representa el tamaño del dispositivo en sectores de 512 bytes. También puedes ver directorios para cada partición, como nvme0n1p1, nvme0n1p2 y nvme0n1p3, que contienen sus propios conjuntos de atributos. En otras imágenes, los nombres de las particiones pueden usar un prefijo de dispositivo diferente.
A continuación, exploremos cómo se organizan los dispositivos por tipo de bus en el directorio /sys/bus. Esto proporciona una forma alternativa de navegar por la jerarquía de dispositivos.
ls /sys/bus
Verás una lista de diferentes tipos de buses soportados por el kernel:
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
Incluso si tu disco de almacenamiento no es un dispositivo de bloque Virtio, la máquina virtual aún puede exponer otros dispositivos Virtio. Veamos dentro del directorio /sys/bus/virtio/devices para listarlos.
ls -l /sys/bus/virtio/devices
La salida muestra los dispositivos Virtio, identificados por sus IDs de dispositivo. Estos también son enlaces simbólicos que apuntan de vuelta al árbol de dispositivos principal.
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
Al explorar /sys, puedes acceder directamente a los datos sin procesar que las herramientas de alto nivel utilizan para informar sobre el hardware del sistema. Es una forma poderosa de entender cómo el kernel de Linux ve y organiza los dispositivos.
Resumen
En este laboratorio, aprendiste a identificar e inspeccionar dispositivos de hardware en un entorno Linux. Practicaste el uso del comando lsblk para listar dispositivos de bloque y sus particiones en un formato de árbol, y el comando lshw para obtener especificaciones de hardware más detalladas. El laboratorio también cubrió el uso de udevadm para inspeccionar propiedades de dispositivos gestionadas por el subsistema udev, y cómo ver las jerarquías de buses del sistema para dispositivos PCI y SCSI.
Además, exploraste la información de bajo nivel presentada por el kernel a través de pseudo-sistemas de archivos. Examinaste el sistema de archivos /proc para ver datos de recursos del sistema sin procesar y navegaste por el sistema de archivos /sys para explorar una representación estructurada de los dispositivos del sistema y sus atributos. Esto proporcionó una comprensión integral de cómo encontrar e interpretar información de hardware directamente desde el sistema operativo.



