Sistemas Linux con gran cantidad de usuarios, como servidores de correo, servidores samba, etc., tarde o temprano tienen el problema de usuarios que almacenan demasiada información en sus directorios de trabajo, pudiendo incluso en casos extremos llenar completamente discos duros haciendo el sistema inservible. Con el uso de cuotas de disco (disk quotas) es posible limitar la cantidad de espacio disponible para cada usuario o de manera global para todos. En este manual de LinuxTotal.com.mx conocerás a fondo como implementar y administrar cuotas de disco para control de los usuarios.
Tipos de cuota
Por Bloques (blocks): Un bloque corresponde a 1 kb y una cuota por bloques correspondería al total de bloques que un usuario puede utilizar en el sistema. Recuerda que los archivos se guardan en bloques de disco. Asi un archivo de 100 bytes, ocupará un un bloque de 1kb en el disco duro.
Por Inodos (inodes): Un inodo o inode en inglés (Index Node) es un número que actua como apuntador para el sistema de archivos de Linux y le indica en que bloques específicos del disco duro se encuentran los datos de un archivo. También el inodo en su referencia guarda información sobre permisos, propietario, atributos, etc. Se podría ver en una analogía simple que un inodo es como un número de serie único para cada archivo del sistema y a través de este número el sistema recupera sus datos (bloques) y sus atributos (permisos, propietario, fechas, etc.).
En el caso de las cutoas, una cuota por inodos indicaría el total de indos a los que el usuario tiene derecho, casi representaría el total de archivos que el usuario puede crear y digo "casi" porque los usuarios podemos crear enlaces simbólicos (ln -s)
sobre archivos ya existentes que no aumentan las cantidad de inodos. Pero por simplicidad puedes verlo como un 1 inodo = 1 archivo.
Límites
Tanto las cuotas por bloques o por inodos, tienen límites de uso y son de dos tipos:
HARD: (Duro) Cuando se establece (para bloques o inodos), es el límite absoluto. El usuario no podrá exceder este límite.
SOFT: (Suave) Este límite (para bloques o inodos) que es siempre menor al HARD, puede ser excedido por el usuario, pero será constantemente advertido que el límite de uso para bloques o inodos ya ha sido excedido. Podría verse como un límite de advertencia que le estará indicando al usuario que su límite ya se excedió y tome medidas.
Cuando se usa el límite SOFT, dos situaciones pueden ocurrir. La primera es que NO se tenga establecido un tiempo de gracia, y entonces el usuario podrá seguir usando bloques o inodos hasta llegar al límite HARD que será su límite absoluto de uso.
La segunda situación es que SI se tenga establecido el tiempo de gracia, que puede ser en días, horas, minutos o segundos. En este caso, el usuario podrá seguir usando bloques o inodos hasta que termine el tiempo de gracía o llegue al límite HARD, cualquiera que ocurra primero.
El tiempo de gracias se puede establecer por usuario o globalmente y más adelante veremos como establecerlo.
¿Donde se implementan?
Las cuotas se establecen por filesystem o sistema de archivos, es decir, debes de decidir en donde es más conveniente instalar un sistema de cuotas, pero no hay ningún problema si se instala en todos. Las cuotas pueden establecerse por usuario, por grupos o ambos. En el siguiente ejemplo:
#> mount
/dev/sda1 on /boot type ext3 (rw,noatime)
/dev/sda2 on / type ext3 (rw,noatime)
/dev/sda3 on /home type ext3 (rw,noatime)
none on /proc type proc (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
Lo anterior es un ejemplo típico de un equipo Linux con varios sistemas de archivos (/boot, / y /home). Como se sabe en /home es donde los usuarios tienen sus directorios de trabajo (HOME), asi que solo en este sistema de archivos crearemos cuotas, en los otros dos no tiene caso.
Configuración
Todo debe hacerse como root, y lo primero que haremos es editar el archivo "/etc/fstab" y añadiremos "usrquota" o "grpquota", dependiendo si se desea cuotas por usuario o grupos, o incluso ambas.
#> vi /etc/fstab
/dev/sda2 / ext3 noatime 1 1
/dev/sda1 /boot ext3 noatime 1 2
/dev/sda3 /home ext3 noatime 1 2
....
(Añadimos en la cuarta columna el tipo de cuotas que deseamos)
/dev/sda2 / ext3 noatime 1 1
/dev/sda1 /boot ext3 noatime 1 2
/dev/sda3 /home ext3 noatime,usrquota,grpquota 1 2
...
Algo similar a lo anterior deberá tener tu archivo de configuración, y como ya se indicó solo agregamos el soporte para cuotas en el sistema de archivos que nos interese. Lo anterior por si solo, es obvio que no hace nada, habría que reiniciar el sistema para que se apliquen los cambios pero realmente no es necesario, lo siguiente re-monta el sistema de archivos "/home":
#> mount -o remount /home
#> mount
/dev/sda1 on /boot type ext3 (rw,noatime)
/dev/sda2 on / type ext3 (rw,noatime)
/dev/sda3 on /home type ext3 (rw,noatime,usrquota,grpquota)
none on /proc type proc (rw)
El sistema de archivos "/home" esta listo ahora para soportar cuotas de disco. El siguiente paso es verificar con el comando quotacheck
por sistemas de archivos que soporten cuotas. Este comando crea, verifica o repara el control de cuotas en los sistemas que lo soporten, en este caso creara el soporte:
#> quotacheck -augmv
quotacheck: Scanning /dev/sda3 [/home] done
quotacheck: Cannot stat old user quota file: No existe el fichero o el directorio
quotacheck: Cannot stat old group quota file: No existe el fichero o el directorio
quotacheck: Cannot stat old user quota file: No existe el fichero o el directorio
quotacheck: Cannot stat old group quota file: No existe el fichero o el directorio
quotacheck: Checked 2539 directories and 35556 files
quotacheck: Old file not found.
quotacheck: Old file not found.
Los errores que envía es precisamente porque no existía un sistema de cuotas previo, es normal que los envíe. Cuando las cuotas esten en pleno uso, es conveniente ejecutar quotacheck
periódicamente para que verifique inconsistencias y se corrijan a tiempo. En cuanto a las opciones estas indican lo siguiente:
- a - all, es decir verifica todos los sistemas de archivos por cuotas.
- u - user, verifica por soporte de cuotas para usuarios.
- g - group, verifica por soporte de cuotas para grupos.
- m - no-remount, evita que el sistema se remonte como de solo lectura.
- v - verboso, reporta lo que hace conforme progresa, son los mensajes que salen a la terminal.
Como ves, la opción -a en este caso no era necesario puesto que solo tenemos "/home" con cuotas, asi que el comando anterior también pudiera ser invocado de esta manera:
#> quotacheck -ugmv /home
Pues el sistema esta listo para manipular cuotas de usuario, esto lo podemos comprobar porque en la raíz del sistema de archivos soportado con cuotas deben existir los archivos "aquota.user" y "aquota.group" que son binarios, no trates de modificarlos o manipularlos:
#> cd /home
#> ls -l
total 72
-rw------- 1 root root 8192 2008-05-17 21:38 aquota.group
-rw------- 1 root root 8192 2008-05-17 21:38 aquota.user
drwx--x--x 4 user1 user1 4096 2008-05-12 16:13 user1/
drwx--x--x 4 user2 user2 4096 2008-05-12 16:13 user2/
drwx--x--x 3 user3 user3 4096 2008-05-05 12:01 user3/
drwx--x--x 3 user4 user4 4096 2008-05-05 12:01 user4/
(obsérvese los dos archivos de control de cuotas, para usuarios y grupos)
Si se tuvieran más sistemas de archivos con soporte para cuotas en la raíz de cada uno estarían estos archivos, o solo uno dependiendo lo que se pidió, usuarios, grupos o ambos. Por cierto, en sistemas con kernel 2.2 o anterior se usaba la versión 1 de cuotas y sus archivos de control se nombraban "quota.user" y "quota.group", del kernel 2.4 y posteriores con la versión 2 y 3, se utiliza los mostrados anteriormente.
Ahora bien, lo anterior deja listo el sistema para el soporte de cuotas pero estás siguen sin ser activadas se requiere activar el soporte de cuotas, para lo cual invocamos el comando quotaon
:
#> quotaon -ugv /home
/dev/sda3 [/home]: group quotas turned on
/dev/sda3 [/home]: user quotas turned on
Activamos para "/home" cuotas de usuario y grupos. Cuando por alguna razón sea necesario desactivar las cuotas, entonces utiliza la contraparte, que es el comando quotaoff
:
#> quotaoff -v /home
/dev/sda3 [/home]: group quotas turned off
/dev/sda3 [/home]: user quotas turned off
Muy bien, hasta aqui ya tienes el sistema de archivos "/home" o el que hayas elegido (o todos) para trabajar con soporte de cuotas para los usuarios y grupos, ahora veremos como aplicar estas cuotas con los usuarios.
Aplicando la cuota a usuarios
Ahara hay que aplicar la cuota por usuario, aunque el sistema de archivos ya soporta cuotas y están habilitadas, por defecto ningún usuario tiene establecidas cuotas. Asi que para iniciar habrá que administrar cada usuario a través del comando edquota
, que abrirá el editor de texto que se tenga por defecto y mostrará lo siguiente:
#> edquota -u user1
Disk quotas for user user1 (uid 502):
Filesystem blocks soft hard inodes soft hard
/dev/sda3 56 0 0 14 0 0
Las columnas "blocks" e "inodes" son informativas, es decir nos indican la cantidad de bloques o inodos utilizados actualmente por el usuario, y las que podemos editar son las columnas "soft" y "hard" de cada caso. Como ya se explicó en la primera parte de este artículo, se puede indicar libremente cualquiera de los cuatro valores, es perfectamente posible establecer valores por bloques, por inodos o ambos, solo recuerda que el límite soft debe ser menor al hard. Si se establece solo el hard, no habrá advertencias previas y el usuario ya no podrá guardar archivos cuando se llegue al valor. Si se establece soft y hard, avisará cuando se rebase el límite soft y entrará en juego el periodo de gracia. Si se acaba el tiempo de gracias o se llega al har (lo que sea primero) ya no se podrán crear más archivos hasta que no se eliminen algunos de los que se tengan actualmente.
Para modificar cuotas a nivel grupo, se usa el mismo comando pero con la opción -g (edquota -g ventas
).
En el ejemplo previo se modifica la cuota del usuario "user1" en el sistema de archivos "/home" que es el que se ha usado de ejemplo en este artículo de LinuxTotal.com.mx, el comportamiento por default es modificar cuotas para ese usuario en todos los sistemas de archivos que tengan activo el control de cuotas (quotaon
). Si se desea control de cuotas para un filesystem en específico entonces se agrega la opción -f:
#> edquota -u user1 -f /home
(solo aplica la cuota en el sistema de archivos indicado)
Verificando el uso de las cuotas
Como usuario administrador 'root' puedes ver el uso de cuotas de cualquier usuario, ya sea individualmente o por medio de un reporte global.
Por usuario o individualmente se usa el comando quota
, estando como "root":
#> quota -u user1
Disk quotas for user user1 (uid 502):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda3 56 70 100 14 0 0
Con usuarios que manejan cantidades muy grandes de cuota, es un poco dificil calcular en términos de megas o gigas el espacio usuado y los límites de cuotas:
#> quota -u sergio
Disk quotas for user sergio (uid 500):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda3 42578888 0 50000000 34895 0 0
Usando la opción -s se mejora el informe:
#> quota -s -u sergon
Disk quotas for user sergon (uid 500):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda3 41582M 0 48829M 34905 0 0
Como usuario individual del sistema, puedes observar tus cuotas con el mismo comando quota
, sin argumentos.
Ahora bien, si se desea un reporte global de las cuotas de todos los usuarios o por grupos, siendo "root" utiliza el comando repquota
:
#> repquota /home
*** Report for user quotas on device /dev/sda3
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 184280 0 0 11 0 0
sergio -- 42579852 0 50000000 34902 0 0
user1 -- 56 70 100 14 0 0
user2 -- 52 0 0 13 0 0
user3 -- 28 0 0 7 0 0
user4 -- 28 0 0 7 0 0
Con repquota
es también posible utilizar la opción -s para observar los tamaños en formato legible. Si se usa la opción -a (all) en vez del sistema de archivos "/home", el reporte será para todos los sistemas de archivos en el equipo que soporten cuotas. Asi mismo este reporte por defecto es por usuarios, si se requiere que repquota
reporte por grupos, añade entonces la opción -g.
Obsérvese en la segunda línea del reporte el tiempo de gracia (grace time), que es de 7 días tanto para cuotas por bloque como para cuotas por archivos o inodos. Esto aplica para todos los usuarios en global, como se aprecia en el listado que ninguno tiene establecido un tiempo de gracia diferente al global.
Estableciendo el tiempo de gracia
A nivel global, un periodo de gracia para todos, utiliza la opción -t del comando edquota
, como en el siguiente ejemplo, recuerda que debes ser "root":
#> edquota -t
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/sda3 7days 7days
7 días es el periodo por defecto, si lo cambias a digamos 12 horas, sería "12hours". El tiempo de gracia puede ser distinto para el límite soft por bloques o por inodos.
Por usuario específico se realiza con la opción -T del mismo comando e indicando el usuario:
#> edquota -u user1 -T
Times to enforce softlimit for user user1 (uid 502):
Time units may be: days, hours, minutes, or seconds
Filesystem block grace inode grace
/dev/sda3 unset unset
Lo único que hay que considerar es que los tiempos de gracias por usuario deben ser menores al global. Y que este empieza a correr una vez que se ha llegado al límite soft. Cuando esto suceda, si entras a editar de nuevo el tiempo de gracia del usuario (edquota -u user -T
) se reflejara en segundos el tiempo que le queda, pudiéndolo aumentar de nuevo si eres "root". O dejarlo en cero y entonces el global será el que se utilice.
Fijar cuotas de manera global a todos los usuarios
En sistemas Linux con pocos usuarios, establecer las cuotas usuario por usuario no representa ningún problema. Pero si hablamos por ejemplo de una universidad donde pudieran existir miles de cuentas entonces si es un problema establecer cuentas individualmente. Realmente no existe una manera "oficial" de establecer cuotas masivamente, sin embargo, no hay problema, usaremos un pequeño script que te permitira realizarlo.
Establece la cuota que deseas globalmente en un solo usuario:
#> edquota -u user1
Disk quotas for user user1 (uid 502):
Filesystem blocks soft hard inodes soft hard
/dev/sda3 68 300 400 17 0 0
:wq
Veamos el reporte de cuotas con repquota
:
[root@segolap ~]# repquota /home
*** Report for user quotas on device /dev/sda3
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
user1 -- 68 300 400 17 0 0
user2 -- 352 0 0 13 0 0
user3 -- 28 0 0 7 0 0
user4 -- 28 0 0 7 0 0
Solo el usuario "user1" tiene cuotas, las columnas de "grace" tendrán valores una vez que se llegue al límite soft o suave. Usaremos entonces la opción -p (protptype) para hacer duplicados a partir del ya establecido.
#> edquota -p user1 user2
Con lo anterior "copias" la información de límites de cuotas del "user1" al "user2", no hay límite de cuantos usuarios puedes colocar como argumentos asi que lo siguiente es válido:
#> edquota -p user1 user2 user3 user4
Práctico para unos cuantos usuarios pero inútil si necesitamos duplicarlo en cientos de usuarios, asi que hagamos un comando compuesto que nos extraiga los nombres de los usuarios, se puede usar por ejemplo gawk
para realizar lo anterior:
#> gawk -F: '$3 > 499 {print $1}' /etc/passwd
user1
user2
user3
user4
Usamos el separador ":" de campos (-F), e indicamos como acción que en el campo 3 ($3) busquemos todos los UID mayores a 499 y que los imprima ({print $1}). Ahora solo tenemos que usar este comando junto con edquota -p
:
#> edquota -p user1 `gawk -F: '$3 > 499 {print $1}' /etc/passwd`
(importante: nota el uso de acento grave que abarca al comando gawk, esto para que el shell lo ejecute primero y el resultado serán los argumentos, uno o cientos de usuarios cuyo UID es mayor a 499)
Haciendo uso de repquota
de nuevo veamos que pasó:
#> repquota /home
*** Report for user quotas on device /dev/sda3
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
user1 -- 68 300 400 17 0 0
user2 -- 352 300 400 7days 13 0 0
user3 -- 28 300 400 7 0 0
user4 -- 28 300 400 7 0 0
Primero, todos los usuarios tienen las mismas cuotas que el "user1" que fue el prototipo para los demás y segundo se observa que el "usuario" que tiene 352 bloques utilizados al pasar el límite suave entro al periodo de gracia automáticamente que el global es de 7 días. A partir del instante que el límite cambió de 0 a 300, comenzó el periodo de gracia. Ahora solo podrá crear más archivos durante 7 días o cuando llegue a 400, lo primero que ocurra, claro, asumiendo que no borre archivos primeros para recuperar espacio.
Avisos de cuotas excedidas (warnquota)
Cuando un usuario llega al límite suave o soft al crear o modificar un documento, algo como lo siguiente aaprecerá:
user2> ls -l > directorio.txt
sda3: warning, user block quota exceeded.
En este instante como el "user2" no ha llegado al límite "hard" ni ha expirado el tiempo de gracia, el sistema permite crear el archivo pero se le notifica con un warning.
Pero si lo que deseamos es notificar inmediatamente y via correo electrónico que un usuario llego a su límite, por ejemplo, un server de correo electrónico, un usuario que ha recibido spam y esta saturando su cuenta, puede ser notificado que su couta esta llegando al límite.
Para lo anterior usaremos el comando warnquota
. Este comando simplemente invócalo desde la línea de comandos, sin argumentos, revisará los sistemas de archivos con cuotas activadas (quotaon
) y revisará todos los usuarios buscando quien ha excedido el límite soft tanto por bloques como por inodos, y a aquellos que lo hayan excedido les enviará un correo notifícandoles de lo anterior.
Puedes agrgar en cron una línea como la siguiente para que warnquota
haga su trabajo cada 12 horas:
#> vi /etc/crontab
...
0 0,12 * * * root /usr/sbin/warnquota
...
warnquota
viene con los mensajes en inglés por defecto, el archivo de configuración es "/etc/warnquota.conf", es muy intuitivo y fácil de cambiar, personalízalo con los mensajes a español para que sea más fácil entender a tus usuarios que han excedido sus cuotas.
Copyright 2005-2008 Sergio González Durán
Se concede permiso para copiar, distribuir y/o modificar este documento siempre y cuando se cite al autor y la fuente de linuxtotal.com.mx y según los términos de la GNU Free Documentation License, Versión 1.2 o cualquiera posterior publicada por la Free Software Foundation.
autor: sergio.gonzalez.duran@gmail.com
Fuente: http://www.linuxtotal.com.mx/index.php?cont=info_admon_018