Monitoreo de Uso de Espacio en Disco e Inodos: Guía Completa del Administrador de Sistemas

El monitoreo proactivo del uso de espacio en disco e inodos es fundamental para mantener sistemas Linux saludables. Quedarse sin espacio en disco o agotar los inodos puede causar fallos del sistema, caídas de aplicaciones y pérdida de datos. Comprender cómo monitorear, analizar y automatizar el monitoreo de uso de disco previene estos problemas críticos antes de que impacten los sistemas de producción.

Esta guía completa cubre todos los aspectos del monitoreo de espacio en disco e inodos, desde comandos básicos hasta soluciones avanzadas de monitoreo automatizado con alertas.

Introducción al Monitoreo de Espacio en Disco e Inodos

El monitoreo de uso de disco implica rastrear dos recursos críticos:

  1. Espacio en Disco: La cantidad de almacenamiento consumido por archivos y directorios
  2. Inodos: El número de objetos del sistema de archivos (archivos, directorios, enlaces)

Ambos recursos son finitos y pueden agotarse de forma independiente. Un sistema de archivos puede quedarse sin espacio o inodos, cualquiera de estas condiciones previniendo la creación de nuevos archivos.

¿Por Qué Monitorear el Uso de Disco?

  • Prevenir fallos del sistema: Discos llenos causan caídas de aplicaciones e inestabilidad del sistema
  • Evitar pérdida de datos: Espacio insuficiente previene el registro de logs y escrituras de datos
  • Mantener rendimiento: Sistemas de archivos llenos degradan el rendimiento
  • Planificación de capacidad: Tendencias de uso informan decisiones de infraestructura
  • Optimización de costos: Identificar desperdicio de almacenamiento en entornos cloud
  • Cumplimiento: Cumplir con políticas de retención y almacenamiento
  • Solución de problemas: Identificar rápidamente procesos que consumen espacio

Problemas Comunes de Espacio en Disco

  • Archivos de log: Logs no rotados llenando sistemas de archivos
  • Archivos temporales: Archivos temporales acumulados que no se limpian
  • Crecimiento de base de datos: Bases de datos en expansión sin monitoreo
  • Datos de usuario: Cargas de archivos de usuario sin control
  • Archivos de respaldo: Respaldos antiguos no eliminados
  • Core dumps: Volcados de core grandes de procesos caídos
  • Agotamiento de inodos: Millones de archivos pequeños consumiendo todos los inodos

Requisitos Previos

Para monitorear efectivamente el uso de disco, necesitas:

  • Comprensión básica de conceptos de sistemas de archivos Linux
  • Acceso al sistema (usuario o root dependiendo de ubicaciones monitoreadas)
  • Conocimiento de tipos de sistemas de archivos en uso
  • Comprensión de patrones de uso normales
  • Familiaridad con cron para automatización
  • Conocimiento básico de scripting para monitoreo personalizado

Comandos Básicos de Monitoreo de Espacio en Disco

Usando df: Espacio Libre en Disco

El comando df muestra el uso de espacio en disco del sistema de archivos.

Uso Básico

df -h

Salida:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   35G   13G  74% /
/dev/sda2       100G   60G   35G  63% /home
/dev/sdb1       500G  450G   26G  95% /mnt/data
tmpfs           7.8G  1.2M  7.8G   1% /dev/shm

Opciones Comunes de df

# Salida legible por humanos
df -h

# Incluir tipo de sistema de archivos
df -hT

# Mostrar inodos en lugar de bloques
df -hi

# Incluir todos los sistemas de archivos (incluyendo pseudo-sistemas de archivos)
df -ha

# Excluir tipos específicos de sistemas de archivos
df -h -x tmpfs -x devtmpfs

# Mostrar sistema de archivos específico
df -h /home

Comprender la Salida de df

  • Filesystem: Dispositivo o sistema de archivos virtual
  • Size: Capacidad total
  • Used: Espacio consumido
  • Avail: Espacio disponible
  • Use%: Porcentaje usado
  • Mounted on: Punto de montaje

Usando du: Uso de Disco

El comando du muestra el uso de disco de archivos y directorios.

Uso Básico

# Mostrar tamaño de directorio
du -sh /var/log

# Mostrar todos los subdirectorios
du -h /var/log

# Limitar profundidad
du -h --max-depth=1 /var

Encontrar Directorios Grandes

# Top 10 directorios más grandes en /var
du -h /var | sort -rh | head -10

# Mostrar tamaños para todos los subdirectorios inmediatos
du -h --max-depth=1 /var | sort -rh

# Encontrar directorios mayores a 1GB
du -h /var | awk '$1 ~ /^[0-9.]+G/ {print $0}'

Encontrar Archivos Grandes

# Encontrar archivos mayores a 100MB en /var
find /var -type f -size +100M -exec du -h {} + | sort -rh

# Top 20 archivos más grandes en directorios home
find /home -type f -exec du -h {} + | sort -rh | head -20

# Encontrar archivos mayores a 1GB en cualquier lugar
sudo find / -type f -size +1G -exec ls -lh {} \; 2>/dev/null

Analizar Directorio Específico

# Análisis detallado de /var/log
du -h /var/log | sort -rh | head -20

# Con conteo de archivos
du -sh /var/log/* | sort -rh

Monitoreo de Inodos

Comprendiendo los Inodos

Cada archivo y directorio consume un inodo. Quedarse sin inodos previene la creación de archivos incluso con espacio disponible en disco.

Verificar Uso de Inodos

# Mostrar uso de inodos
df -hi

# Mostrar uso de inodos para sistema de archivos específico
df -hi /home

Salida:

Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/sda1        3.2M   500K  2.7M   16% /
/dev/sda2        6.5M   2.5M  4.0M   39% /home
/dev/sdb1         32M    25M  6.8M   79% /mnt/data

Encontrar Directorios con Muchos Archivos

# Contar archivos en directorios
for dir in /var/*; do
    echo -n "$dir: "
    find "$dir" -type f | wc -l
done

# Encontrar directorios con más archivos
find /var -type d -exec sh -c 'echo -n "{}: "; find "{}" -maxdepth 1 -type f | wc -l' \; | sort -t: -k2 -rn | head -10

# Contar archivos en subdirectorios inmediatos
for dir in /var/log/*; do
    count=$(find "$dir" -type f 2>/dev/null | wc -l)
    echo "$count $dir"
done | sort -rn

Encontrar Sistemas de Archivos con Muchos Archivos Pequeños

# Tamaño promedio de archivo por sistema de archivos
df -h | awk 'NR>1 {print $6}' | while read mount; do
    total_size=$(du -sb "$mount" 2>/dev/null | awk '{print $1}')
    file_count=$(find "$mount" -type f 2>/dev/null | wc -l)
    if [ "$file_count" -gt 0 ]; then
        avg_size=$((total_size / file_count))
        echo "$mount: $file_count files, avg size: $(( avg_size / 1024 ))KB"
    fi
done

Monitoreo en Tiempo Real

Ver Espacio en Disco en Tiempo Real

# Actualizar cada 2 segundos
watch -n 2 'df -h'

# Monitorear sistema de archivos específico
watch -n 2 'df -h /var/log'

# Monitorear con información de inodos
watch -n 2 'df -h && echo && df -hi'

Monitorear Cambios en Uso de Disco

# Monitorear cambios de tamaño de directorio
watch -n 5 'du -sh /var/log'

# Rastrear directorio de crecimiento más rápido
watch -n 10 'du -h --max-depth=1 /var | sort -rh | head -5'

Monitorear Tasa de Creación de Archivos

# Contar archivos creados en el último minuto
watch -n 60 'find /tmp -type f -mmin -1 | wc -l'

Scripts de Monitoreo Automatizado

Script Básico de Monitoreo de Espacio en Disco

sudo nano /usr/local/bin/disk_monitor.sh
#!/bin/bash

# Disk Space Monitoring Script
THRESHOLD=80
EMAIL="[email protected]"
LOGFILE="/var/log/disk_monitor.log"

# Check each filesystem
df -H | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5 " " $6 }' | while read output;
do
    usage=$(echo $output | awk '{print $1}' | sed 's/%//g')
    partition=$(echo $output | awk '{print $2}')

    if [ $usage -ge $THRESHOLD ]; then
        timestamp=$(date '+%Y-%m-%d %H:%M:%S')
        message="$timestamp - WARNING: Disk usage on $partition is at ${usage}%"
        echo "$message" >> $LOGFILE

        # Send email alert (requires mail command)
        echo "$message" | mail -s "Disk Space Alert: $partition" $EMAIL
    fi
done

Hacer ejecutable:

sudo chmod +x /usr/local/bin/disk_monitor.sh

Programar con cron:

# Ejecutar cada hora
echo "0 * * * * /usr/local/bin/disk_monitor.sh" | sudo crontab -

Script Avanzado de Monitoreo con Verificación de Inodos

sudo nano /usr/local/bin/disk_inode_monitor.sh
#!/bin/bash

# Disk Space and Inode Monitoring Script
DISK_THRESHOLD=80
INODE_THRESHOLD=80
EMAIL="[email protected]"
LOGFILE="/var/log/disk_inode_monitor.log"

timestamp=$(date '+%Y-%m-%d %H:%M:%S')

# Check disk space
echo "[$timestamp] Disk Space Check" >> $LOGFILE
df -H | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5 " " $6 }' | while read output;
do
    usage=$(echo $output | awk '{print $1}' | sed 's/%//g')
    partition=$(echo $output | awk '{print $2}')

    if [ $usage -ge $DISK_THRESHOLD ]; then
        alert="WARNING: Disk usage on $partition is at ${usage}%"
        echo "$alert" >> $LOGFILE
        echo "$alert" | mail -s "Disk Space Alert: $partition" $EMAIL
    fi
done

# Check inode usage
echo "[$timestamp] Inode Usage Check" >> $LOGFILE
df -i | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5 " " $6 }' | while read output;
do
    usage=$(echo $output | awk '{print $1}' | sed 's/%//g')
    partition=$(echo $output | awk '{print $2}')

    if [ $usage -ge $INODE_THRESHOLD ]; then
        alert="WARNING: Inode usage on $partition is at ${usage}%"
        echo "$alert" >> $LOGFILE
        echo "$alert" | mail -s "Inode Alert: $partition" $EMAIL
    fi
done

Script de Seguimiento de Crecimiento

sudo nano /usr/local/bin/disk_growth_tracker.sh
#!/bin/bash

# Disk Growth Tracking Script
DATAFILE="/var/log/disk_growth.log"
REPORTFILE="/var/log/disk_growth_report.txt"

# Record current usage
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
df -BG | grep -vE '^Filesystem|tmpfs' | awk -v ts="$timestamp" '{print ts "," $6 "," $3}' >> $DATAFILE

# Generate weekly growth report (run on Sundays)
if [ $(date +%u) -eq 7 ]; then
    {
        echo "Weekly Disk Growth Report"
        echo "Generated: $(date)"
        echo "================================"
        echo ""

        # Calculate growth for each filesystem
        for mount in $(df | grep -vE '^Filesystem|tmpfs' | awk '{print $6}'); do
            echo "Filesystem: $mount"

            # Get data from last 7 days
            week_ago=$(date -d '7 days ago' '+%Y-%m-%d')
            current=$(grep "$mount" $DATAFILE | tail -1 | cut -d',' -f3)
            previous=$(grep "$mount" $DATAFILE | grep "$week_ago" | tail -1 | cut -d',' -f3)

            if [ -n "$current" ] && [ -n "$previous" ]; then
                growth=$((${current%G} - ${previous%G}))
                echo "  Growth: ${growth}GB in 7 days"
            fi
            echo ""
        done
    } > $REPORTFILE

    # Email report
    mail -s "Weekly Disk Growth Report" [email protected] < $REPORTFILE
fi

Script de Monitoreo de Tamaño de Directorio

sudo nano /usr/local/bin/directory_size_monitor.sh
#!/bin/bash

# Monitor specific directories for size changes
MONITORED_DIRS="/var/log /home /var/lib/mysql"
THRESHOLD_GB=10
LOGFILE="/var/log/directory_size_monitor.log"

for dir in $MONITORED_DIRS; do
    if [ -d "$dir" ]; then
        size=$(du -sb "$dir" 2>/dev/null | awk '{print $1}')
        size_gb=$((size / 1024 / 1024 / 1024))

        timestamp=$(date '+%Y-%m-%d %H:%M:%S')
        echo "$timestamp - $dir: ${size_gb}GB" >> $LOGFILE

        if [ $size_gb -ge $THRESHOLD_GB ]; then
            message="$dir has reached ${size_gb}GB"
            echo "$message" | mail -s "Directory Size Alert" [email protected]
        fi
    fi
done

Herramientas de Análisis de Espacio en Disco

Usando ncdu (NCurses Disk Usage)

Analizador interactivo de uso de disco.

Instalar:

# Debian/Ubuntu
sudo apt install ncdu

# CentOS/RHEL
sudo yum install ncdu

Uso:

# Analizar directorio
ncdu /var

# Analizar con un sistema de archivos
ncdu -x /var

# Exportar a archivo
ncdu -o /tmp/var_usage.txt /var

# Importar desde archivo
ncdu -f /tmp/var_usage.txt

Usando agedu (Age-Based Disk Usage)

Encontrar archivos antiguos y grandes.

Instalar:

sudo apt install agedu

Uso:

# Indexar directorio
agedu -s /home

# Generar reporte de archivos sin usar en 6 meses
agedu -a /home -t 180d

# Interfaz web
agedu -w --address 0.0.0.0:8000
# Acceder en http://localhost:8000

Usando baobab (Herramienta GUI)

Analizador gráfico de uso de disco.

Instalar:

sudo apt install baobab

Uso:

# Lanzar GUI
baobab /var

Limpieza de Espacio en Disco

Procedimientos de Limpieza Segura

Limpiar Caché del Gestor de Paquetes

# Debian/Ubuntu
sudo apt clean
sudo apt autoclean
sudo apt autoremove

# CentOS/RHEL
sudo yum clean all
sudo dnf clean all

Limpiar Logs de Journald

# Mantener solo últimos 7 días
sudo journalctl --vacuum-time=7d

# Mantener solo 500MB
sudo journalctl --vacuum-size=500M

# Verificar espacio liberado
du -sh /var/log/journal

Rotar y Comprimir Logs

# Forzar rotación de logs
sudo logrotate -f /etc/logrotate.conf

# Limpiar logs comprimidos antiguos
sudo find /var/log -type f -name "*.gz" -mtime +30 -delete
sudo find /var/log -type f -name "*.old" -mtime +30 -delete

Limpiar Archivos Temporales

# Limpiar /tmp (archivos mayores a 10 días)
sudo find /tmp -type f -atime +10 -delete

# Limpiar /var/tmp
sudo find /var/tmp -type f -atime +30 -delete

# Limpiar archivos temporales de systemd
sudo systemctl clean --what=cache --all

Limpiar Cachés de Usuario

# Limpiar directorios de caché de usuario
find ~/.cache -type f -atime +30 -delete

# Limpiar cachés de navegador (cuando se inicia sesión como usuario)
rm -rf ~/.cache/mozilla
rm -rf ~/.cache/google-chrome
rm -rf ~/.cache/chromium

Encontrar y Eliminar Core Dumps

# Encontrar core dumps
sudo find / -name "core.*" -type f 2>/dev/null

# Eliminar core dumps
sudo find / -name "core.*" -type f -delete 2>/dev/null

# Deshabilitar core dumps
echo "* hard core 0" | sudo tee -a /etc/security/limits.conf

Script de Limpieza Automatizada

sudo nano /usr/local/bin/disk_cleanup.sh
#!/bin/bash

# Automated Disk Cleanup Script
LOGFILE="/var/log/disk_cleanup.log"
timestamp=$(date '+%Y-%m-%d %H:%M:%S')

echo "[$timestamp] Starting cleanup" >> $LOGFILE

# Package cache
echo "Cleaning package cache..." >> $LOGFILE
apt clean 2>&1 | tee -a $LOGFILE

# Old kernels (Debian/Ubuntu)
echo "Removing old kernels..." >> $LOGFILE
apt autoremove -y 2>&1 | tee -a $LOGFILE

# Journal logs (keep 7 days)
echo "Cleaning journal logs..." >> $LOGFILE
journalctl --vacuum-time=7d 2>&1 | tee -a $LOGFILE

# Temporary files
echo "Cleaning temporary files..." >> $LOGFILE
find /tmp -type f -atime +7 -delete 2>&1 | tee -a $LOGFILE
find /var/tmp -type f -atime +30 -delete 2>&1 | tee -a $LOGFILE

# Rotate logs
echo "Rotating logs..." >> $LOGFILE
logrotate -f /etc/logrotate.conf 2>&1 | tee -a $LOGFILE

# Old compressed logs
echo "Removing old compressed logs..." >> $LOGFILE
find /var/log -name "*.gz" -mtime +60 -delete 2>&1 | tee -a $LOGFILE

# Report space freed
echo "[$timestamp] Cleanup completed" >> $LOGFILE
df -h >> $LOGFILE

# Email report
mail -s "Disk Cleanup Report" [email protected] < $LOGFILE

Programar semanalmente:

echo "0 2 * * 0 /usr/local/bin/disk_cleanup.sh" | sudo crontab -

Creación de Panel de Monitoreo

Crear Reporte Diario de Disco

sudo nano /usr/local/bin/daily_disk_report.sh
#!/bin/bash

# Daily Disk Usage Report
REPORT_FILE="/var/log/daily_disk_report_$(date +%Y%m%d).txt"

{
    echo "DISK USAGE REPORT"
    echo "Generated: $(date)"
    echo "Server: $(hostname)"
    echo "========================================"
    echo ""

    echo "FILESYSTEM USAGE:"
    echo "----------------"
    df -h | grep -vE 'tmpfs|cdrom'
    echo ""

    echo "INODE USAGE:"
    echo "------------"
    df -hi | grep -vE 'tmpfs|cdrom'
    echo ""

    echo "TOP 10 LARGEST DIRECTORIES:"
    echo "---------------------------"
    du -h --max-depth=2 / 2>/dev/null | sort -rh | head -10
    echo ""

    echo "TOP 10 LARGEST FILES:"
    echo "---------------------"
    find / -type f -exec du -h {} + 2>/dev/null | sort -rh | head -10
    echo ""

    echo "DIRECTORIES WITH MOST FILES:"
    echo "----------------------------"
    for dir in /var /home /opt; do
        echo -n "$dir: "
        find "$dir" -type f 2>/dev/null | wc -l
    done
    echo ""

} > $REPORT_FILE

# Email report
mail -s "Daily Disk Usage Report - $(hostname)" [email protected] < $REPORT_FILE

# Keep only last 30 days of reports
find /var/log -name "daily_disk_report_*.txt" -mtime +30 -delete

Solución de Problemas de Espacio en Disco

Identificar Qué Está Usando Espacio Cuando df y du No Coinciden

# Verificar archivos eliminados aún mantenidos abiertos
sudo lsof | grep deleted

# Encontrar proceso manteniendo archivo eliminado
sudo lsof +L1

# Reiniciar servicio para liberar manejadores de archivo
sudo systemctl restart service_name

Encontrar Uso de Espacio Oculto

# Verificar todos los puntos de montaje
df -h

# Verificar archivos en directorios de punto de montaje
for mount in $(df | grep -vE 'tmpfs|cdrom' | awk '{print $6}'); do
    echo "Checking: $mount"
    sudo umount "$mount" 2>/dev/null && \
    du -sh "$mount" && \
    sudo mount "$mount"
done

Investigar Pérdida Súbita de Espacio

# Encontrar archivos grandes creados recientemente
sudo find / -type f -size +100M -mtime -1 -exec ls -lh {} \; 2>/dev/null

# Encontrar archivos modificados en la última hora
sudo find / -type f -mmin -60 -size +10M 2>/dev/null

# Verificar logs del sistema para pistas
sudo journalctl --since "1 hour ago" | grep -i error

Mejores Prácticas

1. Configurar Monitoreo Proactivo

No esperar alertas de disco lleno:

# Monitorear en umbral de 80%, no 95%
THRESHOLD=80

2. Monitorear Tendencias de Crecimiento

Rastrear uso a lo largo del tiempo:

# Instantáneas diarias para análisis de tendencias
echo "0 0 * * * df -h >> /var/log/disk_usage_$(date +\%Y\%m).log" | crontab -

3. Implementar Rotación de Logs

Configurar logrotate correctamente:

sudo nano /etc/logrotate.d/custom_app
/var/log/custom_app/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
}

4. Programaciones Regulares de Limpieza

Automatizar tareas de limpieza:

# Limpieza semanal cada domingo a las 2 AM
0 2 * * 0 /usr/local/bin/disk_cleanup.sh

5. Usar Particiones Separadas

Aislar áreas de alto crecimiento:

  • Partición /var/log separada
  • Partición /home separada
  • Partición /tmp separada
  • Particiones de datos de aplicación separadas

6. Configurar Alertas en Múltiples Umbrales

# Advertencia en 75%, crítico en 90%
WARNING_THRESHOLD=75
CRITICAL_THRESHOLD=90

7. Documentar Patrones de Uso Normal

Conocer tu línea base:

# Reporte mensual de uso
df -h > /root/disk_usage_baseline_$(date +%Y%m).txt

8. Monitorear Uso de Inodos

No olvidar los inodos:

# Incluir verificaciones de inodos en monitoreo
df -hi

9. Mantener Datos Históricos

Mantener historial de uso:

# Archivar reportes mensuales
mkdir -p /var/log/disk_history
mv /var/log/disk_usage_*.log /var/log/disk_history/

10. Probar Procedimientos de Limpieza

Verificar que los scripts de limpieza funcionan:

# Probar en no-producción primero
# Verificar que se eliminan archivos esperados
# Confirmar que el espacio se libera realmente

Conclusión

El monitoreo efectivo de espacio en disco e inodos es crítico para mantener sistemas Linux saludables. Al implementar monitoreo proactivo, alertas automatizadas, procedimientos regulares de limpieza y análisis de tendencias, previenes emergencias de disco lleno y mantienes un rendimiento óptimo del sistema.

Conclusiones clave:

  1. Monitorear tanto espacio como inodos - cualquiera puede agotarse
  2. Establecer umbrales de alerta en 75-80%, no 95%
  3. Automatizar monitoreo con scripts y trabajos cron
  4. Rastrear tendencias de crecimiento a lo largo del tiempo para planificación de capacidad
  5. Implementar rotación de logs para prevenir crecimiento de archivos de log
  6. Programar limpieza regular de archivos temporales y cachés
  7. Usar herramientas apropiadas - df, du, ncdu para diferentes necesidades
  8. Documentar líneas base para patrones de uso normal
  9. Probar procedimientos de limpieza antes de emergencias
  10. Mantener datos históricos para análisis de tendencias

Recuerda que el monitoreo de disco no se trata solo de prevenir discos llenos—se trata de comprender el comportamiento del sistema, optimizar el uso de almacenamiento y planificar para futuras necesidades de capacidad. Siguiendo las prácticas y scripts de esta guía, puedes implementar monitoreo completo de disco que mantenga tu infraestructura Linux funcionando sin problemas.

El monitoreo proactivo previene la lucha reactiva contra incendios. Invierte tiempo en infraestructura de monitoreo adecuada ahora para evitar caídas críticas después.