Antes de tocar una partición, redimensionar un volumen o diagnosticar por qué el disco está al 98%, necesitas un mapa fiable de lo que tienes. Linux expone toda esa información a través de varios comandos que operan en capas distintas: la capa de dispositivos de bloque, la capa de particionado y la capa de sistemas de ficheros montados. Entender qué capa interroga cada herramienta es lo que te permite no perderte cuando los números no cuadran.
lsblk lee /sys/block y te muestra el árbol completo de dispositivos de bloque: discos físicos, sus particiones, y encima de ellas cualquier capa lógica como LVM o LUKS. No requiere root y no abre los dispositivos, por eso es el punto de partida ideal: rápido, seguro y no perturba nada. fdisk y parted van un nivel más abajo: leen la tabla de particiones directamente del disco. La diferencia importante es que fdisk fue diseñado para MBR y tiene soporte limitado para GPT, mientras que parted entiende GPT de forma nativa, lo que lo hace imprescindible en discos mayores de 2 TB o en sistemas UEFI donde GPT es el estándar. Ya en la capa de sistemas de ficheros montados, df le pregunta al kernel cuánto espacio está disponible en cada punto de montaje, y du camina el árbol de directorios contando bloques reales.
El momento de usar estas herramientas es cualquier diagnóstico de disco: un disco nuevo que añadir al sistema, investigar por qué /var está lleno, preparar un servidor antes de hacer un particionado. Lo que se rompe si confundes las capas es el diagnóstico: df puede gritar que el disco está al 100% mientras du muestra que los directorios sólo suman el 60%. Esa discrepancia no es un bug, es un comportamiento deliberado del kernel: cuando un proceso tiene abierto un descriptor de fichero sobre un fichero que ya se borró del directorio, el bloque sigue ocupado en el sistema de ficheros hasta que ese proceso cierra el fd. df ve los bloques del filesystem; du sólo ve lo que tiene nombre en el árbol de directorios. El fichero borrado-pero-abierto es invisible para du y perfectamente visible para df. La herramienta para encontrarlo es lsof.
# ── 1. Vista general del sistema de bloques ────────────────────────────── lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,UUID # Salida típica en un servidor con un SSD y LVM: # NAME SIZE TYPE FSTYPE MOUNTPOINT UUID # sda 500G disk # ├─sda1 512M part vfat /boot/efi A1B2-C3D4 # ├─sda2 488M part ext4 /boot a1b2c3d4-... # └─sda3 499G part LVM2_member e5f6a7b8-... # ├─vg0-root 50G lvm ext4 / ... # ├─vg0-var 100G lvm ext4 /var ... # └─vg0-home 349G lvm ext4 /home ... # ── 2. Tabla de particiones detallada (requiere root) ──────────────────── sudo fdisk -l /dev/sda # Para GPT o discos >2TB usa parted: sudo parted -l # ── 3. Espacio usado en filesystems montados ───────────────────────────── df -h # -h = human-readable (GiB/MiB). La columna "Use%" es lo que mira # cualquier sistema de alertas. Fíjate en /var y /home primero # en servidores web o de logs. # ── 4. Cuánto ocupa un directorio concreto ─────────────────────────────── du -sh /var/log # ── 5. Qué subdirectorio es el culpable ────────────────────────────────── du -sh /var/log/* | sort -rh | head -10 # sort -rh ordena por tamaño humano descendente. El primer resultado # es el directorio o fichero más gordo. # ── 6. Detectar la discrepancia df vs du ───────────────────────────────── # Si df dice que /var está al 95% pero du no llega ni al 60%: sudo lsof /var | grep deleted # Muestra procesos con fd abierto sobre ficheros ya borrados del árbol. # La columna SIZE indica cuánto espacio siguen reteniendo. # Para liberar ese espacio sin reiniciar el proceso, a veces basta con # truncar el fichero a través del fd (ver /proc/<pid>/fd/<n>), # aunque lo más limpio es reiniciar el servicio correspondiente. # Alternativa si el fichero borrado no está en un mount concreto: sudo lsof | grep '(deleted)' # ── 7. Exploración interactiva con ncdu ────────────────────────────────── # ncdu no viene instalado por defecto: sudo apt install ncdu # Escanear /var (como root para ver todo): sudo ncdu /var # Dentro de ncdu: flechas para navegar, 'd' para borrar, # 'q' para salir. Mucho más rápido que du recursivo manual.
Lo que está pasando en cada paso
Paso 1: las columnas que pedimos con -o no son decorativas. FSTYPE te dice si una partición es ext4, vfat, o LVM2_member (es decir, un Physical Volume de LVM). UUID es lo que realmente usa /etc/fstab para montar de forma estable, no /dev/sda3 que puede cambiar si añades un disco. Cuando ves una partición sin MOUNTPOINT pero con FSTYPE, normalmente es LVM o swap sin activar.
Paso 2: fdisk -l /dev/sda te da el tipo de tabla (MBR o GPT), el tamaño de sector y los flags de cada partición. En un sistema UEFI verás una partición de tipo “EFI System” al principio. Si sólo ves “DOS” en el tipo de tabla con un disco de 3 TB, hay un problema: MBR no puede direccionar más de 2 TiB, y parte del disco será invisible. parted -l es más explícito con GPT y además lista todos los discos del sistema de una vez.
Paso 3: el df -h de la línea 24 te muestra el filesystem real que usa cada punto de montaje. El porcentaje de uso que imprime df incluye la reserva del 5% que mke2fs deja por defecto en ext4 para root —ese espacio no aparece como “disponible” para usuarios normales, pero sí existe y df lo descuenta del total efectivo. En discos de datos grandes esa reserva es un desperdicio y se puede reducir con tune2fs -m 1 /dev/vg0/data.
Paso 4 y 5: du -sh con glob y sort -rh es el patrón que más uso en producción. El -s (summarize) evita que du entre recursivamente en cada subdirectorio y llene la pantalla; el glob * expande el nivel que te interesa. Combinado con head -10 te da el ranking de los diez directorios más pesados sin tener que leer páginas de salida.
Paso 6: la línea con lsof /var | grep deleted merece atención. Lo que ves en la columna FD es el número de descriptor, y en SIZE el tamaño del fichero que sigue reteniendo bloques. El caso más frecuente en producción es un servicio de logs (nginx, postgresql, aplicación Java) que sigue escribiendo en un fichero que logrotate ya movió o borró. El proceso mantiene el fd abierto porque nadie le ha dicho que lo cierre. Reiniciar el servicio o enviarle SIGHUP (si relee su configuración de logs al recibirlo) libera esos bloques inmediatamente. La variante sudo lsof | grep '(deleted)' sin especificar directorio es más lenta pero útil cuando no sabes en qué filesystem está el fichero fantasma.
Paso 7: ncdu hace internamente lo mismo que du recursivo, pero con una TUI que te permite navegar el árbol y borrar directorios directamente. La diferencia práctica es que cuando tienes /var con miles de subdirectorios, ncdu escanea una vez y te deja explorar sin relanzar du repetidamente. Ejecutarlo con sudo es importante porque sin privilegios los directorios de root o de servicios aparecerán como “Access denied” y sus tamaños no se contabilizarán, lo que te daría cifras incorrectas para el diagnóstico.
N° 86