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