Excluindo hard links no GNU/Linux e a discussão sobre inodes
Olá, sou um incompetente.
Há muito tempo, quando tentei criar um link com o comando ln, cometi um erro e esqueci de remover a opção -s, resultando na criação de um hard link, então vou excluir os hard links desnecessários.
Criando um hard link
Ao executar o comando ln sem opções, um hard link é criado.
alleycat:[haturatu]:~/git/hardlink$ ls
alleycat:[haturatu]:~/git/hardlink$ touch hardlink1
alleycat:[haturatu]:~/git/hardlink$ echo "You are an idiot" >> hardlink1
alleycat:[haturatu]:~/git/hardlink$ cat hardlink1
You are an idiot
alleycat:[haturatu]:~/git/hardlink$ ls -la
合計 12
drwxr-xr-x 2 haturatu haturatu 4096 1月 12 15:00 .
drwxr-xr-x 114 haturatu haturatu 4096 1月 12 15:00 ..
-rw-r--r-- 1 haturatu haturatu 17 1月 12 15:01 hardlink1
Tentei criar um arquivo como mostrado acima.
alleycat:[haturatu]:~/git/hardlink$ ln hardlink1 hardlink2
alleycat:[haturatu]:~/git/hardlink$ ls -la
合計 16
drwxr-xr-x 2 haturatu haturatu 4096 1月 12 15:02 .
drwxr-xr-x 114 haturatu haturatu 4096 1月 12 15:00 ..
-rw-r--r-- 2 haturatu haturatu 17 1月 12 15:01 hardlink1
-rw-r--r-- 2 haturatu haturatu 17 1月 12 15:01 hardlink2
Com isso, um hard link foi criado.
E agora, vamos olhar a saída padrão abaixo.
-rw-r--r-- 2 haturatu haturatu 17 1月 12 15:01 hardlink1
-rw-r--r-- 2 haturatu haturatu 17 1月 12 15:01 hardlink2
O 2 em -rw-r--r-- 2 é o número de hard links. Você pode ver que o valor aumentou em comparação com antes da criação do hard link.
E, como isso é apenas um link, não sobrecarrega o espaço em disco em si. Ele armazena um único dado, e o número inode é o mesmo, apontando para o mesmo arquivo.
Verifique o número inode com a opção -i.
alleycat:[haturatu]:~/git/hardlink$ ls -lia
合計 16
13238408 drwxr-xr-x 2 haturatu haturatu 4096 1月 12 15:02 .
11406555 drwxr-xr-x 114 haturatu haturatu 4096 1月 12 15:00 ..
13265123 -rw-r--r-- 2 haturatu haturatu 17 1月 12 15:01 hardlink1
13265123 -rw-r--r-- 2 haturatu haturatu 17 1月 12 15:01 hardlink2
O que é um inode?
Isso depende do sistema de arquivos, então o que foi mostrado acima é em um ambiente GNU/Linux. Em sistemas de arquivos baseados em BSD, pode ser vnode, e no ZFS, znode, etc., o que é um pouco diferente, mas historicamente, pode-se ter a imagem de que é uma extensão do sistema de arquivos UNIX original.
E, ao contrário dos links simbólicos, se você excluir hardlink1, hardlink2 permanecerá, e se você excluir hardlink2, hardlink1 permanecerá. Nesse ponto, a explicação seria que o sistema de arquivos gerencia o próprio arquivo, mas ainda é um pouco complexo, não é?
No entanto, embora os hard links sejam úteis, os links simbólicos podem referenciar arquivos em discos diferentes, mas os hard links não podem ser criados em discos diferentes.
Simplificando, com base na explicação anterior, o sistema de arquivos opera com base nos inodes de um único disco, então, em um disco diferente, ele estaria fora da jurisdição desse sistema de arquivos e não poderia ser referenciado em termos de estrutura de camadas.
Portanto, se o arquivo existir em um disco diferente, torna-se necessário criar um link simbólico.
E, em termos de sistema de arquivos, isso é usado de perto durante a recuperação de disco, quando as informações de inode anteriores são referenciadas para identificar qual arquivo com qual número de inode foi criado ou excluído.
Aqui está uma armadilha: se um arquivo for sobrescrito, o número inode também será atualizado. Isso significa que, ao criar scripts de backup, por exemplo, pode ser necessário ter em mente a criação de scripts que não incluam operações de sobrescrita. (Eu cometi esse erro uma vez).
Identificando arquivos com o mesmo número de inode
Você pode verificar com o comando find.
alleycat:[haturatu]:~/git/hardlink$ find . -inum 13265123
./hardlink2
./hardlink1
Agora, vou tentar excluir hardlink1.
alleycat:[haturatu]:~/git/hardlink$ rm -i hardlink1
rm: 通常ファイル 'hardlink1' を削除しますか? y
alleycat:[haturatu]:~/git/hardlink$ ls -lai
合計 12
13238408 drwxr-xr-x 2 haturatu haturatu 4096 1月 12 15:23 .
11406555 drwxr-xr-x 114 haturatu haturatu 4096 1月 12 15:00 ..
13265123 -rw-r--r-- 1 haturatu haturatu 17 1月 12 15:01 hardlink2
alleycat:[haturatu]:~/git/hardlink$ cat hardlink2
You are an idiot
Com isso, o valor do hard link também se tornou 1, e foi confirmado que, originalmente, ao criar um link para hardlink1 com ln hardlink1 hardlink2, hardlink2, que tem as mesmas informações que hardlink1, existe e contém os mesmos dados.
Em termos de aplicação prática
Faz tempo que não mexia nisso, mas se você quiser copiar um arquivo grande no mesmo disco e reduzir o consumo de espaço, parece que usar hard links é uma boa ideia.
Bem, talvez não seja algo que se use com tanta frequência, mas é interessante porque ajuda a entender um pouco a estrutura do sistema de arquivos.
Até a próxima.
Obrigado.