|
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
|