Como du determina qual hard link ignorar?

5

Temos dois diretórios:

$ ls -l
total 8
drwxr-x--- 2 nimmy nimmy 4096 Nov 15 19:42 jeter
drwxr-x--- 2 nimmy nimmy 4096 Nov 15 19:42 mariano

Eu criei um arquivo na primeira pasta:

$ dd if=/dev/zero of=jeter/zero_file.1 bs=512000 count=1
1+0 records in
1+0 records out
512000 bytes (512 kB) copied, 0.268523 s, 1.9 MB/s

Esta é a saída de du :

$ du -sh *
504K    jeter
4.0K    mariano

Como esperado, se eu colocar um link físico do zero_file. na outra pasta du output não muda:

$ ln jeter/zero_file.1 mariano/zero_file.2
$ du -sh *
504K    jeter
4.0K    mariano

No entanto, até onde sei, não há nada no sistema de arquivos que aponte para zero_file.1 como o arquivo original. Então, como o du sabe contar zero_file.1 , mas não zero_file.2 ?

Não pode ser uma comparação de timestamp porque todos os hard links compartilham um inode; eles terão os mesmos dados de timestamp corretos?

    
por Belmin Fernandez 16.11.2010 / 02:00

4 respostas

11

Estendendo seu teste para três pastas, você pode ver que somente a primeira vez que o inode é atingido, o du conta. Se você for para a pasta individual e executar du , você obterá o tamanho total.

Para testar:

mkdir alexandru
ln mariano/zero_file.2 alexandru/zero_file.0
du -sh *

Agora você deve ver alexandru ocupando o 500K +. Então, sem olhar para o código du , eu acho que ele armazena uma lista de inodes percorridos e não revisita os que já foram vistos.

    
por 16.11.2010 / 02:23
4

Se você fizer

du -sh jeter jeter mariano

Então você tem 2 tamanhos diferentes para o jeter.

Isso parece estar de acordo com a descoberta acima ...

... exceto que o primeiro valor não seja o total e o segundo valor seja zero?

    
por 22.11.2010 / 07:32
3

Aparentemente, quando fstat(3) vê que o número de links físicos é maior que um, ele registra o número do inode para correspondência subsequente. De acordo com POSIX :

Files with multiple links shall be counted and written for only one entry. The directory entry that is selected in the report is unspecified.

O shell expande o * glob em ordem lexical, de acordo com POSIX :

If the pattern matches any existing filenames or pathnames, the pattern shall be replaced with those filenames and pathnames, sorted according to the collating sequence in effect in the current locale.

No entanto, quando du -sh é feito sem globbing, o pedido deve ser decidido de alguma forma, mas parece que deve ser dependente da implementação.

Observe que esses dois comandos fornecem resultados diferentes:

du -sh jeter mariano
du -sh mariano jeter
    
por 16.11.2010 / 07:27
1

Se você quiser verificar se o backup do rsync time machine funciona ou não, e possivelmente mais importante quanto espaço de backup você está salvando, você deve fazer um ls -cr | xargs du -hs que alimentará os diretórios para du no correto seqüência (tempo reverso da criação).

    
por 18.10.2012 / 19:14