Cuotas de Disco en Linux: Guía Completa de Implementación
Las cuotas de disco son esenciales para gestionar los recursos de almacenamiento en entornos multiusuario, evitando que un solo usuario o grupo consuma un espacio de disco excesivo. Ya sea que estés administrando un servidor de hosting compartido, un laboratorio de computación universitario o un servidor de archivos corporativo, implementar cuotas de disco garantiza una asignación justa de recursos y previene el agotamiento del almacenamiento.
Esta guía completa cubre la implementación completa de cuotas de disco en Linux, desde cuotas básicas de usuario hasta cuotas avanzadas de grupo, períodos de gracia y monitoreo automatizado.
Introducción a las Cuotas de Disco
Las cuotas de disco permiten a los administradores de sistemas limitar la cantidad de espacio en disco y el número de archivos (inodos) que los usuarios y grupos pueden consumir en un sistema de archivos. Las cuotas se pueden configurar con límites duros (máximo absoluto) y límites blandos (advertencias con períodos de gracia).
¿Por Qué Implementar Cuotas de Disco?
- Prevenir el agotamiento del almacenamiento: Evitar que usuarios individuales llenen el almacenamiento compartido
- Asignación justa de recursos: Garantizar una distribución equitativa del espacio en disco
- Planificación de capacidad: Predecir y gestionar mejor el crecimiento del almacenamiento
- Control de costos: Gestionar los costos de almacenamiento en entornos de cloud y hosting compartido
- Seguridad: Limitar el daño de cuentas comprometidas o procesos descontrolados
- Cumplimiento: Cumplir con las políticas organizacionales de uso de recursos
Casos de Uso Comunes de Cuotas
- Servidores de hosting compartido: Limitar el uso de disco de clientes por cuenta
- Sistemas universitarios: Restringir los tamaños de directorios home de estudiantes
- Servidores de archivos corporativos: Asignar presupuestos de almacenamiento departamental
- Servidores de correo: Limitar tamaños de buzones
- Hosting web: Controlar el consumo de almacenamiento de sitios web
- Entornos de desarrollo: Gestionar asignaciones de almacenamiento de proyectos
- Directorios home: Evitar que los usuarios llenen las particiones home
Terminología de Cuotas
- Límite blando: Umbral de advertencia; se puede exceder temporalmente
- Límite duro: Máximo absoluto que no se puede exceder
- Período de gracia: Tiempo que los usuarios pueden exceder los límites blandos antes de la aplicación
- Cuota de bloques: Límites en el espacio de disco (medido en bloques/kilobytes)
- Cuota de inodos: Límites en el número de archivos y directorios
- Cuota de usuario: Límites por usuario
- Cuota de grupo: Límites por grupo
Requisitos Previos
Antes de implementar cuotas de disco, asegúrate de tener:
- Acceso root o sudo en el sistema Linux
- Sistema de archivos que soporte cuotas (ext4, XFS, Btrfs)
- Herramientas de cuotas instaladas
- Usuarios y grupos configurados en el sistema
- Comprensión de los tamaños de bloque del sistema de archivos
- Respaldo de datos críticos antes de habilitar cuotas
Sistemas de Archivos Compatibles
La mayoría de los sistemas de archivos modernos de Linux soportan cuotas:
- ext3/ext4: Soporte completo para cuotas de usuario y grupo
- XFS: Soporte completo con cuotas de proyecto adicionalmente
- Btrfs: Soporte limitado de cuotas (cuotas de subvolumen)
- ReiserFS: Soporta cuotas (menos común)
Paso 1: Instalar Herramientas de Cuotas
En Debian/Ubuntu
sudo apt update
sudo apt install quota quotatool
En CentOS/RHEL/Rocky Linux
sudo yum install quota
# o
sudo dnf install quota
Verificar la Instalación
quota --version
Salida esperada:
Quota utilities version 4.05
Paso 2: Habilitar Cuotas en fstab
Las cuotas deben habilitarse a nivel de montaje del sistema de archivos.
Respaldar fstab
sudo cp /etc/fstab /etc/fstab.backup.$(date +%Y%m%d)
Editar fstab
sudo nano /etc/fstab
Agregar Opciones de Cuota
Para cuotas de usuario solamente:
UUID=your-uuid /home ext4 defaults,usrquota 0 2
Para cuotas de usuario y grupo:
UUID=your-uuid /home ext4 defaults,usrquota,grpquota 0 2
Para sistema de archivos XFS:
UUID=your-uuid /home xfs defaults,usrquota,grpquota 0 2
Ejemplo de fstab con Cuotas
# /etc/fstab
# Partición root
UUID=root-uuid / ext4 defaults,errors=remount-ro 0 1
# Partición home con cuotas
UUID=home-uuid /home ext4 defaults,usrquota,grpquota 0 2
# Partición de datos con cuotas
UUID=data-uuid /mnt/data ext4 defaults,usrquota,grpquota 0 2
Aplicar Cambios en fstab
Para sistemas de archivos ext3/ext4, remontar:
sudo mount -o remount /home
O para todos los sistemas de archivos:
sudo mount -a
Verificar opciones de cuota:
mount | grep /home
La salida debe mostrar:
/dev/sdb1 on /home type ext4 (rw,relatime,quota,usrquota,grpquota)
Paso 3: Crear Archivos de Base de Datos de Cuotas
Para Sistemas de Archivos ext3/ext4
Crear archivos de base de datos de cuotas:
# Crear archivos de cuota para /home
sudo quotacheck -cugm /home
Opciones explicadas:
- -c: Crear archivos de cuota
- -u: Verificar cuotas de usuario
- -g: Verificar cuotas de grupo
- -m: No intentar remontar como solo lectura
Esto crea dos archivos:
/home/aquota.user(cuotas de usuario)/home/aquota.group(cuotas de grupo)
Para Sistemas de Archivos XFS
XFS maneja los archivos de cuota internamente, no se necesita quotacheck:
# Simplemente habilitar cuotas
sudo xfs_quota -x -c 'state' /home
Verificar Archivos de Cuota
ls -la /home/aquota.*
Salida:
-rw------- 1 root root 8192 Jan 11 10:30 /home/aquota.group
-rw------- 1 root root 8192 Jan 11 10:30 /home/aquota.user
Paso 4: Habilitar Sistema de Cuotas
Para ext3/ext4
Activar el sistema de cuotas:
sudo quotaon -v /home
Salida:
/dev/sdb1 [/home]: group quotas turned on
/dev/sdb1 [/home]: user quotas turned on
Para XFS
Las cuotas se habilitan automáticamente cuando se montan con opciones de cuota.
Verificar:
sudo xfs_quota -x -c 'state' /home
Verificar Estado de Cuotas
sudo quotaon -p /home
O:
sudo repquota -s /home
Paso 5: Establecer Cuotas de Usuario
Hay dos métodos para establecer cuotas: editor interactivo o línea de comandos.
Método 1: Editor Interactivo (edquota)
# Editar cuota para el usuario 'john'
sudo edquota -u john
Esto abre un editor con:
Disk quotas for user john (uid 1001):
Filesystem blocks soft hard inodes soft hard
/dev/sdb1 0 500000 1000000 0 0 0
Campos explicados:
- blocks: Uso actual (1 bloque = 1KB típicamente)
- soft: Límite blando para bloques (500MB en el ejemplo)
- hard: Límite duro para bloques (1GB en el ejemplo)
- inodes: Número actual de archivos/directorios
- soft: Límite blando para inodos (0 = ilimitado)
- hard: Límite duro para inodos (0 = ilimitado)
Establecer límites:
Disk quotas for user john (uid 1001):
Filesystem blocks soft hard inodes soft hard
/dev/sdb1 0 512000 1048576 0 5000 10000
Esto establece:
- Límite blando: 500MB (512000 KB)
- Límite duro: 1GB (1048576 KB)
- Inodo blando: 5000 archivos
- Inodo duro: 10000 archivos
Guardar y salir.
Método 2: Línea de Comandos (setquota)
# Establecer cuota para el usuario john
# Formato: setquota -u username block_soft block_hard inode_soft inode_hard filesystem
sudo setquota -u john 512000 1048576 5000 10000 /home
Para 1GB blando, 2GB duro, 10000 archivos blando, 20000 duro:
sudo setquota -u john 1048576 2097152 10000 20000 /home
Establecer Cuotas en Formato Legible para Humanos
Usando quotatool (si está instalado):
# Establecer 500MB blando, 1GB duro
sudo quotatool -u john -bq 500M -l '1G' /home
Verificar Cuota de Usuario
sudo quota -vs john
O:
sudo repquota -s -u /home
Paso 6: Establecer Cuotas de Grupo
Similar a las cuotas de usuario pero para grupos.
Editor Interactivo
sudo edquota -g developers
Línea de Comandos
# Establecer cuota para el grupo 'developers'
# 5GB blando, 10GB duro, 50000 archivos blando, 100000 duro
sudo setquota -g developers 5242880 10485760 50000 100000 /home
Verificar Cuota de Grupo
sudo quota -g developers
Paso 7: Establecer Períodos de Gracia
Los períodos de gracia definen cuánto tiempo los usuarios pueden exceder los límites blandos.
Establecer Período de Gracia
# Editar período de gracia
sudo edquota -t
El editor predeterminado muestra:
Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
Filesystem Block grace period Inode grace period
/dev/sdb1 7days 7days
Períodos de gracia comunes:
7days(predeterminado)168hours10080minutes0(sin período de gracia)
Cambiar a 14 días:
Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
Filesystem Block grace period Inode grace period
/dev/sdb1 14days 14days
Establecer Período de Gracia por Comando
# Establecer período de gracia de 7 días
sudo setquota -t 604800 604800 /home
Paso 8: Copiar Cuotas Entre Usuarios
Aplicar los mismos límites de cuota a múltiples usuarios.
Copiar Cuota de Usuario Plantilla
# Establecer cuota para usuario plantilla
sudo setquota -u template_user 1048576 2097152 10000 20000 /home
# Copiar a otros usuarios
sudo edquota -p template_user -u user1 user2 user3
Copiar a Todos los Usuarios en un Grupo
# Obtener usuarios en el grupo
USERS=$(getent group developers | cut -d: -f4 | tr ',' ' ')
# Copiar cuota a cada usuario
for user in $USERS; do
sudo edquota -p template_user -u $user
done
Paso 9: Monitorear Uso de Cuotas
Verificar Uso de Cuota de Usuario
Usuario verificando su propia cuota:
quota -vs
Administrador verificando cuota de usuario:
sudo quota -vs john
Generar Informes de Cuotas
Resumen de todos los usuarios:
sudo repquota -s /home
Salida:
*** Report for user quotas on device /dev/sdb1
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 20K 0K 0K 2 0 0
john -- 450M 500M 1G 4500 5000 10000
mary +- 520M 500M 1G 6days 5200 5000 10000
bob -- 200M 500M 1G 2000 5000 10000
Leyenda:
--: Dentro de los límites+-: Límite blando excedido (en período de gracia)++: Límite blando excedido (período de gracia expirado)
Informe detallado:
sudo repquota -aug /home
Verificar Cuota para Usuario Específico
sudo quota -u john -s
Listar Usuarios que Exceden la Cuota
sudo repquota /home | awk '$3 > 0 && $5 != "0" { print $1, $3, $5 }'
Gestión Automatizada de Cuotas
Crear Script de Monitoreo de Cuotas
sudo nano /usr/local/bin/quota_monitor.sh
Agregar contenido:
#!/bin/bash
# Script de monitoreo de cuotas
THRESHOLD=90
FILESYSTEM="/home"
LOGFILE="/var/log/quota_monitor.log"
# Función para enviar alerta
send_alert() {
local user=$1
local usage=$2
echo "$(date): WARNING - User $user at ${usage}% quota usage" >> $LOGFILE
# Descomentar para enviar email
# echo "User $user has reached ${usage}% of quota" | mail -s "Quota Alert" [email protected]
}
# Verificar todos los usuarios
repquota -u $FILESYSTEM | awk 'NR>5 {
if ($4 > 0 && $3 > 0) {
usage = ($3 / $4) * 100
if (usage >= '$THRESHOLD') {
print $1, usage
}
}
}' | while read user usage; do
send_alert $user $usage
done
Hacer ejecutable:
sudo chmod +x /usr/local/bin/quota_monitor.sh
Automatizar con Cron
# Ejecutar diariamente a las 9 AM
echo "0 9 * * * /usr/local/bin/quota_monitor.sh" | sudo crontab -
Crear Script de Informe de Cuotas
sudo nano /usr/local/bin/quota_report.sh
#!/bin/bash
# Generar informe de uso de cuotas
FILESYSTEM="/home"
REPORT_FILE="/var/log/quota_report_$(date +%Y%m%d).txt"
echo "Quota Usage Report - $(date)" > $REPORT_FILE
echo "======================================" >> $REPORT_FILE
echo "" >> $REPORT_FILE
repquota -s $FILESYSTEM >> $REPORT_FILE
# Encontrar los 10 usuarios principales por uso de disco
echo "" >> $REPORT_FILE
echo "Top 10 Users by Disk Usage:" >> $REPORT_FILE
echo "======================================" >> $REPORT_FILE
repquota -u $FILESYSTEM | sort -k3 -n -r | head -n 15 >> $REPORT_FILE
echo "Report saved to: $REPORT_FILE"
Hacer ejecutable y programar:
sudo chmod +x /usr/local/bin/quota_report.sh
echo "0 0 * * 0 /usr/local/bin/quota_report.sh" | sudo crontab - # Semanalmente los domingos
Características Avanzadas de Cuotas
Cuotas de Proyecto (Solo XFS)
XFS soporta cuotas de proyecto para árboles de directorios.
Habilitar Cuotas de Proyecto
Editar fstab:
UUID=xfs-uuid /data xfs defaults,prjquota 0 2
Remontar:
sudo mount -o remount /data
Crear Proyecto
Definir proyecto en /etc/projects:
echo "100:/data/project1" | sudo tee -a /etc/projects
Definir nombre de proyecto en /etc/projid:
echo "project1:100" | sudo tee -a /etc/projid
Establecer Cuota de Proyecto
# Inicializar proyecto
sudo xfs_quota -x -c 'project -s project1' /data
# Establecer cuota (5GB)
sudo xfs_quota -x -c 'limit -p bhard=5g project1' /data
Verificar Cuota de Proyecto
sudo xfs_quota -x -c 'report -pbh' /data
Advertencias de Cuotas y Notificaciones de Usuario
Crear script de notificación de usuario:
sudo nano /usr/local/bin/quota_notify_users.sh
#!/bin/bash
FILESYSTEM="/home"
THRESHOLD=80
repquota -u $FILESYSTEM | awk 'NR>5 {
if ($4 > 0 && $3 > 0) {
usage = ($3 / $4) * 100
if (usage >= '$THRESHOLD') {
print $1, $3, $4, int(usage)
}
}
}' | while read user used limit percentage; do
# Enviar advertencia al usuario
echo "Your disk usage is at ${percentage}%. Used: ${used}KB of ${limit}KB. Please clean up old files." | \
write $user 2>/dev/null || \
mail -s "Disk Quota Warning" $user <<EOF
Your disk quota is at ${percentage}% capacity.
Current usage: ${used} KB
Quota limit: ${limit} KB
Please remove unnecessary files to free up space.
EOF
done
Solución de Problemas Comunes
Problema: Quotacheck Falla
Causa: Sistema de archivos montado, o cuota ya habilitada.
Solución:
# Deshabilitar cuotas primero
sudo quotaoff -av
# Desmontar sistema de archivos (si es posible)
sudo umount /home
# Ejecutar quotacheck
sudo quotacheck -cugm /home
# Remontar y habilitar cuotas
sudo mount /home
sudo quotaon -av
Problema: Cuotas No Se Aplican
Causa: Cuotas no habilitadas en el sistema de archivos.
Solución:
# Verificar si las cuotas están activadas
sudo quotaon -p /home
# Si están desactivadas, activar
sudo quotaon -v /home
# Verificar opciones de montaje
mount | grep /home
Problema: "Quota file not found"
Causa: Archivos de base de datos de cuotas faltantes.
Solución:
# Recrear archivos de cuota
sudo quotaoff /home
sudo quotacheck -cugm /home
sudo quotaon -v /home
Problema: Usuario No Puede Escribir a Pesar de Cuota Disponible
Causa: Límite de inodos alcanzado.
Solución:
# Verificar uso de inodos
sudo quota -vs username
# Aumentar límites de inodos si es necesario
sudo setquota -u username 1048576 2097152 20000 40000 /home
Problema: Período de Gracia No Funciona
Causa: Período de gracia no establecido o ya expirado.
Solución:
# Establecer período de gracia
sudo edquota -t
# Verificar estado del período de gracia del usuario
sudo repquota -s /home | grep username
Problema: Cuotas Se Restablecen Después del Reinicio
Causa: Cuotas no habilitadas en fstab o servicio de cuota no habilitado.
Solución:
# Verificar que fstab tenga opciones de cuota
grep quota /etc/fstab
# Habilitar servicio de cuota
sudo systemctl enable quota
sudo systemctl start quota
Mejores Prácticas para Cuotas de Disco
1. Establecer Límites Realistas
Basar los límites en patrones de uso reales:
# Analizar uso actual
sudo du -sh /home/*
# Establecer límites con margen
# Si el uso promedio es 300MB, establecer blando a 500MB, duro a 1GB
2. Usar Límites Blandos y Duros Juntos
Siempre establecer ambos con brecha apropiada:
# Blando: 500MB, Duro: 1GB (aumento del 100% para buffer)
sudo setquota -u username 512000 1048576 5000 10000 /home
3. Establecer Períodos de Gracia Razonables
Prácticas comunes:
- Desarrollo: 3-7 días
- Producción: 1-3 días
- Sistemas críticos: 1 día o menos
sudo edquota -t
# Establecer 7days para entornos normales
4. No Olvidar los Límites de Inodos
El conteo de archivos puede ser tan limitante como el espacio:
# Incluir límites de inodos
sudo setquota -u username 1048576 2097152 10000 20000 /home
5. Monitoreo Regular
# Verificaciones diarias de cuotas
echo "0 8 * * * /usr/local/bin/quota_monitor.sh" | sudo crontab -
6. Documentar Políticas de Cuotas
Crear documento de política:
sudo nano /etc/quota_policy.txt
Disk Quota Policy
=================
Standard User: 500MB soft, 1GB hard
Power User: 2GB soft, 5GB hard
Department: 50GB soft, 100GB hard
Grace Period: 7 days
Review Period: Monthly
Contact: [email protected]
7. Probar en No-Producción Primero
Siempre probar la configuración de cuotas:
# Crear usuario de prueba
sudo useradd testquota
# Establecer cuota pequeña para pruebas
sudo setquota -u testquota 1024 2048 100 200 /home
# Probar exceder límites
sudo su - testquota
dd if=/dev/zero of=testfile bs=1M count=3
8. Respaldar Configuración de Cuotas
# Respaldar base de datos de cuotas
sudo cp /home/aquota.user /backup/aquota.user.$(date +%Y%m%d)
sudo cp /home/aquota.group /backup/aquota.group.$(date +%Y%m%d)
# Exportar configuración de cuotas
sudo repquota -u /home > /backup/quota_config_$(date +%Y%m%d).txt
9. Proporcionar Autoservicio al Usuario
Crear script wrapper para usuarios:
sudo nano /usr/local/bin/myquota
#!/bin/bash
echo "Your Disk Quota Status:"
echo "======================="
quota -vs
echo ""
echo "For assistance, contact: [email protected]"
10. Mantenimiento Regular de Base de Datos de Cuotas
# Verificación mensual de cuotas
echo "0 2 1 * * quotacheck -augm && quotaon -av" | sudo crontab -
Lista de Verificación de Implementación de Cuotas
Usa esta lista de verificación al implementar cuotas:
- Instalar paquetes de cuotas
- Agregar opciones de cuota a /etc/fstab
- Remontar sistemas de archivos con opciones de cuota
- Crear archivos de base de datos de cuotas (ext4) o habilitar (XFS)
- Activar sistema de cuotas
- Establecer cuotas de usuario para usuarios existentes
- Establecer cuotas de grupo si es necesario
- Configurar períodos de gracia
- Probar aplicación de cuotas
- Crear scripts de monitoreo
- Programar informes automáticos de cuotas
- Documentar políticas de cuotas
- Capacitar a usuarios en el sistema de cuotas
- Configurar mecanismos de alerta
- Planificar ajustes de cuotas
Conclusión
Las cuotas de disco son esenciales para gestionar recursos de almacenamiento en entornos Linux multiusuario. Al implementar cuotas de usuario y grupo con límites blandos/duros apropiados y períodos de gracia, garantizas una asignación justa de recursos y previene el agotamiento del almacenamiento.
Conclusiones clave:
- Habilitar cuotas en fstab con opciones usrquota y grpquota
- Crear bases de datos de cuotas con quotacheck (ext4) o habilitar (XFS)
- Establecer límites realistas basados en patrones de uso reales
- Usar límites blandos y duros con brechas apropiadas
- Configurar períodos de gracia (típicamente 7 días)
- Monitorear uso de cuotas con scripts automatizados
- Notificar a usuarios que se acercan a límites proactivamente
- Documentar políticas claramente para los usuarios
- Mantenimiento regular de bases de datos de cuotas
- Probar exhaustivamente antes del despliegue en producción
La implementación adecuada de cuotas protege los recursos de almacenamiento compartidos mientras proporciona una asignación justa a todos los usuarios. Siguiendo los procedimientos y mejores prácticas en esta guía, puedes desplegar sistemas efectivos de cuotas de disco que previenen problemas de almacenamiento y garantizan una distribución equitativa de recursos a través de tu infraestructura Linux.
Recuerda que las cuotas son una herramienta de gestión, no un reemplazo para la planificación adecuada de capacidad. Revisa regularmente las tendencias de uso de cuotas y ajusta los límites a medida que las necesidades organizacionales evolucionan.


