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