Gestión de cuotas de disco para limitar el espacio disponible a usuarios

Objetivo:

Implementar y configurar un sistema de cuotas de disco (Disk Quotas) en Linux para limitar y controlar el espacio de almacenamiento y el número de archivos que un usuario o grupo puede consumir dentro de una partición específica, utilizando la terminal.

Escenario:

  • Herramientas: Terminal Linux, mount, quotacheck, quotaon, edquota, repquota, dd.
  • Conceptos analizados: Cuotas por bloques (espacio) y por inodos (cantidad de ficheros), límites suaves (soft limit) frente a límites estrictos (hard limit), y archivos de configuración de cuotas en sistemas de ficheros ext4.
  • Proceso clave: Activación de opciones de cuota en el montaje de una partición, escaneo e inicialización de bases de datos de cuotas, asignación de límites a un usuario de prueba y validación de restricciones en caliente.

Escenario Real: Prevención del agotamiento de espacio por usuarios abusivos

En un servidor de compartición de archivos de una institución, varios usuarios almacenan contenidos multimedia personales masivos, agotando por completo el espacio libre del disco y provocando la caída de los servicios críticos del servidor. Como administrador de sistemas, necesitas aplicar políticas estrictas de control de cuotas para restringir de manera justa el espacio que cada usuario puede ocupar en el almacenamiento común.

Por defecto, Linux permite que cualquier usuario con permisos de escritura consuma espacio en una partición hasta llenarla por completo. Para evitarlo, se utilizan las cuotas de disco a nivel de sistema de archivos (compatible con ext3, ext4, XFS).
NOTA: Para aplicar cuotas, es necesario habilitar los soportes de contabilidad de usuarios y grupos en las opciones de montaje de la partición (mediante los parámetros usrjquota y grpjquota o las opciones globales usrquota/grpquota) antes de poder gestionar los límites de forma efectiva.Existen dos tipos de límites fundamentales: el Soft Limit (límite flexible), que permite superar temporalmente la cuota durante un periodo de gracia (por defecto 7 días), y el Hard Limit (límite estricto), que bloquea la escritura de forma inmediata e irreversible en cuanto se alcanza el valor máximo.

Instrucciones:

Fase 1: Preparación del entorno y paquetes de cuotas:

  • Instalar la herramienta de gestión de cuotas en caso de no disponer de ella: sudo apt update && sudo apt install quota -y
  • Crear un disco virtual de 60 MB para simular la partición de almacenamiento: dd if=/dev/zero of=disco_cuotas.img bs=1M count=60
  • Asociar la imagen a un loopback y formatearla en ext4:
    • sudo losetup -f --show disco_cuotas.img (Anota el dispositivo, ej: /dev/loop10)
    • sudo mkfs.ext4 /dev/loop10

Fase 2: Montaje de la partición con soporte de cuotas habilitado:

  • Crear un punto de montaje dedicado: sudo mkdir -p /mnt/datos_cuotas
  • Montar la partición especificando explícitamente las opciones de cuota para usuarios (usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0):
    sudo mount -o usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0 /dev/loop10 /mnt/datos_cuotas
  • Dar permisos totales al directorio montado para trabajar en las fases de prueba: sudo chmod 777 /mnt/datos_cuotas

Fase 3: Inicialización y activación de las bases de datos de cuotas:

  • Crear los archivos de registro de cuotas en la raíz del sistema de archivos con quotacheck:
    • sudo quotacheck -cumv /mnt/datos_cuotas
    • (El parámetro -c crea los ficheros de cuota, -u activa cuotas de usuario, -m evita re-montar en modo solo lectura y -v muestra información detallada).
  • Activar oficialmente el subsistema de cuotas para la partición: sudo quotaon -v /mnt/datos_cuotas

Fase 4: Creación de un usuario de prueba y asignación de límites:

  • Crear un usuario sin privilegios para simular la restricción (ej. alumno_quota): sudo useradd -m alumno_quota
  • Establecer una contraseña temporal: sudo passwd alumno_quota
  • Editar y asignar límites estrictos de espacio (cuota por bloques) mediante el editor interactivo edquota:
    sudo edquota -u alumno_quota
  • En la pantalla del editor, verás los bloques actuales (soft y hard). Modifica los valores de la línea correspondiente a /mnt/datos_cuotas asignando un Soft Limit de 10240 (10 MB) y un Hard Limit de 15360 (15 MB). Guarda los cambios y sal del editor.
  • Verificar la configuración aplicada ejecutando: sudo repquota -avs

Fase 5: Verificación del comportamiento ante el límite de cuota:

  • Cambiar temporalmente al usuario de prueba para simular la escritura de datos: su - alumno_quota
  • Acceder al directorio montado: cd /mnt/datos_cuotas
  • Intentar crear un archivo de pruebas de 12 MB (que supera el soft limit pero está por debajo del hard limit): dd if=/dev/zero of=archivo_12mb.bin bs=1M count=12
  • Comprobar si el sistema advierte el rebasamiento del límite flexible (soft limit warning).
  • Intentar crear un archivo adicional que supere el límite estricto (hard limit de 15 MB en total) y comprobar cómo el comando dd se detiene devolviendo un error explícito de "Dispositivo lleno" (Disk quota exceeded).
  • Salir de la sesión del usuario de prueba: exit

Verificación:

  • Ejecutar un reporte general detallado como administrador para comprobar el consumo actual del usuario de prueba: sudo repquota -v /mnt/datos_cuotas
  • Confirmar que el espacio usado refleja exactamente el bloqueo aplicado por la directiva de cuotas.

Posibles errores y resolución de problemas:

Si al ejecutar quotacheck la terminal devuelve el error quotacheck: Cannot find filesystem to check or filesystem not mounted with quota option, significa que la partición se montó sin las opciones de registro de cuotas requeridas.

  • Solución: Desmonta la partición con sudo umount /mnt/datos_cuotas y vuelve a montarla asegurándote de incluir los parámetros usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0 en la orden de montaje.

Preguntas de reflexión:

  1. ¿Qué diferencia operativa y de comportamiento existe entre un Soft Limit y un Hard Limit en la gestión de cuotas de disco?
  2. ¿Qué función cumple el periodo de gracia (grace period) asociado a los límites flexibles en un servidor de producción?
  3. ¿Por qué es indispensable inicializar las bases de datos de cuotas mediante el comando quotacheck antes de activar la herramienta con quotaon?
  4. ¿Qué implicaciones tiene aplicar cuotas basadas en inodos frente a las cuotas basadas en bloques de almacenamiento?
Haz clic aquí para ver las soluciones y explicaciones

1. ¿Qué diferencia operativa y de comportamiento existe entre un Soft Limit y un Hard Limit en la gestión de cuotas de disco?

El Soft Limit es un aviso flexible que permite al usuario rebasar temporalmente el espacio asignado mientras dure el periodo de gracia configurado. El Hard Limit, en cambio, representa una restricción absoluta y estricta: en el preciso instante en que el usuario alcanza este volumen de almacenamiento, el sistema bloquea cualquier intento adicional de escritura de forma inmediata, devolviendo un error de espacio agotado.


2. ¿Qué función cumple el periodo de gracia (grace period) asociado a los límites flexibles en un servidor de producción?

El periodo de gracia otorga un margen temporal (habitualmente 7 días) para que un usuario pueda superar de manera puntual el límite flexible (por ejemplo, para terminar de compilar un archivo grande o guardar un trabajo urgente), dándole tiempo para limpiar espacio antes de que el sistema comience a bloquear sus operaciones de escritura como si hubiera alcanzado un hard limit.


3. ¿Por qué es indispensable inicializar las bases de datos de cuotas mediante el comando quotacheck antes de activar la herramienta con quotaon?

Porque el comando quotacheck escanea el sistema de archivos analizando todos los ficheros existentes y genera los archivos de control y registro necesarios (como aquota.user y aquota.group) donde se almacenarán las estadísticas y los límites de consumo. Sin estos ficheros de base de datos inicializados, el kernel no dispone de estructuras donde consultar ni contabilizar los datos.


4. ¿Qué implicaciones tiene aplicar cuotas basadas en inodos frente a las cuotas basadas en bloques de almacenamiento?

Las cuotas basadas en bloques limitan la cantidad de espacio físico en bytes que un usuario puede ocupar, mientras que las cuotas basadas en inodos limitan el número total de archivos y carpetas que puede crear. Esto último es sumamente útil para evitar ataques de denegación de servicio o abusos donde un usuario congestiona el sistema de ficheros generando millones de archivos minúsculos que, aunque ocupan poco espacio en disco, agotan por completo la tabla de inodos de la partición.