24x7 Linux Página personal y profesional HTML 4.01 válido CSS válido
Cuotas de espacio en disco

Lo más habitual en nuestras máquinas Linux de uso cotidiano es que sólo las usemos nosotros, como si de una estación de trabajo se tratara, aunque el sistema operativo sea multiusuario, multitarea, y desempeñe (entre otras) tareas de servidor. En esta situación no suele ser necesario limitar el espacio en disco que como máximo deben ocupar los archivos de un determinado usuario, puesto que suele haber sólo uno, y si hemos sido lo bastante previsores ya habremos instalado el sistema operativo con un particionamiento inteligente del disco.

Un particionamiento "inteligente" del disco sera aquel que separe en particiones distintas los directorios que tengan una función específica en el sistema (según se especifica en el Filesystem Hierarchy Standard), como por ejemplo, /tmp, /var, /home, etc. De tal manera, si un usuario o proceso llena un sistema de ficheros al 100% de su capacidad, los demás no se ven afectados, y la mayoría de los programas pueden seguir funcionando normalmente.

Un caso típico es el de un programa generando abundante información de log bajo el directorio /var. Si sólo tenemos una partición de datos dicho programa podrá llenar el disco con sus logs e impedir que ningún otro proceso o usuario (salvo quizás root) pueda escribir a disco, lo que se manifiesta en fallos en muchas aplicaciones, y a veces la recesidad de reiniciar la máquina. Si los archivos de log residen en una partición dedicada la máquina funcionará normalmente (salvo la escritura de los registros), y dará tiempo al administrador a averiguar el problema y resolverlo.

Sin embargo separar directorios concretos en sistemas de ficheros diferentes no siempre es la mejor opción. Puede ser necesario disponer de un espacio en disco donde varios usuarios tengan permiso de escritura, pero nos interese que los posibles abusos de uno de ellos no deje sin espacio libre a los demás. Piense por ejemplo en un servidor de correo donde los buzones de los usuarios residen en un mismo sistema de ficheros, y queremos evitar que el uso masivo de esa dirección de correo por parte de un usuario deje sin espacio en disco (y sin posibilidad de recibir correo) a los demás usuarios, que posiblemente pagan por este servicio de correo.

Resulta evidente que separar en sistemas de ficheros distintos los buzones de cada usuario es inviable, primero por la imposibilidad de tener tantas particiones como usuarios, y segundo por la complejidad administrativa que esto tendría. Para estos casos (como el del servidor de buzones), como para máquinas multiusuario donde cada usuario dispone de un directorio propio bajo /home, las cuotas de uso de disco son el sistema más cómodo y eficiente de limitar a cada usuario (y grupo) del sistema operativo la cantidad de disco que como máximo pueden ocupar.

En Linux las cuotas de disco se configuran para cada sistema de ficheros, es decir, cada sistema de ficheros montado en la máquina podrá tener su propia configuración de cuotas, o simplemente no restringir el uso del espacio en disco. También hay que tener en cuenta que no todos los sistemas de ficheros soportan cuotas de disco, al menos no en los núcleos estándar de www.kernel.org (los núcleos de los fabricantes suelen venir altamente parcheados con nueva funcionalidad). Hasta donde yo sé, de los sistemas de ficheros disponibles de manera estándar en los núcleos Linux el soporte para cuotas de disco de cada uno de ellos es el siguiente:

  • Núcleo 2.4.20
    • ext2: soporte nativo de cuotas
    • ext3: soporte nativo de cuotas (con precaución, vea estos comentarios)
    • reiserfs 3.6.x: soporta cuotas, mediante parche adicional
    • JFS: no soporta cuotas, pero está previsto para el futuro
    • XFS: soporte nativo de cuotas, pero este sistema de ficheros no viene de serie. Puede conseguir el parche actualizado para esta versión del núcleo en el servidor FTP de SGI
  • Núcleo 2.5.57
    • ext2: soporte nativo de cuotas
    • ext3: soporte nativo de cuotas
    • reiserfs 3.6.x: no soporta cuotas por no haber parches para núcleos 2.5.x
    • JFS: no soporta cuotas, pero está previsto para el futuro
    • XFS: soporte nativo de cuotas

Además del soporte por parte del sistema de ficheros, en Linux existen dos formatos de cuotas de disco en la actualidad: el antiguo formato V1, y el nuevo formato de cuotas V2. Las ventajas de éste con respecto al primero son varias, entre las que se incluyen:

  • Soporte de UID y GID de 32 bits (en los núcleos 2.4.x se ha ampliado a 32 bits la longitud del campo que almacena tanto los UID como los GID, dando la posibilidad de tener más de 65536 usuarios y grupos distintos en el sistema).
  • Contabilización de las cuotas en octetos, en lugar de en bloques del sistema de ficheros (necesario para el soporte de cuotas en reiserfs).
  • Nuevos formatos de cuota disponibles como plug-ins.
  • Posibilidad de simultanear sistemas de ficheros con formatos de cuota distintos.
  • Posibilidad de establecer cuotas para root.

De cara al usuario la existencia de dos formatos de cuotas se traduce en la necesidad de disponer de unas versiones mínimas de núcleo y paquete quota para usar la nueva versión, el cambio en el nombre de los archivos de configuración usados, y en algunos casos la necesidad de indicarle a los comandos de gestión de las cuotas según qué versión de las mismas deben comportarse.

Para nuestra explicación usaremos núcleo 2.4.20, y paquete quota versión 3.08, aunque desde el núcleo 2.4.19 y paquete quota 3.01 deberían funcionar sin problemas. Para los ejemplos configuraremos cuotas de nuevo formato, e indicaremos en caso necesario las diferencias con respecto a la configuración de cuotas de formato antiguo. Usaremos varios sistemas de ficheros para configurar las cuotas, principalemente ext2 y ext3, aunque también echaremos un vistazo a XFS puesto que el funcionamiento de sus cuotas es especial.

Lo primero será disponer de versiones del núcleo y del paquete quota suficientes para hacer las pruebas. Consulte el changelog de su paquete quota para verificar si soporta el nuevo formato de cuotas. Verificar que el núcleo soporta cuotas es más sencillo: basta con mirar los mensajes de inicio y comprobar que dice algo como:

cliente:/tmp# dmesg | grep -i quota
Jan 15 01:04:06 cliente kernel: VFS: Disk quotas vdquot_6.5.1

Sin embargo, lo anterior no nos dice si tenemos soporte para el formato antiguo, el moderno, o ambos, y tampoco parece haber una manera definitiva de saberlo. Las opciones del núcleo que dan soporte de cuotas con formato antiguo y nuevo son CONFIG_QFMT_V1 y CONFIG_QFMT_V2:

  x x [*] Quota support                                                   x x   
  x x <M>   Old quota format support                                      x x   
  x x <M>   VFS v0 quota format support                                   x x   
  x x [*]   Compatible quota interfaces                                   x x   
  x x (Original)     Compatible quota interfaces                          x x   

Como puede ver el soporte de cada tipo de cuota es modularizable, y debemos cargarlo en el núcleo (de estar compilado como módulo) antes de intentar configurar nada, u obtendremos errores (en la serie 2.4.x y desde 2.5.75 del núcleo los módulos de cuota se cargan automáticamente cuando resultan necesarios). Por ejemplo, en la máquina donde se han llevado a cabo estas pruebas tenemos cargados, entre otros módulos, los siguientes para dar soporte de cuotas:

Module                  Size  Used by    Not Tainted
quota_v1                2712   0  (unused)
quota_v2                7680   0  (unused)

Si no tenemos los módulos ya cargados en memoria deberemos cargarlos usando el comando "modprobe quota_v1 ; modprobe quota_v2" antes de continuar. No es necesario que dispongamos de una partición libre donde crear un sistema de ficheros nuevo en el que configurar cuotas de disco, de hecho no hay inconveniente alguno en añadir soporte de cuotas a un sistema de ficheros ya en uso, con el único inconveniente de ser necesario volver a montar el sistema de ficheros con las opciones que indican el deseo de usar cuotas de disco. Para ello deberá montar el sistema de ficheros con las opciones usrquota y grpquota (para dar soporte de cuotas a usuarios y grupos, respectivamente). Podrá usar un comando similar al siguiente en un sistema de ficheros ya montado:

cliente:/tmp# mount -t ext2 -o remount,usrquota,grpquota /dev/Grupo00/Quotas /mnt/quotas/
cliente:/tmp# df
S.ficheros           1K-blocks      Used Available Use% Montado en
/dev/Grupo00/Quotas    1032088        36    979624   1% /tmp/quotas
cliente:/tmp# mount
/dev/Grupo00/Quotas on /tmp/quotas type ext2 (rw,usrquota,grpquota)
cliente:/tmp# 

Evidentemente hemos suprimido la parte irrelevante de los comandos anteriores. La opción remount del comando mount intenta remontar el sistema de ficheros especificado con las opciones indicadas, lo que evita desmontarlo (algo imposible de hacer mientras haya aplicaciones usando dicho sistema de ficheros). En este caso hemos remontado el dispositivo /dev/Grupo00/Quotas (un volumen lógico) con soporte para cuotas tanto de usuario como de grupo. Se puede ver que de momento el sistema de ficheros está vacío, así que copiaremos algunos datos en el punto de montaje para los sucesivos pasos de la configuración.

Para que el sistema puede llevar un control de las cuotas configuradas y de la parte usada de cada usuario y grupo es necesario crear un par de archivos en el directorio raíz del sistema de ficheros en el que vayamos a configurar las cuotas de disco. En el caso del formato antiguo de cuotas, estos archivos deben llamarse quota.user y quota.group. En el caso del formato nuevo, aquota.user y aquota.group. Estos archivos deberían tener permisos 600, y ser propiedad de root.

Sin embargo estos archivos son binarios y no se editan directamente como casi cualquier otro archivo de configuración, sino que se usa la utilidad quotacheck para iniciar su contenido con la ocupación actual en disco de cada usuario y grupo. Puede que el comando anterior dé un error por tener el sistema de ficheros montado, pero se puede forzar quotacheck para que desempeñe su cometido usando la opción de línea de comandos -m, sin peligro alguno.

cliente:/tmp# quotacheck -vug /tmp/quotas/
quotacheck: Scanning /dev/Grupo00/Quotas [/tmp/quotas] done
quotacheck: Checked 4 directories and 148 files
cliente:/tmp# ls -l /tmp/quotas/
total 24
drwxr-xr-x    2 pepe     pepe     4096 2003-01-16 00:16 pepe
drwxr-xr-x    2 juan     juan     4096 2003-01-16 00:18 juan
-rw-------    1 root     root     7168 2003-01-16 00:29 aquota.user
-rw-------    1 root     root     7168 2003-01-16 00:29 aquota.group
cliente:/tmp#                

El comando quotacheck ha recorrido todos los archivos y directorios del sistema de ficheros contabilizando el uso actual por parte de cada usuario y grupo y almacenando el resultado en los archivos aquota.user y aquota.group (en algunos casos será necesario crear previamente los archivos, puesto que quotacheck no lo hará por sí mismo). Sin embargo aún no hemos instruido al núcleo para que haga un seguimiento continuo de los accesos a disco y contabilice el espacio ocupado constantemente. Para ello debemos activar el sistema de cuotas para el sistema de ficheros deseado, o para todos lo que actualmente estén montados con opción de cuotas de disco, mediante el comando quotaon:

cliente:/tmp# quotaon -vuga
cliente:/tmp# 

De esta manera indicamos al núcleo que esté preparado para gestionar las cuotas de disco para usuarios (-u) y grupos (-g), en todos (-a) los sistemas de ficheros (-g). Antes de continuar podemos comprobar que el sistema operativo realmente está gestionando las cuotas de este sistema de ficheros, mediante el mismo comando quotaon que antes, pero con las opción adicional -p:

cliente:/tmp# quotaon -vugap
group quota on /tmp/quotas (/dev/Grupo00/Quotas) is on
user quota on /tmp/quotas (/dev/Grupo00/Quotas) is on
cliente:/tmp# 

También podemos verificar cuánto espacio hay ya ocupado en nuestro sistema de ficheros, y comprobar el tipo de límites que podemos aplicar. Para obtener un informe detallado del uso actual del sistema de ficheros usaremos el comando repquota:

cliente:/tmp# repquota -ug /tmp/quotas/
*** Report for user quotas on device /dev/Grupo00/Quotas
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --     332       0       0              3     0     0       
pepe      --    1100       0       0            146     0     0       
juan      --       8       0       0              2     0     0       


*** Report for group quotas on device /dev/Grupo00/Quotas
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
Group           used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --     332       0       0              3     0     0       
pepe      --    1100       0       0            146     0     0       
juan      --       8       0       0              2     0     0       

cliente:/tmp# repquota -ug /tmp/quotas/

Vemos cuánto disco tiene en uso cada usuario y grupo con archivos en el sistema de ficheros, y también vemos que con las cuotas podemos limitar dos aspectos distintos de ocupación en disco: el número de bloques, y el número de inodos. Limitando el número de bloques podemos acotar la ocupación máxima en disco, y limitando los inodos el número de archivos permitido a cada usuario y grupo (hay un inodo por cada archivo y directorio). Pero no hay un sólo límite para cada magnitud, sino dos: el límite soft (o laxo) y el hard (o estricto).

El límite estricto no se puede superar bajo ninguna circunstancia: el propio núcleo se encargará de denegar las operaciones de escritura a disco que supongan exceder estos límites, haciendo cumplir las cuotas establecidas. El límite laxo se puede exceder, pero sólo durante un limitado periodo de tiempo (llamado periodo de gracia), pasado el cual el límite laxo pasa a comportarse como estricto mientras no se reduzca la ocupación en disco a niveles inferiores a la cuota laxa. Como se puede intuir del comando mostrado arriba, para cada usuario y grupo del sistema podemos configurar las cuotas de bloques, de inodos, y sus respectivos periodos de gracia, para lo cual se utiliza la herramienta edquota.

cliente:/tmp# edquota -u pepe

Disk quotas for user pepe (uid 1000):
  Filesystem               blocks       soft       hard     inodes     soft     hard
  /dev/Grupo00/Quotas        1100          0          0        146        0        0

cliente:/tmp#

El comando edquota nos despliega el editor predeterminado del sistema (el indicado en la variable de entorno EDITOR) y nos muestra una plantilla con las cuotas del usuario o grupo indicado en la línea de comandos. La imagen mostrada indica que el usuario ya tiene ocupados en el sistema de ficheros 1100 bloques de disco (de 1 KiB de tamaño cada uno), así como 146 inodos, pero de momento no tiene limitación alguna. Para definir estos límites basta editar esta plantilla con los valores deseados, por ejemplo los que se muestran a continuación, y salir del editor de texto guardando los cambios realizados:

Disk quotas for user pepe (uid 1000):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/Grupo00/Quotas            1100       5000      10000        146        0     2000

Desde este momento, y siempre que el sistema de ficheros se monte con las opciones de cuota y éstas estén activadas en el núcleo, el usuario pepe no podrá crear más de 2000 archivos ni ocupar más de 10 MiB de espacio en disco dentro del sistema de ficheros residente en /dev/Grupo00/Quotas. Cada usuario puede consultar en cualquier momento las cuotas asignadas por el administrador en todos los sistemas de ficheros de la máquina mediante el comando quota -l:

pepe@cliente:/tmp$ quota -l
Disk quotas for user pepe (uid 1000): 
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/Grupo00/Quotas
                   5160*   5000   10000   7days     227       0    2000        
pepe@cliente:/tmp$ 

En este caso el usuario durante su uso del sistema ha superado el límite de bloques en disco, iniciándose el periodo de gracia. Si antes de siete días no se reduce la ocupación en disco por dejabo del límite laxo el usuario no podrá escribir más datos a disco. El periodo de gracia es configurable por cada usuario y grupo, aunque también puede modificarse de manera global. El comando para estas modificaciones es setquota, por ejemplo:

cliente:/tmp# setquota -T -u pepe 86400 432000 -a
cliente:/tmp# 

Mediante el comando anterior hemos establecido en 86400 segundos (un día) el periodo de gracia para bloques en disco, en 432000 segundos (cinco días) el de archivos en disco, para el usuario pepe en todos los sistemas de ficheros con soporte de cuotas. Tanto para este comando como para los demás que hemos visto en este artículo remítase a las páginas de manual correspondientes para consultar los detalles de uso, así como la utilidad de cada opción de línea de comandos.

Para resumir todos los pasos necesarios en la configuracón de las cuotas de disco, vamos a ver reunidos y en el orden correspondiente todos los comandos necesarios, comentando su utilidad:

  • Primero, usar un núcleo con soporte de cuotas (verifíquelo mediante el comando dmesg)
  • Instalar el paquete quota con soporte para la versión del formato de cuotas que usar
  • Cargar en memoria el soporte de cuotas, de estar compilado como módulo: modprobe quota_v2
  • Montar los sistemas de ficheros con soporte de cuotas:
    mount -t ext3 -o usrquota,grpquota /dev/Grupo00/Quotas /mnt/quotas
  • Crear (o actualizar) los archivos de configuración de las cuotas para ese sistema de ficheros: quotacheck -vuga
  • Activar las cuotas de disco en el sistema operativo: quotaon -vuga
  • Mostrar un informe del uso actual de las cuotas de disco: repquota -vuga
  • Establecer cuotas y periodos de gracia para usuarios y grupos: comandos edquota y setquota

La descrita sería la configuración "desde cero" de las cuotas para un sistema de ficheros. Sin embargo una vez instalado el paquete quota es habitual que se ejecute durante el inicio del sistema algún script que lleve a cabo alguno de los pasos mencionados en la lista anterior. Por ejemplo, si los sistemas de ficheros con cuotas se declaran como tales en /etc/fstab y el inicio de la máquina está ordenado lo más probable es que los módulos estén en memoria, el sistema de ficheros ya montado con las opciones necesarias, y las cuotas activadas. De tal manera que habiendo creado previamente los archivos de configuración aquota.user y aquota.user sólo faltaría declarar las cuotas de cada usuario y grupo del sistema, y disfrutar de esta interesante posiblidad que nos brinda Linux.

Con respecto al uso de sistemas de ficheros XFS casi todo se configura y funciona igual que en el caso de los sistemas de ficheros ext2 y ext3 usados hasta ahora. Las diferencias principales consisten en que no hay archivos de configuración de cuotas (los archivos aquota.user y aquota.group que veíamos antes), puesto que dicha información se guarda como metadatos en las propias estructuras internas del sistema de ficheros. Precisamente por este motivo el paso de ejecutar el comando quotacheck resulta innecesario.

También sucede que la información mostrada por el comando repquota puede tardar unos segundos en mostrar la situación actual de ocupación del sistema de ficheros, por las características de journalling de XFS. Para forzar a la actualización del sistema puede probar a ejecutar el comando sync. Por último, ahora es el propio comando repquota y no el comando quotaon el que nos permite ver si las cuotas están realmente funcionando en ese sistema de ficheros, así que no se preocupe si quotaon le dice que el sistema de ficheros XFS no tiene las cuotas activadas, porque es posible que no sea así. De hecho, en sistemas de ficheros XFS no es ni siquiera necesario ejecutar el comando quotaon para activar las cuotas del mismo, basta con montar el sistema de archivos con la opción correspondiente.

cliente:/tmp# repquota -vuga
*** Report for user quotas on device /dev/Grupo00/Quotas
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --   16384       0       0              4     0     0       
pepe      --     916       0    1000             12     0     0       

*** Status for user quotas on device /dev/Grupo00/Quotas
Accounting: ON; Enforcement: ON
Inode: #131 (2 blocks, 2 extents)

*** Report for group quotas on device /dev/Grupo00/Quotas
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
Group           used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --   16384       0       0              4     0     0       
pepe      --     916       0       0             12     0     0       

*** Status for group quotas on device /dev/Grupo00/Quotas
Accounting: ON; Enforcement: ON
Inode: #132 (2 blocks, 2 extents)

cliente:/tmp# 

Última modificación: 07-July-2003 16:24:12 -0400

© 2002-2007 José Luis Domingo López. Todos los derechos reservados.
Contacte con el webmaster para informarle de fallos, incorrecciones o sugerencias.
Esta página cumple con los estándares HTML 4.01 y CSS2 del World Wide Web Consortium.