Saltar la navegación

Administración de cuotas de disco

Como sabemos, el sistema operativo para su correcto funcionamiento, necesita crear ficheros temporales, y por lo tanto, necesita siempre que algo de espacio libre haya disponible en el disco. Si a los usuarios no se les asignara ningún límite en cuanto al espacio de disco que pueden utilizar, fácilmente podrían bloquear el sistema, o si a esto no pueden llegar, porque se ha separado el espacio de los usuarios del espacio del sistema operativo a través de particiones distintas, sí podrían dejar al resto de usuarios sin almacenamiento, pues un único usuario tiene la posibilidad de acapararlo todo. Para evitar esto, podemos asignar cuotas de disco a los usuarios y/o a los grupos de usuarios, evitando así un uso excesivo, e incluso, malintencionado, del espacio de almacenamiento.

Es necesario que el kernel de GNU/Linux soporte las cuotas así como los sistemas de ficheros. El sistema quota v2, que es la última vesión, es soportado por la versión 2.6.x o superior del kernel y los sistemas de ficheros extN, reiserFS y XFS, entre otros, pueden trabajar con él.

El paquete que debemos instalar para usar el sistema quota v2 se denomina quota.

# apt install quota

El uso de cuotas hay que aplicarlo a cada partición (sistema de ficheros) donde queramos usarlo. Para ello, en el fichero /etc/fstab, en la columna de opciones de montaje, añadiremos una o las dos opciones siguientes, según sea nuestro objetivo, para sistemas de ficheros que no tengan activo el journal:

  • usrquota: Para aplicar cuotas a nivel de usuarios.
  • grpquota: Para aplicar cuotas a nivel de grupos.
/dev/sdb1   /home   ext3   usrquota,grpquota   1   2

Como ext4 sí usa journal por defecto, las opciones son un poco distintas:

  • usrjquota=aquota.user: La opción equivalente a usrquota.
  • grpjquota=aquota.group: La opción equivalente a grpquota.
  • jqfmt=vfsv0
/dev/sdb1   /home   ext4   usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0   1   2

Hecha la modificación sobre /etc/fstab, podemos reiniciar el sistema o montar de nuevo las particiones a las que le hemos añadido las opciones anteriores. Esto último lo haremos como sigue:

# mount -o remount /home
# mount | grep sdb1
/dev/sdb1 on / type ext4 (rw,relatime,quota,usrquota,grpquota)

O bien:

# mount -o remount /home
# mount | grep sdb1
/dev/sdb1 on / type ext4 (rw,relatime,jqfmt=vfsv0,usrjquota=aquota.user,grpjquota=aquota.group)

En este momento, se debe ejecutar el comando quotacheck, el cual revisará los sistemas de ficheros sobre los que se usarán cuotas, y creará en el directorio raíz de los sistemas de ficheros afectados, los archivos aquota.user y aquota.group, que son bases de datos que sirven para llevar el control de las cuotas de usuarios y grupos, respectivamente.

Las opciones de quotacheck que vamos a usar son:

  • -c : Indica que se creen los ficheros de control de cuotas (aquota.user y/o aquota.group), aunque ya existan. Sin esta opción, quotacheck se utiliza para chequear y reparar el sistema de cuotas.
  • -u : Se creará el fichero de control de cuotas de usuarios.
  • -g : Se creará el fichero de control de cuotas de grupos.
  • -m : Evitamos que el sistema de ficheros se monte de solo lectura.
# quotacheck -cugm /home
# ls /home
aquota.group aquota.user usuario

Si tuviéramos más de un sistema de ficheros donde aplicar el sistema de cuotas, podríamos haber usado la opción -a ó --all, y así evitar ejecutar la instrucción anterior para cada uno de ellos.

# quotacheck -acugm

Si, por ejemplo, huebiéramos decidido solo llevar cuotas por usuarios, no pondríamos la opción de montaje que afecta a los grupos y tampoco la opción -g de quotacheck, y así, la base de datos aquota.group no se creará.

Por último, antes de empezar a establecer las cuotas, debemos activar el sistema de cuotas. Disponemos de los comandos quotaon y quotaoff, que lo activan y desactivan, respectivamente, aunque, realmente es un solo comando, quotaoff es equivalente a quotaon -f.

Podemos ver el estado del sistema de cuotas, encendido o apagado, con la opción -p ó --print-state, usada con cualquiera de los dos comandos anteriores:

# quotaon -p /home
group quota on /home (/dev/sdb1) is off
user quota on /home (/dev/sdb1) is off
project quota on /home (/dev/sdb1) is off

O bien, junto con la opción -a ó --all, que nos evitaría indicar los sistemas de ficheros.

# quotaon -pa
group quota on /home (/dev/sdb1) is off
user quota on /home (/dev/sdb1) is off
project quota on /home (/dev/sdb1) is off

Vemos que el sistema de cuotas está ahora mismo desactivado para el sistema de ficheros /home, tanto las cuotas de los usuarios, como las de los grupos. Esto es distinto al servicio de cuotas, que sí está activo:

# systemctl status quota.service 
● quota.service - Initial Check File System Quotas
   Loaded: loaded (/lib/systemd/system/quota.service; enabled)
   Active: active (exited) since mar 2023-12-12 16:55:25 CET; 1h 12min ago
     Docs: man:quotacheck(8)
  Process: 472 ExecStart=/usr/share/quota/quota-initial-check.sh (code=exited, status=0/SUCCESS)
 Main PID: 472 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/quota.service

dic 12 16:55:25 debian systemd[1]: Started Initial Check File System Quotas.

Activemos ahora el sistema de cuotas con quotaon:

# quotaon /home
# quotaon -p /home
group quota on /home (/dev/sdb1) is on
user quota on /home (/dev/sdb1) is on
project quota on /home (/dev/sdb1) is off

También podemos usar las opciones -u para activar las cuotas de usuario y -g para las de grupo. Con la opción -a nos referiremos a todos los sistemas de ficheros con cuotas.

Si quisiéramos desactivar el sistema de cuotas para los grupos de todos los sistemas de ficheros con cuotas, ejecutaríamos lo siguiente:

# quotaoff -ag

Queda ahora asignar las cuotas a los usuarios y a los grupos. Estas cuotas pueden ser un tope de bloques de datos (de 1KB para el sistema de cuotas) y/o de inodos. Un tope de inodos sería casi como decir un tope de ficheros, pues un inodo sirve para controlar un fichero, pero es casi porque los enlaces simbólicos consumen también un inodo, y no son realmente un fichero, sino que apuntan a un fichero.

Hay dos tipos de topes o de límites, por un lado está el límite duro (hard), que es un límite absoluto que el sistema no dejará que se sobrepase, y por otro lado, está el límite blando (soft), que debe estar por debajo del límite duro, y cuando se sobrepasa, el sistema nos avisa periódicamente de que nos queda poco de cuota, y si llegamos al límite duro, ya no podremos usar más espacio y/o crear más ficheros.

El límite blando se suele usar junto con un periodo de gracia que comienza cuando se llega al límite blando, y funciona como un segundo tope, no se podrán usar más bloques de datos y/o inodos, cuando se alcance el límite duro o se consuma el periodo de gracia.

El comando edquota es el que se utiliza para establecer o editar las cuotas de un usuario o de un grupo. Este comando llama al editor por defecto del sistema y simplemente escribiremos los límites soft y hard de bloques y/o inodos.

Por ejemplo, para editar las cuotas de "usuario":

# edquota usuario
# edquota -u usuario

Y las del grupo "usuario":

# edquota -g usuario

Tras ejecutar la edición de cuotas con "edquota -u usuario", en este caso, vemos el editor nano con el siguiente contenido:

  GNU nano 7.2                                               /tmp//EdP.aQcHtJN                                                         
Disk quotas for user usuario (uid 1000):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sdb1                       340          0          0         63        0        0




                                                          [ 3 líneas leídas ]
^G Ayuda        ^O Guardar      ^W Buscar       ^K Cortar       ^T Ejecutar     ^C Ubicación    M-U Deshacer    M-A Poner marca
^X Salir        ^R Leer fich.   ^\ Reemplazar   ^U Pegar        ^J Justificar   ^/ Ir a línea   M-E Rehacer     M-6 Copiar

La información que tenemos en el editor es la siguiente:

  • En la parte superior podemos ver que estamos editando las cuotas de un usuario y no de un grupo.
  • En la columna Filesystem se indican los sistemas de ficheros afectados por los límites establecidos en su correspondiente línea.
  • La columna blocks nos informa del número de bloques de datos que lleva usados el usuario, en este caso.
  • La columna inodes nos informa del número de inodos que lleva usados el usuario.
  • Las columnas soft y hard se usan para indicar los límites. En primer lugar los de bloques de datos y en segundo lugar los de inodos. El valor cero en una columna en concreto indica que dicho límite no se usa.

Con la orden dada anteriormente, editaríamos los límites de todos los sistemas de fichero con cuotas, aunque en nuestro caso, al ser solo uno, nos sale una única línea, pero podían haber salido más. Es posible, con la opción -f, editar solo las cuotas de un único sistema de ficheros, aunque existan más.

# edquota -f /home usuario
# edquota -f /dev/sdb1 usuario

El comando edquota con la opción -p da la posibilidad de copiar la cuota de un usuario a otros usuarios, y lo mismo para grupos. Esta opción va acompañada del usuario o del grupo que se utilizará como referencia para repetir las cuotas en el resto de usuarios o grupos.

# edquota -p usuario_referencia usuario...
# edquota -g -p grupo_referencia grupo...

Se podría añadir a los comandos anteriores la opción -f para que solo se copie la cuota de un solo sistema de ficheros.

En relación al periodo de gracia de un usuario, este debe ser expresado en dias (days), horas (hours), minutos (minutes) o segundos (seconds), y nos encontramos con dos tipos, uno específico para cada usuario y otro global que se aplica cuando no se da uno específico.

Para establecer el periodo de gracia global utilizaremos la opción -t de edquota:

# 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/sdb1                     7days                  7days




                                                          [ 4 líneas leídas ]
^G Ayuda        ^O Guardar      ^W Buscar       ^K Cortar       ^T Ejecutar     ^C Ubicación    M-U Deshacer    M-A Poner marca
^X Salir        ^R Leer fich.   ^\ Reemplazar   ^U Pegar        ^J Justificar   ^/ Ir a línea   M-E Rehacer     M-6 Copiar

Como vemos, por defecto, el periodo de gracia para los límites soft de los bloques de datos y de los inodos es de 7 dias.

El cambio del periodo de gracia para un usuario en concreto se hace con la opción -T, y debe ser inferior al global.

# edquota -T -u usuario
 GNU nano 7.2                                               /tmp//EdP.a7ig4Zj                                                         
Times to enforce softlimit for user usuario (uid 1000):
Time units may be: days, hours, minutes, or seconds
  Filesystem                         block grace               inode grace
  /dev/sdb1                                 unset                  unset



                                                          [ 4 líneas leídas ]
^G Ayuda        ^O Guardar      ^W Buscar       ^K Cortar       ^T Ejecutar     ^C Ubicación    M-U Deshacer    M-A Poner marca
^X Salir        ^R Leer fich.   ^\ Reemplazar   ^U Pegar        ^J Justificar   ^/ Ir a línea   M-E Rehacer     M-6 Copiar

La palabra unset se utiliza para indicar que no hay periodo de gracia específico y se utilizará el global.

Con el comando quota un usuario puede consultar su cuota, por ejemplo:

$ quota
Disk quotas for user usuario (uid 1000): 
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
      /dev/sdb1     340     400     450              63     100     120        

Y con la opción -g consultará las cuotas de los grupos a los que pertenece.

$ quota -g

Otras opciones que se pueden usar son:

  • -s : Para la típica salida -h (--human), es decir, expresada en KB, MB, etc.
  • -q : Solo muestra los sistemas de ficheros en los que se han sobrepasado los límites.

El root puede usar esta orden para ver las cuotas de todos los usuarios y grupos, pudiendo especificar más de uno.

# quota [-u] usuario...
# quota -g grupo...

Con el comando repquota, el root puede obtener un informe completo de las cuotas de un sistema de ficheros:

# repquota /dev/sdb1
*** Report for user quotas on device /dev/sdb1
Block grace time: 2days; Inode grace time: 2days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --       4       0       0              1     0     0       
usuario   --     456    1000    1200            123   300   400       
u1        --      24      50     100              6    20    30       

Si se usa la opción -a, no habrá que especificar ningún sistema de ficheros, pues los incluye a todos los que usen cuotas. También están disponibles la opciones -u, para cuotas de usuario y -g, para cuotas de grupo. La opción -s muestra los datos en unidades de kilo, mega, etc.

Otro comando para asignar cuotas es quotatool, que no es tan interactivo como edquota y en muchas ocasiones nos va a resultar más cómodo. Para disponer de él, es necesario instalarlo.

# apt install quotatool

Las siguientes son opciones que se puede utilizar con quotatool:

  • -u usuario : Indica el usuario al que afectará la orden.
  • -g grupo : En este caso quotatool afectará a un grupo.
  • -b : La cuota será de bloques de datos. Opción por defecto.
  • -i : La cuota será de inodos.
  • -q cantidad : Establece el límite blando de bloques (-b) o de inodos (-i).
  • -l cantitad : Establece el límite duro de bloques (-b) o de inodos (-i).
  • -t tiempo : Establece el tiempo de gracia global.

La cantidad que va con -q o -l, es un número entero o real, si no lleva signo indicará valor absoluto, pero si lleva signo + o -, indicará incremento o decremento, respectivamente. También puede finalizar con una unidad de las siguientes: KB, MB, GB, TB, bytes y blocks (valor por defecto).

El tiempo de la opción -t es un número entero que por defecto son segundos, pero se puede indicar una unidad al final: seconds, s, minutes, mi, hours, h, days, d, weeks, w, months, mo. Y también, al igual que las opciones anteriores, el valor, opcionalmente, puede llevar los signos + o -.

La sintaxis exacta se puede consultar con la orden man, pero para la mayoría de los casos es la siguiente:

# quotatool {-u usuario | -g grupo} [ -b | -i ] {-q cantidad | -l cantidad} sistema_de_ficheros

Un ejemplo completo sería el siguiente:

# quotatool -u u1 -b -q 750MB -l 900MB -i -q 1000 -l 1500 /home
# quotatool -u -b -t 1d /dev/sdb1