Tamanho do symlink

5

Symbolic links do take room, of course, but just the room it takes to store the name and target plus a few bytes for other metadata

Os links simbólicos realmente fazem diferença no uso do disco?

Minha pergunta é: podemos determinar quantos bytes um link simbólico está usando?

$ touch alfa.txt
$ ln -s alfa.txt bravo.txt

Ambos du e ls reportam 8, que é "alfa.txt":

$ du -b bravo.txt
8       bravo.txt

$ ls -l bravo.txt
lrwxrwxrwx 1 Steven None 8 Mar  8 18:17 bravo.txt -> alfa.txt

Existe algum comando disponível que pode imprimir o tamanho real do symlink com o "alguns bytes para outros metadados" incluídos?

    
por Steven Penny 09.03.2017 / 01:21

2 respostas

8

Classifique, mas observe que o tamanho de um arquivo não está bem definido nesse nível de precisão.

Um link simbólico envolve quatro partes:

  • O nome do link, que é armazenado no diretório em que é uma entrada.
  • Outros metadados presentes em todas as entradas de diretório, para localizar o restante dos metadados. Esta é tipicamente a localização de um inode. Além disso, cada entrada de diretório custa mais alguns bytes, por exemplo, para preencher nomes de arquivos e manter uma estrutura de dados, como uma árvore ou um hash balanceado.
  • Outros metadados do próprio link simbólico, como timestamps. Esses metadados também estão presentes para outros tipos de arquivo (por exemplo, um arquivo regular vazio).
  • O destino do link.

Se o sistema de arquivos permite que os links simbólicos tenham vários hard links, as duas primeiras partes são por entrada de diretório, as duas últimas partes estão presentes apenas uma vez por link simbólico.

No ext2 / ext3 / ext4 , o alvo de um link simbólico é armazenado no inode se tiver no máximo 60 bytes. Você pode confirmar isso pedindo du : ele relata 0 para links simbólicos cujo destino é ≤60 bytes e um bloco para alvos maiores.

Assim como em um arquivo normal, a figura relatada por du exclui o armazenamento da entrada de diretório e do inode. Se você quer saber exatamente quanto espaço o link simbólico leva, você também precisa contá-los. A maioria dos sistemas de arquivos clássicos aloca inodes no momento da criação do sistema de arquivos, de modo que o custo é dividido: o tamanho da entrada de diretório conta o número de blocos de dados, as contagens de inode contra o tamanho do pool de inode.

Para o tamanho da entrada de diretório em si, o número exato de bytes ocupados por uma entrada pode depender de quais outras entradas estão presentes no diretório. No entanto, um diretório geralmente ocupa um grande número de blocos, portanto, se você criar mais e mais entradas, o tamanho do diretório permanecerá o mesmo, até que as entradas não caibam mais em um bloco e um segundo bloco seja alocado, e assim por diante. Para ver exatamente como as entradas de diretório são armazenadas no bloco, você precisaria de um depurador de sistema de arquivos e uma compreensão razoável do formato do sistema de arquivos ou de um bom a excelente entendimento do formato do sistema de arquivos, bem como o conhecimento de quais outras entradas estão presentes no diretório e possivelmente na ordem em que foram criados e outras entradas foram removidas.

Em resumo, os "poucos bytes para outros metadados" são:

  • A entrada de diretório, de tamanho variável. Criar o link simbólico pode não fazer diferença ou adicionar um bloco.
  • O inode.

E o alvo pode ocupar de 0 a um bloco além disso.

    
por 09.03.2017 / 01:56
0

O comando ls mostra o tamanho real do symlink, sem contar o inode que ele usa. Ao dizer que 8 é "alfa.txt" você estava totalmente correto. Esse é o "tamanho real" do link simbólico que você criou. Novamente, o tamanho não inclui o inode que ele usa, assim como o tamanho de todos os outros arquivos não inclui isso. Se você criar um symlink para algum caminho longo, o tamanho refletirá o tamanho desse caminho.

    
por 09.03.2017 / 01:44