Como evitar que a quota do Linux conte contagens de ligações duas vezes

1

Se você estiver em uma máquina Linux e tiver um sistema de arquivos com cota de usuário ativada, poderá verificar através dos comandos a seguir que quotacheck contará arquivos várias vezes se eles puderem ser alcançados via bind-mounts (se source & O destino desses mounts de bind reside no sistema de arquivos que quotacheck visitas):

# we assume /home has active user-quota
repquota /home # check used quota before changes
mkdir /home/test_user/dir
mkdir /home/other_dir
mount -o bind /home/test_user/dir /home/other_dir
head -c1000000 /dev/urandom > /home/test_user/dir/test
chown test_user /home/test_user/dir/test
repquota /home # repquota now reports 1000000 bytes more for test_user
# umount /home/test_user/dir # possible solution
quotaoff -a
quotacheck -vuam
quotaon -a
# mount -o bind /home/test_user/dir /home/other_dir # possible solution
repquota /home # repquota now reports 2000000 bytes more for test_user

A única solução que consigo imaginar é umount de todos os diretórios montados na ligação antes de executar o quotacheck e remontá-los depois. Existem outras soluções? A remoção da usrquota -option dos diretórios montados na ligação parece não funcionar (não é surpresa, não se incomode em explicá-la). E excluir alguns diretórios de serem visitados por quotacheck não parece ser possível (a página man não menciona nenhuma opção relevante). A propósito, testei isso no Debian 8 (Kernel 3.16.0, quota 4.01).

Esclarecimento : Além dos bind-mounts, tudo sob /home pertence a um único sistema de arquivos.

    
por user2845840 30.05.2016 / 17:37

2 respostas

0

Acontece que houve um erro no quotacheck. Eu enviei um patch para consertá-lo, mas não tenho idéia de quando (ou mesmo se) uma nova versão da cota incluindo esse patch será publicada. Diretamente anexar arquivos à minha resposta não parece ser possível, então eu não vou postar o patch aqui. Mas se alguém estiver interessado, faça um comentário e postarei o patch como um bloco de código.

EDIT: Meu patch não foi aceito, porque estava fora de questão. O quotacheck já é capaz de funcionar corretamente na presença de montagens de bind quando compilado com a opção EXT2_DIRECT e usado em sistemas de arquivos ext. Infelizmente um bug impediu que o trabalho em sistemas de arquivos ext4, que o autor já corrigiu (commit 2b3795805c8d1bd8873b046508777fa6e9a5c83d em git: //git.code.sf.net/p/linuxquota/code).

    
por 13.06.2016 / 16:09
0

Você tem um problema muito interessante. Parece que não há nenhuma opção para quotacheck ignorar os diretórios. Provavelmente, você precisará alterar o job de quotacheck e executá-lo para cada volume, ignorando os vinculados. Você pode obter a lista de volumes vinculados com findmnt com algo como:

findmnt | awk '$2 ~ /\[.*\]$/'

Então, provavelmente, seu trabalho no cron pode ser algo como

findmnt --noheadings --raw | awk '$2 !~ /\[.*\]$/ {print$1}'  | while read FS ; do quotacheck -vum $FS ; done

Não parece uma maneira muito elegante de fazê-lo e acredito que não funcionará se o bind mount estiver em um diretório que você irá verificar, mas infelizmente eu não conheço outro jeito de dar uma lista de diretórios para ignorar.

    
por 30.05.2016 / 20:00

Tags