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 em diretórios como diretórios telefônicos, não pastas), isto é, adicionar uma ou mais entradas a um dos diretórios. mais diretórios para associar um nome com esse arquivo.
Todos esses links, esses nomes de arquivos apontam para o mesmo arquivo. Não há um que é o original e os outros que são links. Eles são todos pontos de acesso ao mesmo arquivo (mesmo inode) na árvore de diretórios. Quando você obtiver o tamanho do arquivo ( lstat
system call), você está recuperando as informações (os metadados mencionados acima) armazenados no inode, não importa qual nome de arquivo, qual link você está usando para se referir para esse arquivo.
Por contraste, 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 devem ser vinculados a um diretório (deve 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, 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, o número do arquivo 10486707 é um arquivo normal. Duas entradas no diretório atual (uma com nome a
, uma com nome b
) vinculam a ela. Como o link count é 2, sabemos que não há outro nome desse arquivo no diretório atual ou em qualquer outro diretório. O número de arquivo 10502404 é outro arquivo, desta vez do tipo symlink ligado duas vezes ao diretório atual. Seu conteúdo (destino) é o caminho relativo "a".
Observe que, se 10502404 estivesse vinculado a outro diretório que não o atual, ele normalmente apontaria 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 possuem nomes associados a eles, exceto nos diretórios que os vinculam. O espaço ocupado pelos seus nomes são as entradas nesses 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, desassocia-os dos diretórios aos quais eles são referenciados. Uma vez desvinculado do último diretório que tinha uma entrada para um determinado arquivo, esse arquivo é então destruído (desde que nenhum processo o tenha) aberto).