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:
- Espacio en Disco: La cantidad de almacenamiento consumido por archivos y directorios
- 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:
- Monitorear tanto espacio como inodos - cualquiera puede agotarse
- Establecer umbrales de alerta en 75-80%, no 95%
- Automatizar monitoreo con scripts y trabajos cron
- Rastrear tendencias de crecimiento a lo largo del tiempo para planificación de capacidad
- Implementar rotación de logs para prevenir crecimiento de archivos de log
- Programar limpieza regular de archivos temporales y cachés
- Usar herramientas apropiadas - df, du, ncdu para diferentes necesidades
- Documentar líneas base para patrones de uso normal
- Probar procedimientos de limpieza antes de emergencias
- 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.


