# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

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 cuotas/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í:

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

Si está instalado, el próximo paso es 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 remontando el sistema de ficheros así:

# 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

Activar Quotas en VPS Virtuozzo


Vamos a seguir los pasos descritos en la documentación de cPanel sobre la activación de quotas en una máquina virtual Virtuozzo.

Lo primero que tenemos que hacer es activar las Quotas a nivel de Virtuozzo/Máquina virtual. Este es el primer nivel disponible, el cual permite asignar un espacio e inodos a un contenedor VPS. Para verificar si están activadas a nivel de contenedor, ejecutamos el siguiente comando:

# vzquota show ID_de_contenedor

Si tenemos activadas las Quotas, debería aparecer una información similar a:

   resource          usage       softlimit      hardlimit    grace
  1k-blocks        2900544        10485760       10485760
     inodes         146576          600000         620000    

Los valores de espacio en disco e inodos se definen en el fichero de configuración de la máquina virtual (ve.conf):

DISKINODES="600000:620000"
DISKSPACE="10485760:10485760"

Se pueden modificar a tiempo real:

# vzctl set 101 --diskspace 1000000:1100000 --save
# vzctl set 101 --diskinodes 90000:91000 --save

Las Quotas de segundo nivel las define el parámetro QUOTAUGIDLIMIT del fichero de configuración ve.conf, por defecto su valor es desactivado (0). Si lo activamos permitimos que se calculen las Quotas dentro de la máquina virtual por usuario y grupo.

Si la ejecución del siguiente comando es igual a 0 significa que no están activadas, si devuelve un valor distinto a 0 están activas (CT_ID es el ID de contenedor):

grep -i QUOTAUGIDLIMIT /etc/sysconfig/vz-scripts/CT_ID.conf

Cambiando este valor y reiniciando la máquina virtual ya las tendremos activadas, el número configurado indicará el límite de número de propietarios de fichero en el VPS. A tiempo real (también requiere reinicio se puede modificar también.

# zctl set 101 --quotaugidlimit 50 --save

Una vez realizado esto, si utilizamos cPanel/WHM únicamente tendríamos que inicializar las Quotas desde la interfaz WHM, sección “Initial Quota Setup“.

cPanel: Internal Server Error User is over quota


Desde la última actualización de cPanel/WHM si un usuario tiene la cuota excedida recibe el siguiente error al acceder a webmail:

Internal Server Error
>
> User 'xxxxxx' is over quota.
>
> ------------------------------------------------------------------------
> cpsrvd/11.25 Server at xxxxx

Pese a aumentar la cuota, el error sigue apareciendo, y es necesario eliminar el siguiente fichero:

rm /var/cpanel/overquota/usuario

Otra opción si no queréis borrar el fichero es reiniciar cPanel:

/etc/init.d/cpanel restart

¡Gracias tureceta!

Bind DNS: Zone transfer deferred due to quota


Este error podéis encontrarlo en los logs de un servidor DNS esclavo con BIND, y es provocado cuando el servidor DNS maestro está transfiriendo una gran cantidad de zonas DNS al esclavo de forma concurrente.
Ejemplo:

13-Jul-2009 05:24:38.360 xfer-in: info: zone xxx1.net/IN: zone transfer deferred due to quota
13-Jul-2009 05:24:38.360 xfer-in: info: zone xxx2.com/IN: zone transfer deferred due to quota
13-Jul-2009 05:24:38.361 xfer-in: info: zone xxx3.com/IN: zone transfer deferred due to quota
13-Jul-2009 05:24:38.361 xfer-in: info: zone xxx4.com/IN: zone transfer deferred due to quota
13-Jul-2009 05:24:38.361 xfer-in: info: zone xxx5.com/IN: zone transfer deferred due to quota

Por defecto, bind permite una concurrencia de 10 transferencias de zona. Este número puede ser insuficiente en servidores DNS con gran número de zonas, y que además añada nuevas de forma constante y concurrente.

Para solucionarlo debemos añadir en el fichero de configuración named.conf del servidor esclavo la directiva transfers-in con el nº de transferencias concurrentes que queramos. Debe ir dentro de la sección de opciones globales:

options {

  transfers-in 50;

};

Y en el servidor maestro configuramos el nº de transferencias concurrentes que permitimos (de salida, mientras que en el esclavo es de entrada):

options {

  transfers-out 50;

};

Recargamos la configuración de named y el nuevo valor comenzará a surtir efecto.