Exploración de Dispositivos de Hardware en Linux

CompTIABeginner
Practicar Ahora

Introducción

En esta práctica de laboratorio, aprenderás las habilidades fundamentales para explorar, identificar e inspeccionar los dispositivos de hardware dentro de un entorno Linux. Obtendrás experiencia práctica utilizando potentes utilidades de la línea de comandos para comprender la interacción entre el sistema operativo y los componentes físicos. El objetivo es construir una base sólida en la gestión de hardware en Linux, algo crucial para la administración de sistemas, la optimización del rendimiento y la resolución de problemas.

Comenzarás listando los dispositivos de bloque mediante lsblk y lshw para obtener una visión general del almacenamiento. A continuación, utilizarás udevadm para inspeccionar propiedades detalladas y reglas de los dispositivos. La práctica te guiará después 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 componentes. Finalmente, profundizarás en la información del sistema de bajo nivel examinando los sistemas de archivos virtuales /proc y /sys, lo que te proporcionará una visión integral del hardware de tu equipo desde la perspectiva del kernel.

Esta es una Práctica Guiada que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada etapa y ganar experiencia práctica. Los datos históricos muestran que esta es una práctica de nivel principiante con una tasa de finalización del 90%. Ha recibido una tasa de valoraciones positivas del 98% por parte de los alumnos.

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 unidades de almacenamiento que transfieren datos en bloques de tamaño fijo, como discos duros, unidades de estado sólido y memorias USB. Utilizaremos dos comandos comunes para este propósito: lsblk y lshw.

Primero, usemos el comando lsblk para obtener una vista jerárquica 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, listando 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
                                 /

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 lo es, 0 si no).
  • SIZE: El tamaño del dispositivo.
  • RO: Dispositivo de solo lectura (1 si lo es, 0 si no).
  • TYPE: El tipo de dispositivo (ej. disk, part, loop).
  • MOUNTPOINTS: Dónde está montado el dispositivo en el sistema de archivos.

Aunque lsblk es excelente para una visión 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 propia interfaz de almacenamiento.

  *-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, incluyendo 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 utilizar lsblk y lshw, puedes obtener tanto una visión de alto nivel como una vista detallada y técnica 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 administra dinámicamente los nodos de dispositivos en el directorio /dev. El comando udevadm es la herramienta de control para udev, permitiéndote consultar la base de datos de udev para obtener información detallada. Esto es particularmente útil antes de crear reglas personalizadas de udev para gestionar dispositivos automáticamente.

Vamos a inspeccionar las propiedades del disco principal, /dev/vda, que identificaste en el paso anterior.

Para mostrar las propiedades de /dev/vda en un formato simple de clave-valor, ejecuta el siguiente comando. El flag -q property le indica a udevadm que consulte la base de datos para todas las propiedades conocidas del dispositivo, y -n /dev/vda especifica el nombre del nodo del dispositivo.

udevadm info -q property -n /dev/vda

La salida será una lista de variables de entorno que describen el dispositivo:

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:

Esta salida proporciona detalles valiosos como el ID_MODEL, ID_VENDOR 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 el kernel lo detecte.

Para obtener una vista jerárquica aún más detallada, puedes consultar el dispositivo utilizando su ruta en sysfs. Primero, busca la ruta sysfs para /dev/vda:

udevadm info -q path -n /dev/vda

La salida será la ruta del dispositivo dentro del sistema de archivos /sys:

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

Ahora, utiliza esta ruta con los flags -a (recorrido de atributos) y -p (ruta) para ver todos los atributos del dispositivo desde los dispositivos padre hasta el dispositivo especificado. Esto ofrece una imagen completa del dispositivo y sus controladores superiores.

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

Este comando genera una salida mucho más larga, mostrando atributos para el propio dispositivo de bloque, así como para su dispositivo virtio padre y el controlador 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 extensión, pero siéntete libre de explorarla.

Ver la Jerarquía de los 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 dispositivos como tu disco duro están conectados al sistema.

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 que sea más útil, añade la opción -v (detallado). 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 pasaremos 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.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

En esta salida, puedes ver los componentes de hardware específicos conectados al bus PCI, como el controlador IDE y los dispositivos Virtio.

A continuación, veamos el bus SCSI. En nuestro entorno virtual, el disco duro /dev/vda se presenta como un dispositivo de bloque Virtio, pero aún podemos explorar los dispositivos SCSI si hay alguno presente. Una forma amigable 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, te adentrará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 su lugar, 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 los canales DMA, las interrupciones y los puertos de E/S.

Primero, veamos los canales de Acceso Directo a Memoria (DMA). El 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 interrupciones de estilo antiguo y a menudo es el único que aparece en el hardware moderno.

A continuación, examinemos las solicitudes de interrupción (IRQs). 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 interrupciones 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 las hay) muestra el número de interrupciones manejadas por ese núcleo de CPU.
  • La última columna muestra el nombre del controlador del dispositivo asociado con esa interrupción. Esto es muy útil para depurar conflictos de hardware.

Finalmente, veamos los puertos de E/S (I/O ports). Estas son direcciones de memoria especiales que la CPU utiliza para comunicarse directamente con los dispositivos de hardware. El archivo /proc/ioports enumera las regiones de puertos de E/S que están reservadas actualmente para los 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 vista más estructurada del modelo de dispositivos del sistema. Exporta una representación jerárquica de los 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 de /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, incluyendo los dispositivos loop y nuestro disco principal vda. 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 vda -> ../devices/pci0000:00/0000:00:04.0/virtio1/block/vda

Ahora, inspeccionemos el directorio para el dispositivo vda. Este directorio contiene varios archivos que representan los atributos del dispositivo.

ls /sys/block/vda

Verás una lista de archivos y directorios:

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

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/vda/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 vda1, vda2 y vda3, que contienen sus propios conjuntos de atributos.

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

Como sabemos que nuestro disco /dev/vda es un dispositivo de bloque Virtio, miremos dentro del directorio /sys/bus/virtio/devices. Esto listará todos los dispositivos Virtio detectados.

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 nuevo al árbol principal de dispositivos.

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 brutos que las herramientas de nivel superior 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 esta práctica de 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 formato de árbol, y el comando lshw para obtener especificaciones de hardware más detalladas. La práctica también cubrió el uso de udevadm para inspeccionar las propiedades de los dispositivos gestionados por el subsistema udev, y cómo visualizar 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 pseudosistemas de archivos. Examinaste el sistema de archivos /proc para ver datos brutos de recursos del sistema y navegaste por el sistema de archivos /sys para explorar una representación estructurada de los dispositivos del sistema y sus atributos. Esto te proporcionó una comprensión integral de cómo encontrar e interpretar información de hardware directamente desde el sistema operativo.