Activar y gestionar quotas en sistemas de ficheros XFS

Como bien sabéis, RHEL y CentOS a partir de la versión 7 utilizan XFS por defecto este sistema de ficheros en lugar de ext4 así que es un FS que cada vez va a estar más presente en los sistemas GNU/Linux. Vamos a ver los pasos para activar las quotas a nivel de filesystem y los distintos métodos para activar y gestionar las cuotas de usuarios, grupos y proyectos (directorios específicos).

Activar quotas en XFS Filesystem

Si bien hay partes del proceso que son similares, el método de activación de quotas en el sistema de ficheros XFS es distinto al que utilizamos para filesystems ext3, ext4,etc.

Lo primero que debemos hacer es ver como está montado el filesystem y si el soporte de quota está activo:

# mount --types xfs
/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,noquota)
/dev/sda1 on /boot type xfs (rw,relatime,attr2,inode64,noquota)

Se puede observar la opción «noquota» en ambos FS así que es necesario activarlas. Vamos a ver como hacerlo para el raíz del sistema (/).

La diferencia respecto a los sistemas de archivos extendidos (extended file system o ext) es que XFS requiere habilitar las quotas a través del parámetro de kernel»rootflags» en tiempo de arranque (boot). Debemos entonces añadir el parámetro de kernel en la configuración de grub. La variable que contiene los parámetros es «GRUB_CMDLINE_LINUX«, a la cual añadiremos:

rootflags='uquota,pquota'

Como veréis, pquota es nuevo, algo estilo qtree de netapp. Luego lo veremos, además añade la funcionalidad de utilizar Active Directory para configurarlas:

  • uquota: cuotas de usuario.
  • gquota: cuotas de usuario.
  • pquota: cuotas de proyecto.

En RHEL y CentOS (grub2), el procedimiento para generar el nuevo grub es el siguiente:

/etc/default/grub

Ejemplo de cambio de la variable:

Antes:

GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/swap vconsole.font=latarcyrheb-sun16 vconsole.keymap=es rd.lvm.lv=centos/root crashkernel=auto"

Después:

GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/swap vconsole.font=latarcyrheb-sun16 vconsole.keymap=es rd.lvm.lv=centos/root crashkernel=auto rootflags=uquota,pquota"

Generamos la nueva configuración de grub (haced un backup antes):

# cp -p /boot/grub2/grub.cfg /boot/grub2/grub.cfg.BACKUP
# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-123.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-123.el7.x86_64.img
Warning: Please don't use old title 'CentOS Linux, with Linux 3.10.0-123.el7.x86_64' for GRUB_DEFAULT, use 'Advanced options for CentOS Linux>CentOS Linux, with Linux 3.10.0-123.el7.x86_64' (for versions before 2.00) or 'gnulinux-advanced-3569ac5d-58a2-479b-b6a9-967bb66adf7e>gnulinux-3.10.0-123.el7.x86_64-advanced-3569ac5d-58a2-479b-b6a9-967bb66adf7e' (for 2.00 or later)
Found linux image: /boot/vmlinuz-0-rescue-950ed0614a9548f7bf87a4749b18cffa
Found initrd image: /boot/initramfs-0-rescue-950ed0614a9548f7bf87a4749b18cffa.img
done

Reiniciamos el sistema para aplicar los cambios:

# reboot

Al reiniciar, seguiremos viendo los filesystem sin quota ya que a partir de aquí sí que tenemos que seguir el procedimiento estándar de activación de quotas igual que con los ext filesystems. Es necesario añadir las mismas flags a la entrada del filesystem en /etc/fstab:

/etc/fstab

Antes:

/dev/mapper/centos-root /     xfs     defaults        1 1

Después:

/dev/mapper/centos-root /     xfs     defaults,usrquota,pquota        1 1

Hacemos un remount para activar los cambios sin tener que reiniciar de nuevo:

# mount -o remount,usrquota,pquota /
# mount --types xfs
/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,usrquota,prjquota)
/dev/sda1 on /boot type xfs (rw,relatime,attr2,inode64,noquota)

Un apunte, se pueden utilizar las flags uqnoenforce y pqnoenforce de modo que las quotas sean efectivas sólo a modo informativo.

xfs_quota

El comando «xfs_quota» permite establecer una shell interactiva para realizar todas las tareas de control de quota:

# xfs_quota 
xfs_quota> 

Para visualizar la ayuda extendida de cada comando le anteponemos «help», ejemplo:

xfs_quota> help quota
quota [-bir] [-gpu] [-hnNv] [-f file] [id|name]... -- show usage and limits

 display usage and quota information

 -g -- display group quota information
 -p -- display project quota information
 -u -- display user quota information
 -b -- display number of blocks used
 -i -- display number of inodes used
 -r -- display number of realtime blocks used
 -h -- report in a human-readable format
 -n -- skip identifier-to-name translations, just report IDs
 -N -- suppress the initial header
 -v -- increase verbosity in reporting (also dumps zero values)
 -f -- send output to a file
 The (optional) user/group/project can be specified either by name or by
 number (i.e. uid/gid/projid).

Aplicar quota a usuarios y grupos

Como hemos visto antes, podemos utilizar la shell de xfs_quota o directamente ejecutar los comandos desde la shell de bash, ksh, etc. En el siguiente ejemplo vemos como aplicar una quota de 500MB (soft) y 600MB (hard) al usuario «foo» en /:

# xfs_quota -x -c 'limit bsoft=500m bhard=600m foo' /

También podemos aplicar una limitación de inodos:

# xfs_quota -x -c 'limit isoft=500 ihard=700 foo' /

Para visualizar un reporte general de las quotas aplicadas en un determinado filesystem utilizamos el comando «report» ejecutando desde bash:

# xfs_quota -x -c report /
User quota on / (/dev/mapper/centos-root)
                               Blocks                     
User ID          Used       Soft       Hard    Warn/Grace     
---------- -------------------------------------------------- 
root          1685796          0          0     00 [--------]
nobody              0          0          0     00 [--------]
polkitd             0          0          0     00 [--------]
postfix             8          0          0     00 [--------]
foo               988     512000     614400     00 [--------]
prueba           5500          0          0     00 [--------]
bar                12          0          0     00 [--------]
apache          19840          0          0     00 [--------]
admin              12          0          0     00 [--------]

Aplicar quota a proyectos

Si conocéis los qtrees de Netapp veréis que esto es lo mismo. Los proyectos permiten establecer quotas a nivel de directorio (managed trees). Cada uno de estos directorios debe ser dado de alta con un project ID y project Name (opcional). Estos son los pasos:

Crear el archivo de proyectos (/etc/projects) y añadir cada directorio junto con su ID de proyecto:

/etc/projects
echo 01:/foo >> /etc/projects

Mapear el ID de proyecto con su correspondiente nombre en /etc/projid

# echo fooproject:01 >> /etc/projid

Inicializar el proyecto:

# mkdir /foo
# xfs_quota -x -c 'project -s fooproject' /foo

Y finalmente establecemos el límite para el proyecto:

# xfs_quota -x -c 'limit -p bhard=100m fooproject' /

Si ejecutamos el reporte vemos como se ha añadido el proyecto:

# xfs_quota -x -c report /
User quota on / (/dev/mapper/centos-root)
                               Blocks                     
User ID          Used       Soft       Hard    Warn/Grace     
---------- -------------------------------------------------- 
root          1685800          0          0     00 [--------]
nobody              0          0          0     00 [--------]
polkitd             0          0          0     00 [--------]
postfix             8          0          0     00 [--------]
foo               988     512000     614400     00 [--------]
prueba           5500          0          0     00 [--------]
bar                12          0          0     00 [--------]
apache          19840          0          0     00 [--------]
admin              12          0          0     00 [--------]

Project quota on / (/dev/mapper/centos-root)
                               Blocks                     
Project ID       Used       Soft       Hard    Warn/Grace     
---------- -------------------------------------------------- 
fooproject          0          0     102400     00 [--------]

Podéis verificar generando un archivo del tamaño correspondiente:

# dd if=/dev/urandom of=/foo/test count=4M 
dd: writing to ‘/foo/test’: No space left on device
204801+0 records in
204800+0 records out
104857600 bytes (105 MB) copied, 10,0552 s, 10,4 MB/s
# xfs_quota -x -c report /

[...]
Project quota on / (/dev/mapper/centos-root)
                               Blocks                     
Project ID       Used       Soft       Hard    Warn/Grace     
---------- -------------------------------------------------- 
fooproject     102400          0     102400     00 [--------]

Si se quiere, es posible activar las quotas de proyectos sin tener que editar manualmente los archivos de configuración, ejemplo;:

 # xfs_quota -x -c 'project -s -p /foo 01' /
# xfs_quota -x -c 'limit -p bhard=1g 01' /