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)
  • 168hours
  • 10080minutes
  • 0 (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:

  1. Habilitar cuotas en fstab con opciones usrquota y grpquota
  2. Crear bases de datos de cuotas con quotacheck (ext4) o habilitar (XFS)
  3. Establecer límites realistas basados en patrones de uso reales
  4. Usar límites blandos y duros con brechas apropiadas
  5. Configurar períodos de gracia (típicamente 7 días)
  6. Monitorear uso de cuotas con scripts automatizados
  7. Notificar a usuarios que se acercan a límites proactivamente
  8. Documentar políticas claramente para los usuarios
  9. Mantenimiento regular de bases de datos de cuotas
  10. 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.