Um arquivo é um inode com metadados, entre os quais uma lista de ponteiros para onde encontrar os dados.
Para poder acessar um arquivo, é necessário vinculá- lo a um diretório (pense nos diretórios como diretórios telefônicos, não como pastas), ou seja, adicione uma ou mais entradas a um ou mais diretórios para associar um nome a esse arquivo.
Todos esses links, esses nomes de arquivos apontam para o mesmo arquivo. Não há um que seja o original e os outros que sejam links. Todos eles são pontos de acesso ao mesmo arquivo (mesmo inode) na árvore de diretórios. Quando você obtém o tamanho do arquivo (lstat
chamada de sistema), está recuperando informações (os metadados mencionados acima) armazenadas no inode, não importa qual nome de arquivo, qual link você está usando para se referir a esse arquivo .
Por outro lado, os links simbólicos são outro arquivo (outro inode) cujo conteúdo é um caminho para o arquivo de destino. Como qualquer outro arquivo, esses links simbólicos precisam ser vinculados a um diretório (devem ter um nome) para que você possa acessá-los. Você também pode ter vários links para links simbólicos ou, em outras palavras, os links simbólicos podem receber vários nomes (em um ou mais diretórios).
$ touch a
$ ln a b
$ ln -s a c
$ ln c d
$ ls -li [a-d]
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 a
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 b
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 c -> a
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 d -> a
Acima do número do arquivo 10486707, há um arquivo regular. Duas entradas no diretório atual (uma com nome a
e outra com nome b
) são vinculadas a ele. Porque a contagem de links é 2, sabemos que não há outro nome desse arquivo no diretório atual ou em qualquer outro diretório. O número do arquivo 10502404 é outro arquivo, desta vez do tipo link simbólico vinculado duas vezes ao diretório atual. Seu conteúdo (destino) é o caminho relativo "a".
Observe que, se o 10502404 estiver vinculado a outro diretório que não o atual, normalmente ele apontará para um arquivo diferente, dependendo de como foi acessado.
$ mkdir 1 2
$ echo foo > 1/a
$ echo bar > 2/a
$ ln -s a 1/b
$ ln 1/b 2/b
$ ls -lia 1 2
1:
total 92
10608644 drwxr-xr-x 2 stephane stephane 4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10504186 -rw-r--r-- 1 stephane stephane 4 Aug 27 17:24 a
10539259 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:26 b -> a
2:
total 92
10608674 drwxr-xr-x 2 stephane stephane 4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10539044 -rw-r--r-- 1 stephane stephane 4 Aug 27 17:24 a
10539259 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:26 b -> a
$ cat 1/b
foo
$ cat 2/b
bar
Os arquivos não têm nomes associados a eles, exceto nos diretórios que os vinculam. O espaço ocupado por seus nomes são as entradas desses diretórios, é contabilizado no tamanho do arquivo / uso do disco dos diretórios.
Você notará que a chamada do sistema para remover um arquivo é unlink
. Ou seja, você não remove arquivos, os desvincula dos diretórios em que são referenciados. Uma vez desvinculado do último diretório que tinha uma entrada para um determinado arquivo, esse arquivo é destruído (desde que nenhum processo o tenha) aberto).
lstat
chamada do sistema que obtém seu tamanho.