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.
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.



