Activar y gestionar quotas en sistemas de ficheros de GNU/Linux

Cuando en nuestro sistema conviven una buena cantidad de usuarios y grupos y queremos ‘mantener el orden‘ en lo referente a el espacio usado por cada uno de ellos, tenemos la opción de activar el sistema de quotas a nivel de sistema de ficheros de modo que podamos personalizar por usuario y grupo el espacio máximo o número de inodos que pueden utilizar.

Activación e inicialización de quotas

Lo primero que debemos averiguar es si nuestro sistema es compatible con las quotas, para ello, por un lado deberíamos tener instalado el paquete quota, en RHEL, CentOS y derivados lo podemos verificar así. Asumimos que el filesystem utilizado es ext3 o ext4. De XFS hablaremos en otro post.

# rpm -qa | grep quota
quota-3.13-4.el5

Para instalar:

# yum install quota

En Debian y Ubuntu podemos instalar verificar con dpkg e instalar por APT:

$ dpkg -l | grep quota
ii  quota     4.00~pre1-7               implementation of the disk quota system
# apt-get install quota

El paso siguiente ess saber si la partición o sistema de ficheros sobre el que queremos activar quotas tiene los flags correspondientes que lo activan (usrquota,grpquota):

# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw,acl)

Si no lo tiene, como es el caso anterior, lo activamos, tanto para usuarios como grupos, remontando el sistema de ficheros añadiendo los nuevos flags:

# mount -o remount,usrquota,grpquota /
# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw,acl,usrquota,grpquota)

Para que esto tenga efecto tras el reinicio tendréis que añadir las flags al fichero /etc/fstab:

/dev/VolGroup00/LogVol00 /                       ext3    defaults,usrquota,grpquota       1 1

Ahora podemos usar quotas en /, únicamente nos falta inicializarlas, para ello utilizamos el comando quotacheck, que hace un escaneo de las quotas asignadas a grupos y usuarios, y en caso de que sea la primera vez, crea los ficheros de quota para usuarios y grupos. Veréis aparecen errores, es normal al ser la primera vez ya que no existen:

# quotacheck -cgumv /
quotacheck: Scanning /dev/mapper/VolGroup00-LogVol00 [/] quotacheck: Cannot stat old user quota file: No such file or directory
quotacheck: Cannot stat old group quota file: No such file or directory
quotacheck: Cannot stat old user quota file: No such file or directory
quotacheck: Cannot stat old group quota file: No such file or directory
done
quotacheck: Checked 4266 directories and 31262 files
quotacheck: Old file not found.
quotacheck: Old file not found.

Los parámetros son:

  • -c: Escaneo del sistema de ficheros en busca de quotas
  • -g: Busca quotas de grupos
  • -u: Busca quotas de usuarios
  • -m: No intenta hacer un remount en sistemas read-only
  • -v: Verbose

Tras el escaneo, podemos activar las quotas en el sistema de ficheros elegido (-u de usuario, -g de grupo y -v de verbose):

# quotaon -ugv /
/dev/mapper/VolGroup00-LogVol00 [/]: group quotas turned on
/dev/mapper/VolGroup00-LogVol00 [/]: user quotas turned on

Asignación de quota a usuarios o grupos

A la hora de editar las quotas podemos hacerlo de dos formas, directamente desde la línea de comandos con setquota o editando el fichero correspondiente con edquota, vamos a ver las dos formas.

Asignamos una quota de 250M de soft limit, 300 de hard limit y sin límite de inodos al usuario foo en /:

# setquota -u foo 256000 307200 0 0 /

O lo hacemos con edquota:

# edquota foo
Disk quotas for user foo (uid 10000):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/mapper/VolGroup00-LogVol00    1068920     256000     307200      35408        0        0

Para visualizar el estado de las quotas de un usuario o grupo, utilizamos quota -v:

# quota -v foo
Disk quotas for user foo (uid 10000): 
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/mapper/VolGroup00-LogVol00
                1068920* 256000  307200   6days   35407       0       0

Para los grupos es igual, pero utilizando el parámetro -g:

# edquota -g grupo
# setquota -g grupo 256000 307200 0 0 /

También podéis ver distintos reportes con el comando repquota. Reportes de todos los usuarios, todos los grupos, todo un sistema de ficheros, etc:

# repquota -v /
*** Report for user quotas on device /dev/mapper/VolGroup00-LogVol00
Block grace time: 7days; Inode grace time: 7days
Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      +- 1068920  256000  307200  6days   35407     0     0
daemon    --      20       0       0              3     0     0
nobody    --       4       0       0              1     0     0
# repquota -vg /
*** Report for group quotas on device /dev/mapper/VolGroup00-LogVol00
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
Group           used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      -- 1066300       0       0          35348     0     0       
daemon    --      28       0       0              4     0     0       
tty       --      28       0       0              2     0     0       
disk      --       4       0       0              1     0     0       
mail      --     220       0       0              7     0     0       
man       --     256       0       0             32     0     0

Algo a tener en cuenta son los ‘periodos de gracia’ o dicho de otro modo, el tiempo que dejamos al usuario o al grupo pasar el soft-limit sin que suceda nada. Lo podemos modificar utilizando el parámetro -t. Podemos ver la configuración y/o modificarla así para todos los usuarios y grupos:

# 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/mapper/VolGroup00-LogVol00                  7days                  7days

Por defecto son 7 días, tanto para inodos como para bloques. Si quisieramos modificarlo de forma individual sería con la T mayúscula, y añadiendo la g si es para grupos:

# edquota -t foo
# edquota -tg grupo

Si lo hacemos con setquota, tendremos que especificar el tiempo en segundos:

Para un usuario:

# setquota -uT foo 20000 20000 /

Para un grupo:

# setquota -ug grupo 20000 20000 /

Y para todos los usuarios:

# setquota -ut 20000 20000 /

Deshabilitar quotas

Podemos deshabilitar las quotas del sistema de ficheros o en general con el comando quotaoff:

Para todos los filesystems:

# quotaoff -av
/dev/mapper/VolGroup00-LogVol00 [/]: group quotas turned off
/dev/mapper/VolGroup00-LogVol00 [/]: user quotas turned off

O para uno en concreto:

# quotaoff -av /
/dev/mapper/VolGroup00-LogVol00 [/]: group quotas turned off
/dev/mapper/VolGroup00-LogVol00 [/]: user quotas turned off