Hard Links e Links Simbólicos: O Comando ln e inodes
O Que Você Vai Conquistar
- Explicar hard links vs links simbólicos pela perspectiva do inode
- Usar
ln/ln -scorretamente conforme a situação - Diagnosticar e evitar links quebrados (dangling links)
- Entender restrições de links entre filesystems e diretórios
- Responder a pergunta frequente no exame "hard links não podem cruzar filesystems" com fundamentação
Este é o núcleo do objetivo 104.6 do LPIC-1 "Criar e alterar hard links e links simbólicos". Entender links requer o conceito de inode (um número que aponta para os dados reais do arquivo).
Decidindo Entre Hard Links e Links Simbólicos
| Aspecto | Hard link | Link simbólico |
|---|---|---|
| Comando de criação | ln src link |
ln -s target link |
| Substância | Outro nome para o mesmo inode | Inode separado contendo uma string de caminho |
| Entre filesystems | Não é possível | Possível |
| Apontar para diretório | Geralmente não é possível | Possível |
| Quando original deletado | Dados permanecem | Torna-se um link quebrado (dangling link) |
inode no ls -li |
Mesmo que o original | Diferente do original |
Se você precisa "cruzar filesystems" ou "apontar para um diretório", o link simbólico é a única opção. Para compartilhar a substância de um arquivo dentro do mesmo filesystem como uma multi-referência tipo backup, use um hard link.
Passos
Passo 1: Verificar inode e contagem de links
echo "data" > original.txt ls -li original.txt
1310721 -rw-r--r-- 1 user user 5 May 17 10:00 original.txt
O número inicial 1310721 é o número do inode e 1 é a contagem de hard links. O inode aponta unicamente para a substância do arquivo (blocos de dados e metadados). Um nome de arquivo é meramente uma referência a um inode.
Passo 2: Criar um hard link
ln original.txt hardlink.txt ls -li original.txt hardlink.txt
1310721 -rw-r--r-- 2 user user 5 May 17 10:00 original.txt 1310721 -rw-r--r-- 2 user user 5 May 17 10:00 hardlink.txt
Ambos apontam para o mesmo inode 1310721 e a contagem de links aumentou para 2. Editar através de qualquer nome atualiza a mesma substância. Deletar original.txt não libera o inode até que a contagem de links chegue a 0.
Passo 3: Criar um link simbólico
ln -s original.txt symlink.txt ls -li original.txt symlink.txt
1310721 -rw-r--r-- 2 user user 5 May 17 10:00 original.txt 1310733 lrwxrwxrwx 1 user user 12 May 17 10:01 symlink.txt -> original.txt
symlink.txt tem um inode diferente 1310733 e contém a string de caminho -> original.txt. Note que o flag de tipo é l (link).
Passo 4: Confirmar o alvo de resolução do link
readlink symlink.txt readlink -f symlink.txt ls -L symlink.txt
original.txt /home/user/original.txt -rw-r--r-- 2 user user 5 May 17 10:00 symlink.txt
readlink retorna a string bruta do alvo e readlink -f retorna o caminho absoluto final resolvido. ls -L segue o link e mostra as informações da substância.
Passo 5: Detectar links quebrados
rm original.txt cat symlink.txt find . -xtype l
cat: symlink.txt: No such file or directory ./symlink.txt
Deletar o original transforma symlink.txt em um symlink quebrado (dangling). find . -xtype l lista links simbólicos quebrados. Um hard link, por outro lado, mantém seus dados mesmo após o nome original ser deletado.
Por Que Hard Links Não Podem Cruzar Filesystems
Números de inode são um namespace independente por filesystem. O inode 100 em /dev/sda1 e o inode 100 em /dev/sdb1 são substâncias não relacionadas. Como um hard link é "outro nome para o mesmo inode", ele não pode compartilhar um inode entre filesystems diferentes, portanto a criação é rejeitada.
Um link simbólico é um arquivo independente que contém uma string de caminho em vez de um inode. Um caminho pode ser expresso entre filesystems, então ele pode apontar para outra partição, outro disco, ou até mesmo um caminho inexistente. O custo é que ele se torna um link quebrado no momento em que o alvo desaparece. Essa diferença de design cria o trade-off "hard links são robustos mas restritos; links simbólicos são flexíveis mas frágeis".
Hard links para diretórios são geralmente proibidos para prevenir referências circulares na hierarquia de diretórios que prenderiam ferramentas de travessia de árvore como find em loops infinitos.
Solução de Problemas
Sintoma: ln falha com Invalid cross-device link
Causa: O source e o target estão em filesystems diferentes
Verificação:
df original.txt /mnt/other/
Correção: Se cruzar filesystems for necessário, use ln -s para um link simbólico. Confirme que ambos estão no mesmo ponto de montagem com df.
Sintoma: Um link simbólico aponta para um lugar inesperado
Causa: O link foi criado com um caminho relativo e depois o próprio link foi movido
Verificação:
readlink -f link
Correção: Se o link puder ser movido, especifique o alvo com um caminho absoluto (ln -s /abs/path/target link). Note que links relativos são resolvidos em relação à localização do link.
Sintoma: ln -s não consegue atualizar um link existente
Causa: Um link com o mesmo nome já existe, causando File exists
Verificação:
ls -l link
Correção: Sobrescreva com ln -sf target link. Se o alvo for um diretório, use também ln -sfn para evitar criar acidentalmente o link dentro do diretório alvo.
Checklist de Conclusão
- [ ] Verificou o número do inode e a contagem de links com
ls -li - [ ] Confirmou que a contagem de links aumenta após criar um hard link
- [ ] Confirmou que um link simbólico tem um inode separado e contém uma string de caminho
- [ ] Confirmou o alvo de resolução final com
readlink -f - [ ] Detectou links quebrados com
find . -xtype l
Resumo
| Cenário | Comando | Finalidade |
|---|---|---|
| Hard link | ln src link |
Compartilhar substância dentro de um FS |
| Link simbólico | ln -s target link |
Suporte cross-FS / diretório |
| Verificar inode | ls -li |
Contagem de links / identidade |
| Resolver alvo | readlink -f |
Caminho absoluto final |
| Detectar quebrado | find . -xtype l |
Listar symlinks quebrados |
O mecanismo de links é central para entender filesystems. Em seguida, avance para o shell environment e prioridades de processos para conectar o conhecimento operacional.