Implementar y administrar cuotas de disco en Linux 

Copyright © 2005-2017 LinuxTotal.com.mx
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 González D.  

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 o metadatos (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
....

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


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


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 o awk 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`


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.


Espero que este tutorial o manual de LinuxTotal.com.mx sobre cuotas de disco (quotas disk) te sea útil.


LinuxTotal en:

Si encuentras útil la información que proveé LinuxTotal, considera realizar un donativo que estimule a seguir proporcionando contenido de calidad y utilidad. Gracias.

Más artículos de LinuxTotal

awk o la versión GNU gawk es más que un simple comando de procesamiento de patrones, es todo un lenguaje de análisis semántico....


Sistemas Linux con gran cantidad de usuarios, como servidores de correo, servidores samba, etc., tarde o temprano tienen el proble....


En SQL, 'Alter' es un comando de la categoría DDL (Data Definition Language) y como su nombre lo indica sirve para alterar objeto....


He actualizado con varios nuevos comandos la popular guía de LinuxTotal.com.mx, asi como he añadido enlaces en los comandos en l....


Muchos validadores de direcciones de correo electrónico devolverán errores cuando se enfrenten con una inusual pero válida dire....


Linux ofrece multitud de servicios o servidores, estos pueden iniciar o arrancar junto con la carga del sistema o pueden después ....


Una tarea administrativa algo común, es eventualmente tener que añadir un nuevo disco duro (IDE) al o a los que ya se tienen, de....


En Linux hay diversas herramientas para empaquetar y comprimir archivos, tomando en cuenta que empaquetar es juntar dos o más arc....


El siguiente es un script muy básico de iptables que puedes usar para proteger un solo equipo conectado a Internet a través de u....


En este tutorial sobre listas de control de acceso en squid, aprenderás lo básico de como configurarlas y establecerlas en la co....



Copyright © LinuxTotal.com.mx 2006-2017
info@linuxtotal.com.mx · linuxtotal.com.mx@gmail.com