Introducción

Hola Fronters 👋

Llegamos a la cuarta entrega de nuestra serie sobre monitorización de hardware en Linux. Hoy toca el turno del almacenamiento — discos, particiones, uso de espacio, rendimiento de I/O y salud de los dispositivos.

Un buen monitoreo de almacenamiento te permite anticipar falta de espacio, detectar discos defectuosos antes de que fallen y optimizar el rendimiento de lecturas/escrituras. Vamos a cubrir las herramientas esenciales.

1. df — Espacio en sistemas de archivos

El comando rey para ver el uso de disco a nivel de sistema de archivos:

$ df -h
S.archivo     Tipo     Tamaño  Usado  Disp  Uso%  Montado en
/dev/sda1     ext4       100G   45G    55G   45%  /
/dev/sdb1     ext4       500G  320G   180G   64%  /datos
tmpfs         tmpfs      7.9G   2.1G   5.8G   27%  /dev/shm

Flags útiles:

  • -h → formato humano (MB/GB)
  • -T → muestra el tipo de sistema de archivos
  • --total → suma total al final
  • -i → muestra uso de inodos (importante en sistemas con muchos archivos pequeños)

Tip: Un sistema puede tener espacio libre pero quedarse sin inodos. Siempre revisa ambos con df -hi.

2. du — Uso de espacio por directorio

Para encontrar qué directorios están consumiendo más espacio:

$ du -sh /var/log
2.3G    /var/log

$ du -sh /var/log/*
12M     /var/log/apache2
34M     /var/log/mysql
2.1G    /var/log/syslog
45M     /var/log/nginx

Comandos prácticos:

  • du -sh * → resumen de cada directorio en el directorio actual
  • du -sh /* | sort -rh | head -10 → los 10 directorios que más pesan en raíz
  • du -sh /var/log/*.gz → espacio usado por logs comprimidos

Tip: du puede tardar en discos grandes. Combínalo con ncdu para una interfaz interactiva mucho más rápida.

3. lsblk — Dispositivos de bloque

Muestra todos los discos y particiones en un árbol:

$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 119.2G  0 disk
├─sda1   8:1    0   100G  0 part /
├─sda2   8:2    0     1K  0 part
└─sda5   8:5    0  19.2G  0 part [SWAP]
sdb      8:16   0 465.8G  0 disk
└─sdb1   8:17   0 465.8G  0 part /datos
nvme0n1 259:0   0 931.5G  0 disk
└─nvme0n1p1 259:1 0 931.5G  0 part /backup

Flags útiles:

  • lsblk -f → muestra sistema de archivos y UUID
  • lsblk -m → muestra permisos y propietario

4. fdisk — Gestión de particiones

Para un vistazo detallado a las tablas de particiones:

$ sudo fdisk -l /dev/sda
Disk /dev/sda: 119.24 GiB, 128035676160 bytes, 250069680 sectors
Disk model: SanDisk SSD PLUS
Units: sectors of 1 * 512 = 512 bytes
Device     Boot   Start       End   Sectors  Size  Id  Type
/dev/sda1  *       2048 209717247 209715200  100G  83  Linux
/dev/sda2      209719294 250068991  40349698  19.2G   5  Extended
/dev/sda5      209719296 250068991  40349696  19.2G  82  Linux swap

5. blkid — UUID y tipo de sistema de archivos

$ blkid
/dev/sda1: UUID="a1b2c3d4-..." TYPE="ext4" PARTUUID="12345678-01"
/dev/sdb1: UUID="e5f6g7h8-..." TYPE="xfs" PARTUUID="87654321-01"
/dev/nvme0n1p1: UUID="i9j0k1l2-..." TYPE="ext4" PARTUUID="abcdef01-01"

Esencial para configurar /etc/fstab correctamente.

6. iostat — Rendimiento de I/O

iostat es la herramienta estrella para medir el rendimiento de los discos:

$ iostat -x 2 3
Device            r/s     w/s    rkB/s    wkB/s  await  svctm  %util
sda             45.2    67.8   5678.9  12345.6   4.5   0.8   45.6
sdb            123.4   234.5  23456.7  45678.9  12.3   2.1   78.9

Columnas clave:

  • r/s / w/s: Operaciones de lectura/escritura por segundo
  • rkB/s / wkB/s: Kilobytes leídos/escritos por segundo
  • await: Tiempo promedio de respuesta (ms) — incluye cola
  • svctm: Tiempo de servicio promedio (ms)
  • %util: Porcentaje de tiempo que el disco estuvo ocupado

Regla de oro: Si %util se acerca a 100% y await es alto (>30ms para HDD, >5ms para SSD), el disco es un cuello de botella.

7. iotop — I/O por proceso

¿Qué procesos están escribiendo o leyendo del disco? iotop te lo muestra en tiempo real:

$ sudo iotop -o
Total DISK READ: 12.34 M/s | Total DISK WRITE: 45.67 M/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
 2345 be/4  mysql      5.67 M/s   23.45 M/s  0.00 %   12.34 %  mysqld
 3456 be/4  rsync      3.45 M/s   12.34 M/s  0.00 %    8.90 %  rsync
 1234 be/4  root       1.23 M/s    4.56 M/s  0.00 %    3.45 %  apache2

Tip: Usa iotop -o para mostrar solo procesos con actividad activa de I/O.

8. smartctl — Salud del disco (SMART)

Los discos modernos tienen tecnología SMART que permite predecir fallos:

$ sudo smartctl -a /dev/sda
=== START OF INFORMATION SECTION ===
Model Family:     SanDisk SSD PLUS
Device Model:     SanDisk SDSSDA-120G
Serial Number:    123456789ABC
Firmware Version: X2310RL
User Capacity:    128,035,676,160 bytes [128 GB]
Sector Size:      512 bytes logical/physical
Rotation Rate:    Solid State Device

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

ID# ATTRIBUTE_NAME          FLAG    VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  Always       -       0
  9 Power_On_Hours          0x0032   099   099   000    Old_age   Always       -       12345
 12 Power_Cycle_Count       0x0032   099   099   000    Old_age   Always       -       567
177 Wear_Leveling_Count     0x0013   098   098   000    Pre-fail  Always       -       89
194 Temperature_Celsius     0x0022   067   063   000    Old_age   Always       -       33

Qué monitorear:

  • Reallocated_Sector_Ct: Sectores reasignados. Si crece o es > 0, el disco está degradándose.
  • Temperature_Celsius: Temperatura del disco. > 55°C sostenido es preocupante.
  • Wear_Leveling_Count (SSD): Desgaste del SSD. Cerca de 0 = fin de vida útil.
  • Power_On_Hours: Horas encendido.

Para un test rápido de salud:

$ sudo smartctl -H /dev/sda
SMART overall-health self-assessment test result: PASSED

9. /proc/diskstats — Estadísticas del kernel

Como siempre, el kernel expone toda la información en /proc:

$ cat /proc/diskstats
   8       0 sda 123456 234567 9876543 456789 654321 789012 12345678 345678 0 456789 678901
   8      16 sdb 234567 345678 10987654 567890 765432 890123 23456789 456789 0 567890 789012

Campos (por dispositivo): major, minor, nombre, reads completadas, reads mergeadas, sectores leídos, tiempo de lectura (ms), writes completadas, writes mergeadas, sectores escritos, tiempo de escritura (ms), I/Os en progreso, tiempo de I/O (ms), weighted time de I/O (ms).

Útil para scripts de monitoreo personalizados.

10. fsck — Revisión del sistema de archivos

Para verificar la integridad del sistema de archivos:

$ sudo fsck -f /dev/sda1
fsck from util-linux 2.34
e2fsck 1.45.6 (20-Mar-2020)
Paso 1: Verificando nodos-i, bloques y tamaños
Paso 2: Verificando la estructura de directorios
Paso 3: Verificando la conectividad de directorios
Paso 4: Verificando contadores de referencia
Paso 5: Revisando suma de grupo
/dev/sda1: 123456/6553600 ficheros (0.1% no contiguos), 12345678/26214400 bloques

Importante: El disco debe estar desmontado o montado como solo lectura para ejecutar fsck.

11. dmesg — Errores de disco del kernel

El kernel reporta errores de disco en el ring buffer:

$ dmesg | grep -i "error\|fail\|bad\|disk"
[12345.678901] sd 0:0:0:0: [sda] Unhandled error code
[12345.678902] sd 0:0:0:0: [sda] CDB: Read(10): 28 00 00 00 00 00 00 00 00 00
[23456.789012] ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen
[23456.789015] ata1.00: failed command: READ DMA

Si ves mensajes como estos, el disco está fallando o el cable tiene problemas. Actúa de inmediato.

Conclusión

Hemos cubierto las herramientas fundamentales para monitorizar el almacenamiento en Linux:

  • Uso de espacio con df y du
  • Identificación de dispositivos con lsblk, fdisk, blkid
  • Rendimiento de I/O con iostat e iotop
  • Salud del disco con smartctl
  • Integridad del sistema de archivos con fsck
  • Estadísticas crudas del kernel via /proc/diskstats y errores con dmesg

Con todo esto, estás preparado para mantener cualquier servidor Linux funcionando sin problemas de almacenamiento. ¡Un sysadmin informado vale por dos!

No olvides dejar tu ❤️, comentar y compartir para que llegue a más Fronters 💪