Limitando o uso de espaço em disco (quotas)

O sistema de quotas é usado para limitar o espaço em disco disponível a usuários/grupo. O uso de partições independentes para o diretório /home e outros montados separadamente não é muito eficaz porque muitos usuários serão prejudicados se a partição for totalmente ocupada e alguns possuem requerimentos de uso maior do que outros.

O suporte a Quotas deve estar compilado no kernel (seção FileSystems) e o sistema de arquivos deverá ser do tipo ext2 ou XFS para funcionar.

Instalando o sistema de quotas

Abaixo o passo a passo para a instalação de quotas em seu sistema:

  1. Recompile seu kernel com suporte a quota. Habilite a opção "Quota support" na seção "FileSystems" na configuração de recursos do seu kernel.

  2. Instale o pacote no sistema (apt-get install quota).

  3. Habilite a quota para os sistemas de arquivos que deseja restringir no arquivo /etc/fstab:

    /dev/hda1    /boot ext2     defaults                   1  1
    /dev/hda3    /     ext2     defaults,usrquota          1  2
    /dev/hda4    /usr  ext2     defaults,grpquota          1  3
    /dev/hda5    /pub  ext2     defaults,usrquota,grpquota 1  4
    

    O sistema de arquivos /dev/hda1 não terá suporte a quota, /dev/hda3 terá suporte a quotas de usuários (usrquota), /dev/hda4 terá suporte a quotas de grupos (grpquota) e /dev/hda5 terá suporte a ambos. Por padrão é assumido que os arquivos de controle de quota estão localizados no ponto de montagem da partição com os nomes quota.user e quota.group.

  4. Agora será necessário criar os arquivos quota.user e quota.group no ponto de montagem de cada partição ext2 acima que utilizará o recurso de quotas. O arquivo quota.user controla as quotas de usuários e quota.group controla as quotas de grupos.

    • Crie um arquivo vazio quota.user em / (terá suporte somente a quota de usuários, veja a opção de montagem no /etc/fstab): touch /quota.user ou echo -n >/quota.user.

    • Crie um arquivo vazio quota.group em /usr (terá suporte somente a quota de grupos): touch /usr/quota.group ou echo -n >/usr/quota.group.

    • Crie um arquivo vazio quota.user e quota.group em /pub (este sistema de arquivos tem suporte a ambos os tipos de quota): touch /pub/quota.user /pub/quota.group.

    Por motivos de segurança, as permissões dos arquivos de controle de quota quota.user e quota.group devem ser leitura/gravação ao usuário root e sem permissões para grupo/outros usuários: chmod 0600 /quota.user /quota.group.

    OBS: Se deseja utilizar o quota versão 1, certifique-se que não existem os arquivos chamados aquota.user e aquota.group no diretório raíz de sua partição. Se eles estiverem disponíveis, os utilitários de quota utilizarão esta versão como padrão, atualmente o kernel 2.4 possui somente suporte a quota versão 1.

    A versão 2 do quota checa corrompimento dos arquivos de dados de quota e trabalha mais rápido em partições grandes. São necessários patches da série "ac" (Alan Cox) para usar a versão 2 do quota.

  5. Entre em modo monousuário init 1, desmonte os sistemas de arquivos que utilizarão a quota e monte-os novamente (isto serve para ativar as opções de quota). Alternativamente, execute umount -a (para desmontar todos os sistemas de arquivos) e mount -a para remontar todos.

    Se você ativou as quotas para o sistema de arquivos / (como em nosso exemplo) será necessário reiniciar o sistema.

  6. O próximo passo é scanear o disco para criar os dados para as partições com suporte a quota (ativadas no /etc/fstab):

     quotacheck -augv
    

    O parâmetro -a diz para checar todas as partições com suporte a quota no arquivo /etc/mtab, -u para checar quotas de usuários, -g para checar grupos e -v para mostrar o progresso da checagem da partição.

    Na primeira execução é mostrado uma mensagem de erro de arquivo quota.user/quota.group corrompido, mas isto é normal porque o arquivo anterior tem tamanho zero. Estes nomes também servem para o quotacheck "auto-detectar" a versão do sistema de quota usada no sistema de arquivos.

    OBS: Certamente será necessário "forçar" a remontagem como somente leitura do sistema de arquivos / com a opção -m para o quotacheck criar as configurações de quota nesta partição.

  7. Agora resta ativar o suporte as quotas de disco em todas as partições (-a) com recurso de quota especificado (no /etc/mtab):

     quotaon -augv
    

    As opções possuem o mesmo significado do comando quotacheck. O utilitário quotaoff serve para desativar quotas de usuários e usa as mesmas opções do quotaon. Estes três utilitários somente podem ser usados pelo usuário root. As opções de quota podem ser especificadas independente para cada sistema de arquivos:

    # Ativa o suporte a quota em /pub (somente grupos de usuários no momento).
    quotaon -gv /pub
    
    # Ativa as quotas de usuários em /pub
    quotaon -uv /pub
    
    # Desativa as quotas de grupos em /pub (deixando somente a de usuários ativa)
    quotaoff -gv /pub
    

A atualização de quotas durante a gravação/exclusão de arquivos é feita automaticamente. O utilitário quotacheck deverá ser executado sempre que o sistema de quotas for desativado (por não haver atualização automática dos dados de uso de disco) ou quando ocorrerem falhas de disco.

Na distribuição Debian o quotacheck é disparado sempre que necessário após as situações de checagem de disco. As quotas de todas as partições também são ativadas automaticamente pelo script /etc/init.d/quota e /etc/init.d/quotarpc.

Em sistemas que utilizam NFS e possuem sistemas de arquivos exportados em /etc/exports, o daemon rpc.rquotad deverá ser carregado. Sua função é fornecer os detalhes de quota dos sistemas de arquivos locais exportados para as máquinas clientes.

Editando quotas de usuários/grupos

O programa edquota é usado pelo root para editar as quotas de usuários/grupos. Por padrão, todos os usuários/grupos do sistema não possuem quotas. Sua sintaxe é a seguinte

edquota [opções] [usuário/grupo]

As opções podem ser:

-u

Edita a quota do usuário especificado (esta é a padrão).

-g

Edita a quota de grupo especificado.

-r

Permite editar a quota de sistemas de arquivos remotos através do daemon rpc.rquotad.

-p [usuário/grupo]

Usa os valores especificados para o usuário/grupo para definir a nova quota, sem necessidade de entrar no modo de edição.

-t

Permite modificar o valor de tolerância dos limites que ultrapassam soft até que sejam bloqueados. Durante o tempo de tolerância, serão enviados somente avisos sobre a quota ultrapassada sem bloquear totalmente a gravação de arquivos (até que o limite hard seja atingido ou o tempo de tolerância seja ultrapassado).

Quando a quota soft do usuário/grupo é estourada, a mensagem "warning: user disk quota excedeed" será exibida. Quando a quota hard é ultrapassada, a gravação atual é interrompida e a mensagem "write failed, user disk limit reatched" é mostrada ao usuário. Nenhuma nova gravação que ultrapasse a quota hard é permitida Por exemplo, para modificar a quota do usuário gleydson: edquota gleydson

Disk quotas for user gleydson (uid 1000): 
  Filesystem                   blocks       soft       hard     inodes     soft
    hard
  /dev/hda5                    504944     500100     600000      10868        15000
       20000

O editor de textos usado poderá ser modificado através da variável $EDITOR. Abaixo a explicação destes campos:

  • Filesystem - Sistema de arquivos que terá a quota do usuário/grupo editada. As restrições se aplicam individualmente de acordo com o sistema de arquivos.

  • blocks - Número máximo de blocos (especificado em Kbytes) que o usuário possui atualmente. O usuário gleydson está usando atualmente 504944 Kbytes.

    • soft - Restrição mínima de espaço em disco usado. Atualmente 500100 Kb.

    • hard - Limite máximo aceitável de uso em disco para o usuário/grupo sendo editado. 600000 Kb atualmente. O sistema de quotas nunca deixará este limite ser ultrapassado.

  • inodes - Número máximo de arquivos que o usuário possui atualmente na partição especificada. O usuário gleydson possui atualmente 10868 arquivos na partição /pub.

    • soft - Restrição mínima de número de arquivos que o usuário/grupo possui no disco. Atualmente em 15.000.

    • hard - Restrição máxima de número de arquivos que o usuário/grupo possui no disco. Atualmente em 20.000.

Para desativar as restrições coloque "0" no campo soft ou hard. Quando o limite soft é atingido, o usuário é alertado por ter ultrapassado sua quota com a mensagem "warning: user quota excedeed" (quota do usuário excedida). O programa setquota é uma programa não-interativo para edição de quotas para ser usado diretamente na linha de comando ou em shell scripts.

Após ultrapassar o limite soft, começa a contagem do tempo para que este passe a valer como limite hard (o máximo aceitável e que nunca poderá ser ultrapassado). O comando edquota -t serve para modificar estes valores na partição especificada:

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/hda5                  2days                  7days

Abaixo a explicação destes campos:

  • Filesystem - Sistema de arquivos que terá o período de tolerância modificado.

  • Block grade period - Tempo máximo de tolerância para usuários/grupos que ultrapassaram sua quota soft de espaço em disco antes de passar a valer como hard. No exemplo, o usuário tem 2 dias para excluir possíveis arquivos ou contactar o administrador para redimensionar o tamanho de quota. O valor padrão é 7 dias.

  • Inode grade period - Tempo máximo de tolerância para usuários/grupos que ultrapassaram sua quota soft de número de arquivos gravados antes de passar a valer como hard. No exemplo, o usuário tem 7 dias para excluir possíveis arquivos ou contactar o administrador para analisar seu tamanho de quota. O valor padrão é 7 dias.

OBS1: - O comando quotacheck deverá ser executado na partição sempre que novas restrições/limites forem editados com o edquota. Isto atualiza os arquivos quota.user e quota.group. Lembre-se de desativar o sistema de quotas (quotaoff -ugv /partição) antes de executar este comando (para liberar totalmente a partição, quotacheck remonta a partição somente para leitura quando é executado). Por este motivo é recomendável fazer isso em modo monousuário.

OBS2: Quando o limite soft (suave) é excedido, o sistema começará a lhe mostrar mensagens alertando a passagem do limite (para lhe dar tempo de eliminar arquivos ou não ser pego desprevenido com o bloqueio de gravação) porque o limite hard (rígido) nunca poderá ser ultrapassado.

OBS3: - O tempo de tolerância restante ao usuário/grupo quando a quota é ultrapassada poder ser visualizada com o comando quota (veja “Verificando a quota disponível ao usuário”).

OBS4: - Quando o usuário exclui seus arquivos e volta a ficar abaixo dos limites soft da quota, o tempo de tolerância é resetado aos valores padrões (especificados por edquota -t.

OBS5: - As quotas de espaço em disco podem ser definidas automaticamente para os novos usuários adicionados ao sistema colocando o espaço em disco na variável QUOTAUSER=numero do arquivo /etc/adduser.conf. Isto será equivalente a digitar o comando edquota -q QUOTA novo_usuário.

Modificando a quota de todos os usuários de uma vez

Editar manualmente a quota de cada usuário é uma tarefa trabalhosa quando se está instalando quotas e possui muitos usuários, existe uma maneira mais fácil de fazer isso usando o próprio edquota e um usuário com a quota já definida. Por exemplo, instalamos quota em nosso sistema e queremos que todos os 300 usuários tenham a quota de usuário de 10MB e de grupo de 15MB:

  1. Criamos um usuário com esta quota usando o edquota (como descrito em “Editando quotas de usuários/grupos”). Como exemplo usaremos o usuário teste_user. Use o comando quota teste_user para verificar se as quotas para este usuário está correta.

  2. Criamos um script que modifique a quota padrão de todos os usuários do sistema de uma só vez:

    #!/bin/sh
    cd /home
    for USUARIO in *
    do
    edquota -u ${USUARIO} -p teste_user
    
    done
    

    Pronto, verifique a quota de todos os usuários com o comando repquota -a.

Verificando a quota disponível ao usuário

Execute o comando quota mostra os limites de usuários/grupos e a tolerância restante antes do limite soft se tornar rígido. Abaixo alguns exemplos descritivos deste comando:

quota

Disk quotas for user gleydson (uid 1234): 
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
      /dev/hda5  504944* 500100  600000   00:05   10868       0       0

Os campos tem o seguinte significado:

  • Filesystem - Sistema de arquivos.

  • blocks - Número de blocos usados atualmente na partição (em Kb). O "*" indica que o limite foi ultrapassado. Atualmente em 504944.

    • quota - Limite suave (soft) de espaço na partição que o usuário/grupo possui. Atualmente 500100. O valor 0 indica que o usuário/grupo não possui restrições.

    • limit - Limite máximo (hard) de espaço na partição que o usuário/grupo possui. Atualmente em 600000. O valor 0 indica que o usuário/grupo não possui restrições.

    • grace - Tolerância antes que o limite soft passe a valer como hard quando o espaço em disco é ultrapassado. Este usuário tem 5 minutos restantes para que isto ocorra. Quando o valor soft volta a ficar abaixo da quota, a tolerância é resetada.

      O parâmetro "none" indica que o tempo de tolerância expirou (caso existam limitações de quota que foram ultrapassadas) ou que o usuário/grupo não possui restrições. Veja se existe um "*" no campo blocks.

  • files - Número máximo de arquivos que usuário/grupo possui atualmente na partição. Um "*' indica que o limite foi ultrapassado. Atualmente em 10868.

    • quota - Limite suave (soft) de número de arquivos na partição que o usuário/grupo possui. Atualmente ilimitado.

    • limit - Limite máximo (hard) de número de arquivos na partição que o usuário/grupo possui. Atualmente ilimitado.

    • grace - Tolerância antes que o limite soft passe a valer como hard para o número de arquivos ultrapassados. Como não existe quota para número de arquivos, não existe tolerância. A tolerância é resetada aos valores padrões quando o valor soft volta a ficar abaixo da quota.

A quota de outros usuários/grupos podem ser visualizadas especificando as opções -u (padrão) e -g na linha de comando respectivamente. A opção -v permite visualizar quotas em sistemas de arquivos não alocados e -q mostra somente uma mensagem dizendo se o usuário está ou não dentro de sua quota:

quota -u usuario

quota -uq usuario

quota -g users

Por motivos de segurança, você não poderá visualizar as quotas de outros usuários e grupos que não pertence (exceto para o usuário root).

Verificando a quota de todos os usuários/grupos do sistema

Quando precisamos verificar o uso de quotas de todos os usuários/grupos do sistema o quota se torna incômodo e pouco prático. O comando repquota lista está disponível ao administrador para facilitar esta tarefa. Sua listagem é organizada por partições listando dados adicionais como grace time e aceita as mesmas opções dos utilitários quotaon e quotaoff. Primeiro são listados as restrições de usuários e depois de grupos para a partição. (tolerância) As opções aceitas por este utilitário tem o mesmo significado das opções do quotaon e quotaoff:

repquota -aug

*** Report for user quotas on device /dev/hda3
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --   29160       0       0   none    9970     0     0   none
daemon    --      64       0       0             22     0     0       
man       --     944       0       0             65     0     0       
mail      --    4960       0       0            823     0     0       
news      --       4       0       0              1     0     0       
gleydson  --   31032       0       0           6956     0     0       
testuser  --      16       0       0              4     0     0       
anotheruser --    16       0       0              4     0     0       
nobody    --    2344       0       0              2     0     0       

*** Report for user quotas on device /dev/hda5
Block grace time: 2days; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --   16052       0       0   none    6443     0     0   none
gleydson  +-    4944  500100  600000   none   10868     0     0       

*** Report for group quotas on device /dev/hda5
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
Group           used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --   20308       0       0   none     636     0     0   none
src       --   11404       0       0            660     0     0       
users     --    1756       0       0           6561     0     0       
gleydson  --    3452       0       0           9307     0     0

Um sinal de "+-" no segundo campo indica quota ultrapassada ou no espaço em disco, "-+' em número de arquivos e "++" em ambos. Como vimos acima, o este comando também lista o número de arquivos e bytes pertencentes a cada usuário na partição (mesmo não sendo monitorado pelas restrições de quota), isto ajuda a monitorar ações suspeitas com a excedência de espaço em disco de determinados usuários/grupos do sistema. Um exemplo é alguém que esteja fora da quota e abusando de seu usuário/grupo para uso excessivo de espaço em disco sem seu conhecimento.

OBS: Este utilitário pode ser executado por qualquer usuário no sistema e mostrar o uso de quotas de usuários/grupos que não deveria ter acesso. É recomendado deve ter permissões de leitura/gravação somente para o usuário root e sem permissões para grupo/outros usuários.

Avisando usuários sobre o estouro de quota

Avisos sobre quota ultrapassada podem ser enviadas automaticamente a todos os usuários pelo utilitário warnquota. Ele poderá ser executado periodicamente através do cron (por padrão isto é feito diariamente na distribuição Debian pelo script /etc/cron.daily/quota). Dados adicionais sobre o envio das mensagens devem ser especificados no arquivo /etc/warnquota.conf seu formato é o seguinte:

# Programa usado para enviar as mensagens
MAIL_CMD 	= "/usr/sbin/sendmail -t"
# Campo de origem da mensagem
FROM 		= "root@localhost"
# but they don't have to be:
SUBJECT 	= Quota excedida
CC_TO 		= "root@localhost"
SUPPORT 	= "root@localhost"
PHONE 		= "5555-2525"
#

O e-mail é enviado aos usuários (e usuários que pertencem a grupos com a quota excedida) com o seguinte formato:

From: root@localhost
To: gleydson@debian.gms.com.br
Cc: root@localhost
Reply-To: root@localhost
Subject: Quota Excedida
Date: Sat, 22 Sep 2001 14:27:38 -0400

Hi,

We noticed that you are in violation with the quotasystem
used on this system. We have found the following violations:


                        Block limits               File limits
Filesystem           used    soft    hard  grace    used  soft  hard  grace
/dev/hda5      +-  504944  500100  600000   none   10868     0     0       


We hope that you will cleanup before your grace period expires.

Basically, this means that the system thinks you are using more disk space
on the above partition(s) than you are allowed.  If you do not delete files
and get below your quota before the grace period expires, the system will
prevent you from creating new files.

For additional assistance, please contact us at root@localhost
or via phone at 5555-2525.