Linux

Disk quota exceeded en Linux: cómo solucionar este error

Consola de comandos de Linux mostrando información sobre el almacenamiento del sistema y cuotas de disco

El error Disk quota exceeded ocurre cuando un usuario de Linux alcanza el límite máximo de almacenamiento o de número de archivos asignado a su cuenta por el administrador del sistema. Para solucionarlo de forma inmediata, se deben eliminar archivos temporales en el directorio personal del usuario o solicitar un incremento de las cuotas asignadas al sistema de archivos.

Qué significa el error

El mensaje Disk quota exceeded (o cuota de disco excedida) indica que el subsistema de cuotas del kernel de Linux ha bloqueado las operaciones de escritura para un usuario o grupo específico. A diferencia del error general donde el disco completo se queda sin espacio físico, aquí el volumen de almacenamiento dispone de megabytes o gigabytes libres, pero el sistema restringe el consumo de dicho usuario.

Este fallo se manifiesta habitualmente al intentar guardar un archivo, ejecutar instalaciones mediante gestores de paquetes, clonar repositorios de Git o cuando servicios del sistema (como servidores web o bases de datos) intentan escribir archivos de sesión o registros con el usuario afectado. Afecta a entornos Linux compartidos, servidores cPanel/Plesk, sistemas HPC y servidores empresariales en Ubuntu, Debian, RHEL o Rocky Linux donde se utiliza la herramienta quota sobre sistemas de archivos ext4 o XFS.

Causas más habituales

  • Límite de bloques de disco alcanzado (Soft/Hard Limit): El usuario ha superado el espacio asignado en megabytes o gigabytes dentro de su directorio personal (/home/usuario).
  • Límite de inodos agotado: Se ha alcanzado el número máximo de archivos o directorios permitidos, aunque el espacio consumido en megabytes sea bajo (común con cachés masivas o frameworks Node.js/PHP).
  • Periodo de gracia expirado: Se superó el límite blando (soft limit) y transcurrió el tiempo de gracia (habitualmente 7 días) sin reducir el uso, convirtiendo el límite blando en un bloqueo rígido.
  • Acumulación de archivos temporales y cachés: Archivos de registros, papelera de reciclaje o cachés de aplicadores como Docker o pip que crecen sin control.
  • Ficheros pesados propiedad del usuario fuera de /home: Archivos ubicados en directorios como /tmp o /var/tmp que computan dentro de la cuota del usuario.

Antes de empezar

Antes de aplicar cualquier cambio o eliminar archivos para solucionar esta incidencia, asegúrate de cumplir con los siguientes requisitos:

  • Acceso SSH o consola interactiva al servidor afectado.
  • Permisos de superusuario (root o acceso a sudo) si necesitas modificar los límites globales o la configuración de cuotas de otros usuarios.
  • Un mapa claro de los datos del usuario. Atención: antes de eliminar carpetas de forma masiva, realiza una copia de seguridad o exporta los archivos críticos a otra ubicación o máquina remota mediante scp o rsync.

Solución 1: Comprobar los límites actuales e identificar qué está consumiendo la cuota

El primer paso consiste en analizar si el límite sobrepasado es de espacio físico (bloques) o de número de ficheros (inodos). Para ello se utilizan las herramientas nativas de cuotas.

  1. Accede a la terminal con la cuenta que genera el error y ejecuta el comando quota: me muestra un resumen de las cuotas asignadas.
    quota -vs
  2. Analiza la salida del comando. Observa la columna space frente a limit (para el volumen de datos) y la columna files frente a quota (para el número de archivos). Si aparece un asterisco (*) al lado de algún valor, significa que esa cuota específica ha sido excedida.
  3. Si no dispones de la utilidad quota instalada o usas XFS, puedes revisar el estado si tienes acceso de administración con xfs_quota:
    sudo xfs_quota -x -c 'report -h' /home
  4. Identifica las carpetas que más ocupan dentro del directorio de trabajo con el comando du:
    du -h --max-depth=1 ~ | sort -hr

Por qué funciona: Este procedimiento evita realizar cambios a ciegas. Saber si el problema proviene del tamaño total o del número total de archivos pequeños permite dirigir la limpieza exactamente hacia donde se origina el bloqueo.

Solución 2: Liberar espacio en el directorio del usuario afectado

Si no tienes permisos de root para aumentar la cuota, debes liberar espacio borrando elementos prescindibles. Si el disco principal carece de espacio a nivel global para todo el sistema, consulta cómo solucionar el error de espacio en disco lleno en Linux.

  1. Vacía la papelera de reciclaje oculta del entorno de escritorio si existe:
    rm -rf ~/.local/share/Trash/*
  2. Limpia la caché de gestores de paquetes y herramientas de desarrollo que suelen acumular gigabytes de datos:
    rm -rf ~/.cache/*
    npm cache clean --force
    pip cache purge
  3. Localiza los archivos individuales de mayor tamaño dentro de tu directorio personal:
    find ~ -type f -size +100M -exec ls -lh {} +
  4. Elimina los archivos voluminosos o innecesarios usando rm. Atención: Los archivos borrados mediante la consola de comandos se eliminan de forma permanente e irrecuperable.
    rm /ruta/al/archivo_grande.tar.gz

Por qué funciona: Al reducir el número de bloques o de inodos utilizados por debajo del límite rígido asignado (hard limit), el kernel levanta inmediatamente el bloqueo de escritura sobre las llamadas del sistema (write, open) asociadas a ese usuario.

Solución 3: Eliminar exceso de inodos acumulados

Es común que la cuota de disco se exceda por número de archivos (inodos) más que por espacio consumido. Ocurre con aplicaciones que generan miles de archivos pequeños de sesión o registros. Si tu problema es de falta de estructuras de archivos en la partición, revisa la guía sobre el error de falta de inodos en Linux.

  1. Cuenta el número de archivos por directorio en la cuenta del usuario para localizar el origen del problema:
    find . -maxdepth 2 -mdev -q -type f | cut -d/ -f2 | sort | uniq -c | sort -nr
  2. Comprueba si el directorio de sesiones de aplicaciones web o frameworks contiene acumulación de archivos pequeños:
    ls -U ~/.var/ | wc -l
  3. Elimina los directorios con miles de archivos temporales. Por ejemplo, para borrar carpetas con demasiados argumentos sin saturar la consola:
    find ~/.tmp_cache -type f -delete

Por qué funciona: El borrado directo mediante find -delete procesa las entradas del directorio sin cargar la lista completa en memoria, liberando las entradas de inodo que estaban agotando la cuota del usuario.

Solución 4: Ampliar o modificar las cuotas del usuario (Requiere Root)

Si el usuario requiere almacenar más información por motivos operativos legítimos, el administrador del sistema debe ajustar los límites configurados en el sistema de archivos.

  1. Edita la cuota del usuario deseado utilizando el comando edquota:
    sudo edquota -u nombre_usuario
  2. Se abrirá un editor de texto (generalmente vi o nano) mostrando una estructura con varias columnas: blocks, soft, hard, inodes, soft, hard. Modifica los valores en kilobytes de los límites soft y hard para los bloques o los inodos según corresponda.
    Filesystem  blocks   soft   hard   inodes  soft  hard
    /dev/sda1   5242880  10485760 12582912  5000   10000 12000
  3. Guarda los cambios y cierra el editor.
  4. Si utilizas un sistema con XFS en lugar de ext4, aplica la nueva cuota mediante la utilidad específica:
    sudo xfs_quota -x -c 'limit bsoft=10G bhard=12G nombre_usuario' /home
  5. Verifica que la nueva asignación se haya aplicado correctamente ejecutando:
    sudo quota -u nombre_usuario

Por qué funciona: Modificar los valores en las tablas del subsistema de cuotas reconfigura los umbrales que el kernel de Linux comprueba cada vez que ese UID realiza una petición de escritura en el bloque de almacenamiento asignado.

Cómo comprobar que se ha solucionado

Una vez completados los pasos anteriores, valida que las restricciones se han eliminado intentando realizar una prueba de escritura real con la cuenta del usuario afectado.

  1. Ejecuta el comando quota -s desde la cuenta de usuario y verifica que ya no aparece el asterisco * al lado del uso de bloques ni de inodos.
  2. Crea un archivo de prueba en el directorio personal mediante touch:
    touch ~/prueba_escritura.txt
  3. Si el comando se ejecuta sin devolver el mensaje Disk quota exceeded, elimina el archivo temporal:
    rm ~/prueba_escritura.txt

Si nada de lo anterior funciona

Si el usuario sigue recibiendo el error a pesar de disponer de cuota libre o haber ampliado los límites, revisa estos puntos avanzados:

  • Sincronización de cuotas: La base de datos de cuotas puede estar desactualizada. Ejecuta la verificación del sistema de cuotas para regenerar los contadores en ext4 (requiere desmontar la partición o ponerla en modo lectura):
    sudo quotacheck -avugm
  • Límite global del sistema de archivos: Es posible que la cuota del usuario tenga margen pero el disco físico esté al 100%. Comprueba el uso global con df -h. En estos casos, consulta la guía de espacio en disco insuficiente en Linux.
  • Procesos que mantienen archivos eliminados abiertos: Si eliminaste archivos grandes pero la cuota no disminuye, puede haber procesos en ejecución bloqueando esos descriptores de archivo. Identifícalos y ciérralos:
    lsof | grep deleted
  • Consulta la documentación oficial de la distribución sobre el subsistema de almacenamiento, como la documentación de servidor de Ubuntu.

Preguntas frecuentes

¿Qué diferencia hay entre Soft Limit y Hard Limit?

El Soft Limit es un límite flexible que permite al usuario superarlo de forma temporal durante un período de gracia (por defecto 7 días). El Hard Limit es el límite absoluto de espacio o archivos que el sistema nunca permitirá sobrepasar bajo ninguna circunstancia.

¿Por qué aparece Disk quota exceeded si df -h muestra que hay espacio disponible?

Porque el comando df -h muestra la capacidad global del disco físico o la partición. El error de cuota se aplica por usuario (UID) o grupo (GID) mediante software. Aunque la partición disponga de gigabytes libres, tu usuario no puede consumir más de la cantidad asignada.

¿Cómo puedo ver la cuota de todos los usuarios del servidor a la vez?

Como usuario administrador (root), puedes generar un informe completo de la utilización de cuotas en todos los puntos de montaje utilizando el comando sudo repquota -a.

¿Se pueden aplicar cuotas de disco a grupos en lugar de usuarios individuales?

Sí, Linux permite gestionar cuotas a nivel de grupo (GID). Se revisan mediante quota -g nombre_grupo y se editan con el comando sudo edquota -g nombre_grupo.