Explorar dispositivos de hardware en Linux

CompTIABeginner
Practicar Ahora

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.