Essa é apenas uma péssima idéia, pois não há como distinguir entre um link físico e um nome original.
Permitir links físicos para diretórios quebraria a estrutura gráfica acíclica direcionada do sistema de arquivos, possivelmente criando loops de diretório e subárvores de diretório pendentes, o que tornaria fsck
qualquer outro caminhante da árvore de arquivos propenso a erros.
Primeiro, para entender isso, vamos falar sobre inodes. Os dados no sistema de arquivos são mantidos em blocos no disco e esses blocos são coletados juntos por um inode. Você pode pensar no inode como o arquivo. Os inodes não possuem nomes de arquivos. É aí que entram os links.
Um link é apenas um ponteiro para um inode. Um diretório é um inode que contém links. Cada nome de arquivo em um diretório é apenas um link para um inode. Abrir um arquivo no Unix também cria um link, mas é um tipo diferente de link (não é um link nomeado).
Um link físico é apenas uma entrada de diretório extra apontando para esse inode. Quando você ls -l
, o número após as permissões é a contagem de links nomeados. A maioria dos arquivos regulares terá um link. Criar um novo link físico para um arquivo fará com que os dois nomes de arquivos apontem para o mesmo inode. Nota:
% ls -l test
ls: test: No such file or directory
% touch test
% ls -l test
-rw-r--r-- 1 danny staff 0 Oct 13 17:58 test
% ln test test2
% ls -l test*
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
% touch test3
% ls -l test*
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
-rw-r--r-- 1 danny staff 0 Oct 13 17:59 test3
^
^ this is the link count
Agora, você pode ver claramente que não existe um link físico. Um link físico é o mesmo que um nome comum. No exemplo acima, test
ou test2
, qual é o arquivo original e qual é o link físico? No final, você não pode realmente dizer (mesmo com registros de data e hora) porque os dois nomes apontam para o mesmo conteúdo, o mesmo inode:
% ls -li test*
14445750 -rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
14445750 -rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
14445892 -rw-r--r-- 1 danny staff 0 Oct 13 17:59 test3
A -i
bandeira para ls
mostra os números de inode no início da linha. Observe como test
e test2
tenha o mesmo número de inode, mas test3
tem um número diferente.
Agora, se você pudesse fazer isso para diretórios, dois diretórios diferentes em pontos diferentes no sistema de arquivos poderiam apontar para a mesma coisa. De fato, um subdir poderia apontar de volta para seu avô, criando um loop.
Por que esse loop é uma preocupação? Porque quando você está percorrendo, não há como detectar que você está fazendo um loop (sem acompanhar os números dos inodes enquanto você percorre). Imagine que você está escrevendo o du
comando, que precisa se repetir nos subdiretórios para descobrir sobre o uso do disco. Como du
saberia quando atingisse um loop? É propenso a erros e muita contabilidade du
deveria ser feita, apenas para executar esta tarefa simples.
Os links simbólicos são um animal totalmente diferente, pois são um tipo especial de "arquivo" que muitas APIs de sistema de arquivos tendem a seguir automaticamente. Observe que um link simbólico pode apontar para um destino inexistente, porque aponta pelo nome e não diretamente para um inode. Esse conceito não faz sentido com links físicos, porque a mera existência de um "link físico" significa que o arquivo existe.
Então, por que du
lidar com links simbólicos com facilidade e não com links físicos? Pudemos ver acima que os links físicos são indistinguíveis das entradas normais do diretório. Os links simbólicos, no entanto, são especiais, detectáveis e ignoráveis!
du
percebe que o link simbólico é um link simbólico e o ignora completamente!
% ls -l
total 4
drwxr-xr-x 3 danny staff 102 Oct 13 18:14 test1/
lrwxr-xr-x 1 danny staff 5 Oct 13 18:13 test2@ -> test1
% du -ah
242M ./test1/bigfile
242M ./test1
4.0K ./test2
242M .
..
apontar? Especialmente depois de remover o link físico para este diretório, no diretório apontado por..
? Precisa apontar para algum lugar.