df, du informa o uso incorreto do disco

4

df e du ambos relatam incorretamente que minha partição raiz, um SSD de 100 GB, não tem espaço restante e usa 100 G respectivamente; 85G em /home/steven sozinho. Uma simples soma do uso do disco fornecido por du , no entanto, reporta menos de 13G usados.

Como posso corrigir isso?

Especificamente:

~ » du -sh ~
85G   /home/steven

~ » du -b ~ | wc -l
15041

~ » du -h ~ | sort -h | tail -n 1
85G   /home/steven # 91088489808 bytes if using -b for du

~ » du -b ~ | sort -n | head -n 15040 | cut -f 1 | perl -ne 'BEGIN{$i=0;}$i+=$_;END{print $i.qq|\n|;}'
12735983847 # 11-12G, roughly

Existe uma enorme discrepância entre o 85G e o 11G ou o 12G, obviamente. Corri lsof +L1 e eliminei todos os processos com arquivos marcados com deleted , mas ainda sem sorte.

Eu tenho vários links em $HOME apontando para diretórios (por exemplo, repos ) em um disco rígido externo, o que pode ser um problema baseado em algumas postagens do Stack Exchange que eu li, mas não consigo entender isso.

O que devo fazer a seguir?

    
por Steven Edwards 04.02.2015 / 21:54

2 respostas

4

du faz uma travessia em profundidade da árvore dada. Por padrão, ele mostra o uso de cada árvore de diretórios, mostrando o uso de disco inclusivo de cada:

$ du ~
4      /home/bob/Videos
40     /home/bob/.cache/abrt
43284  /home/bob/.cache/mozilla/firefox
43288  /home/bob/.cache/mozilla
12     /home/bob/.cache/imsettings
48340  /home/bob/.cache
4      /home/bob/Documents
48348  /home/bob

Se for dada a opção -a , ela mostrará adicionalmente o tamanho de cada arquivo.

Com a opção -s , ele mostrará apenas o tamanho total de cada arquivo de argumento ou árvore de diretórios.

$ du -s ~
48348  /home/bob
$ du -s ~/*
4      /home/bob/Videos
4      /home/bob/Documents

Então, quando você correu

$ du -b ~ | wc -l
15041

$ du -b ~ | sort -n | head -n 15040 | cut -f 1 | \
    perl -ne 'BEGIN{$i=0;$i+=$_;END{print $i.qq|\n|;}'
12735983847

você estava somando o tamanho de tudo em seu diretório pessoal - várias vezes, infelizmente, porque o tamanho relatado em cada linha inclui todos os subdiretórios - mas porque você omitiu a linha final da saída de du, que seria a linha para /home/steven , du não contava o tamanho de nenhum dos arquivos regulares no nível superior de seu diretório pessoal . Portanto, a soma não incluiu o arquivo .xsession-errors muito grande.

e quando você correu

du -sb ~ returns 91296460205, but the sum of du -sb ~/* is only 1690166532

sua saída du -sb ~/* não incluiu nenhum arquivo ou diretório em seu diretório inicial que comece com . .

O du ~ | tail -1 e o du -s ~ devem fazer um trabalho razoável de mostrar o uso do disco do seu diretório home (não incluindo arquivos excluídos, mas claro), mas se você quiser resumir todos os tamanhos de arquivo sem depender em du , você pode fazer algo assim (assumindo que um find moderno suporta o formato printf %s para mostrar o tamanho em bytes):

find ~ -type f -printf '%s\n' | perl -ne 'BEGIN{$i=0;$i+=$_;END{print $i.qq|\n|;}'
    
por 05.02.2015 / 17:03
2

Você está somando os bytes, mas o tamanho do bloco do sistema de arquivos é provavelmente muito maior que 1 byte. Para uma contagem precisa, você deve arredondar o tamanho de cada arquivo para que seja um múltiplo do tamanho do bloco de arquivos.

Com o GNU Coreutils instalado, você pode executar stat --file-system $HOME para encontrar o tamanho do bloco do sistema de arquivos.

Em média, os arquivos desperdiçam meio quarteirão. Multiplique metade de um bloco pelo número de arquivos em $ HOME e veja se o resultado está próximo de 70GiB. Se sim, então seu mistério está resolvido.

    
por 05.02.2015 / 01:37

Tags