Tutorial de Linux / Links físicos e simbólicos: diferenças e prática com ln

Um link físico (hard link) é outro nome para o mesmo inode de um arquivo; um link simbólico (symlink) é uma entrada separada que guarda um caminho para o destino. A diferença aparece quando um nome é removido ou alterado: outro link físico continua dando acesso ao arquivo, enquanto um link simbólico pode ficar quebrado. Nesta prática, crie os dois tipos e compare os resultados.

Para entender os números de inode e a contagem de links usados nesta aula, consulte a explicação sobre tipos de arquivo e metadados com file e stat.

Dois conceitos para entender os links

Uma entrada de diretório associa um nome, como report.txt, ao arquivo. O inode é a estrutura com que o sistema de arquivos identifica esse arquivo e administra seus metadados. Criar um link físico acrescenta outro nome para o mesmo inode: nenhum dos dois nomes é uma cópia nem tem prioridade sobre o outro. Se um nome for removido, o outro ainda permite acessar o arquivo.

Um link simbólico tem seu próprio inode e armazena uma sequência de caracteres que representa um caminho. Ao abrir o arquivo por esse link, o sistema segue o caminho armazenado. Se ele deixar de resolver para um destino existente, o link pode continuar presente, mas o acesso ao destino falha: é um link quebrado. O próprio link pode ser criado antes de seu destino existir.

Critério Link físico Link simbólico
O que referencia O mesmo inode do arquivo Um caminho para o destino
Inode Compartilhado pelos nomes Próprio do link
Um nome do destino é removido ou alterado Outro nome continua funcionando Pode quebrar se o caminho armazenado deixar de resolver
Outro sistema de arquivos Não atravessa essa fronteira no Linux Pode apontar para um caminho em outro sistema de arquivos
Destino é um diretório Não é permitido na prática comum no Linux Pode apontar para diretórios

Links físicos compartilham também o conteúdo: uma gravação no mesmo arquivo por um nome aparece ao lê-lo pelo outro. Por isso, um link físico não substitui uma cópia de segurança. Alguns editores salvam criando um arquivo novo e substituindo um nome; nesse caso, esse nome passa a identificar outro inode e deixa de compartilhar o arquivo com o link anterior.

Criar o arquivo de prática e os dois links

Use uma sessão Bash no Linux, um diretório em que você possa gravar e um sistema de arquivos com suporte aos dois tipos de link. Os exemplos de stat -c usam o GNU Coreutils; outras implementações podem ter opções diferentes. Um atalho de interface gráfica não é necessariamente um link simbólico.

Comece em um diretório novo dentro da sua pasta pessoal. Se ~/linux-course-09-practice já existir, escolha outro nome e substitua-o nas duas primeiras linhas. O mkdir abaixo falha quando o diretório existe. Se mkdir ou cd falhar, pare: continuar poderia criar ou sobrescrever arquivos em outro local.

mkdir ~/linux-course-09-practice

cd ~/linux-course-09-practice

pwd

Confirme que pwd mostra o diretório novo antes de executar o próximo bloco; o sucesso de pwd sozinho não prova que cd funcionou. A redireção > original.txt cria o arquivo ou trunca seu conteúdo se ele já existir. Neste diretório novo, os nomes original.txt, hard.txt e shortcut.txt ainda devem estar livres.

printf 'version 1\n' > original.txt

ln original.txt hard.txt

ln -s original.txt shortcut.txt

O primeiro ln cria um link físico, que é seu comportamento padrão. A opção -s cria o link simbólico. Se qualquer comando falhar, investigue a mensagem antes de continuar; não acrescente -f para forçar a substituição de um destino desconhecido.

shortcut.txt guarda o caminho relativo original.txt. Esse caminho é interpretado a partir do diretório que contém o link, e não do diretório em que o shell estiver quando você o usar. Aqui, o arquivo e o link estão lado a lado, portanto esse caminho encontra o arquivo.

Consultar os inodes e o caminho armazenado

Com GNU stat, %i mostra o número do inode, %h mostra a quantidade de links físicos e %n mostra o nome consultado. Sem -L, o comando consulta o próprio link simbólico. Já readlink, sem opções de canonicalização, imprime o caminho armazenado no link.

stat -c '%i %h %n' original.txt hard.txt shortcut.txt

readlink shortcut.txt

O formato esperado é o seguinte. Os números abaixo são ilustrativos, não valores medidos: os dois primeiros nomes compartilham um inode e têm contagem 2; o link simbólico tem seu próprio inode. A última linha vem de readlink.

123456 2 original.txt
123456 2 hard.txt
789012 1 shortcut.txt
original.txt

A contagem 2 pressupõe que somente os dois nomes criados nesta prática apontam para esse arquivo. Um link simbólico para ele não aumenta essa contagem. Números de inode identificam arquivos dentro de um sistema de arquivos; comparar números iguais de sistemas de arquivos diferentes não demonstra que se trata do mesmo arquivo.

cat original.txt

cat hard.txt

cat shortcut.txt

Cada comando imprime version 1. Os nomes físicos acessam o mesmo arquivo diretamente; o link simbólico chega a ele seguindo seu caminho. Conteúdos iguais, por si só, não provam que dois nomes compartilham um inode: duas cópias independentes também podem ter o mesmo conteúdo.

O que acontece quando o nome original muda?

Ainda no diretório de prática, confirme que não existe outro renamed.txt antes de renomear o arquivo. hard.txt continuará acessível por apontar para o mesmo inode. O link shortcut.txt continuará armazenando o nome antigo, original.txt, e ficará quebrado.

mv original.txt renamed.txt

cat hard.txt

readlink shortcut.txt

cat hard.txt imprime version 1, enquanto readlink shortcut.txt ainda imprime original.txt. Isso mostra que readlink exibir um caminho não garante que o destino exista. Ao executar cat shortcut.txt nesse momento, o resultado esperado é um erro de destino inexistente; a mensagem exata depende do idioma e da implementação.

Se quiser criar outro link para o novo nome, use ln -s renamed.txt new-shortcut.txt, desde que new-shortcut.txt não exista. O link antigo não é atualizado automaticamente. Um link para um diretório ou outro sistema de arquivos também depende de o caminho ser acessível, das permissões necessárias e, quando aplicável, de o sistema de arquivos estar montado.

Para remover somente o link simbólico, rm shortcut.txt atua sobre o próprio link e normalmente preserva o destino. Não acrescente uma barra ao final nem confunda o link com um caminho dentro do diretório para o qual ele aponta: comandos sobre esse caminho podem atingir o conteúdo do destino. Confira o operando exato antes de remover qualquer coisa.

Escolher o tipo e restaurar a prática

Escolha um link físico quando precisar de mais um nome para o mesmo arquivo, no mesmo sistema de arquivos, e quiser manter o acesso por outro nome caso um deles desapareça. Escolha um link simbólico para apontar a um diretório, atravessar sistemas de arquivos ou expressar o destino como um caminho. Ao mover um link simbólico relativo ou renomear o destino, confira novamente como esse caminho será resolvido.

As opções de criação e a interpretação do destino estão no guia do comando ln. Para distinguir o caminho armazenado de sua resolução, veja o guia do comando readlink.

Para restaurar o nome inicial, permaneça no mesmo diretório de prática e execute o bloco abaixo. Se você tiver criado outro original.txt, não confirme sua substituição sem examiná-lo. Caso recuse a operação ou mv falhe, pare antes dos comandos seguintes; eles não comprovariam a restauração do arquivo esperado.

mv -i renamed.txt original.txt
cat shortcut.txt
stat -c '%i %h %n' original.txt hard.txt

Depois da restauração bem-sucedida, shortcut.txt volta a permitir a leitura de version 1, e original.txt e hard.txt continuam com o mesmo inode. Se você criou o link opcional new-shortcut.txt, ele ainda guarda renamed.txt e agora fica quebrado; inspecione-o e recrie-o para o nome correto ou remova apenas esse link, conforme sua necessidade.

Documentação oficial

Consulte o manual de ln no GNU Coreutils para as regras de criação dos links, o manual de readlink para a saída do caminho armazenado e o manual de stat para os campos e a opção de seguir links.