Se você trabalha com infraestrutura Linux, já se deparou com arquivos que parecem estar em dois lugares ao mesmo tempo ou links que "quebram" do nada após uma movimentação de diretórios. Ou já ouviu falar sobre hardlinks, softlinks e inodes e veio saber um pouco mais. Para entender o que acontece no nível do kernel, precisamos parar de olhar para nomes de arquivos e começar a olhar para Inodes.
Para facilitar, vamos usar uma analogia que todo analista de redes domina: o DNS. Se ainda não tiver conhecimento sobre o funcionamento do DNS, acredito que ainda sim, conseguirá compreender o conceito.
No Linux, o que chamamos de "arquivo" é um objeto identificado por um número único na partição: o Inode. O nome (ex: config.php) é apenas uma etiqueta vinculada a esse número.
+----------------------------+---------------------------------+
| No Mundo das Redes (DNS) | No Mundo do Linux (Filesystem) |
+----------------------------+---------------------------------+
| Domínio / Hostname | Nome do Arquivo (Dentry) |
| Endereço IP | Número do Inode |
| Servidor Físico (Dados) | Blocos de Dados no Disco |
+----------------------------+---------------------------------+
Um Hardlink é como criar um segundo Registro A apontando um nome diferente para o mesmo IP (Inode).
O que acontece: Você cria um novo nome, mas ele aponta para o mesmo identificador de metadados e por consequência o mesmo bloco no disco.
Espaço em disco: Zero consumo extra. Dez hardlinks de um arquivo de 1GB continuam ocupando apenas 1GB no disco físico, pois todos compartilham os mesmos blocos de dados.
Sincronização: Como o "IP" é o mesmo, ou seja, o inode é o mesmo, se você alterar o conteúdo por qualquer um dos nomes, todos os outros refletirão a mudança instantaneamente.
Resiliência: O arquivo só morre quando o último nome (link) for removido. É como se você tivesse 3 apontamentos A para o mesmo IP, mas você só perderia acesso via DNS quando o ultimo registro DNS fosse excluído.
Limitação técnica: Assim como um IP privado não é roteável na internet, um Hardlink não cruza partições. Ele é exclusivo da tabela de Inodes daquela partição específica.
O Softlink (ln -s) funciona como um CNAME. Ele não aponta para o Inode, da mesma maneira que um CNAME não aponta para um IP e sim para outro DNS, ele aponta para o Hostname (Nome) do arquivo original.
O que acontece: O sistema cria um novo arquivo pequeno que contém apenas o texto do caminho para o destino.
Flexibilidade: Ao contrário do hardlink, o Softlink pode cruzar partições e apontar para diretórios ou discos externos. É como funciona o NAT, que pode ser acessado um IP privado, utilizando o DSTNAT.
Fragilidade: Se o arquivo original for movido ou deletado, o Softlink "quebra" (fica órfão), pois o nome para o qual ele apontava não existe mais. Da mesma forma que, se você alterasse o IP interno, o DSTNAT deixaria de funcionar.
Nada melhor que o terminal para provar a arquitetura. Execute estes comandos:
1. Criar o dado original. O comando abaixo cria e joga o conteúdo dentro de aspas para o arquivo.
echo "Configurações Core JBitcore" > core.cfg
2. Criar um Hardlink (Registro A)
ln core.cfg link_hard.cfg
3. Criar um Softlink (CNAME)
ln -s core.cfg link_soft.cfg
4. A Prova Real (Check o Inode com ls -li)
ls -li
O que observar:
O link_hard.cfg tem o mesmo número de Inode que o original.
O link_soft.cfg tem um número de Inode novo e o tipo de arquivo começa com l.
O contador de links (coluna ao lado das permissões) subiu para 2 no original.
Se você quiser, pode fazer mais um teste, no caso, excluir o arquivo original e perceber que o softlink quebra mas o hardlink permanece disponível. Pode também observar que ao remover o link simbólico, alguns bytes são apagados do disco, que é apenas o tamanho do arquivo do link simbólico, mas ao apagar o arquivo original, o hardlink permanece acessível e o espaço em disco não muda. Você pode também apagar o arquivo original e o hardlink para perceber que só então o espaço em disco é apagado.
+-------------------+----------------------+----------------------------------------+
| Ação | Comando | O que acontece no "DNS" do Disco |
+-------------------+----------------------+----------------------------------------+
| Criar Hardlink | ln arquivo link_h | Cria um novo Registro A (mesmo Inode). |
| Criar Softlink | ln -s arquivo link_s | Cria um CNAME (aponta para o nome). |
| Verificar Inode | ls -li | Mostra o "IP" (Inode) na 1a coluna. |
| Ver Detalhes | stat arquivo | Mostra o "Whois" (metadados do Inode). |
| Achar Links | find . -samefile arq | Busca nomes que dividem o mesmo Inode. |
+-------------------+----------------------+----------------------------------------+
Se você deletou um arquivo grande (rm), mas o df -h continua mostrando o disco cheio, use o comando lsof | grep deleted. Isso mostrará se algum processo ainda está segurando o Inode aberto. O espaço só é liberado quando o contador de links chega a zero e o processo é encerrado.