Por que o link físico não corrompe se removermos o arquivo original? Se eu remover o arquivo original, o softlink ficará corrompido, mas o hard link não, então por que não corrompe
relate perguntas
-
Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?
-
Inicie/pare o serviço systemd usando o atalho de teclado [fechado]
-
Necessidade de algumas chamadas de sistema
-
astyle não altera a formatação do arquivo de origem
-
Passe o sistema de arquivos raiz por rótulo para o kernel do Linux
Você parece não entender o que é um hardlink e um arquivo no Unix.
A base de um sistema de arquivos Unix são os arquivos . Um arquivo é um bytestream anônimo não estruturado. Um arquivo não tem nome . Ele possui apenas um número de série do arquivo , basicamente um identificador exclusivo (para aquele sistema de arquivos). (O número de série do arquivo às vezes é chamado de inode )
Existem vários tipos diferentes de arquivos especiais padronizados pelo POSIX :
Os sistemas operacionais podem adicionar seus próprios tipos de arquivos especiais, por exemplo, o Solaris possui portas .
Arquivos de dispositivos são usados para fornecer uma interface para interação com dispositivos, por exemplo, tradicionalmente
/dev/sda
para interagir com o primeiro disco rígido. Os arquivos especiais FIFO funcionam como shell pipes, mas como possuem um nome, os dois processos de leitura e gravação podem ser iniciados em momentos diferentes e em contextos de segurança diferentes. Os soquetes permitem comunicação entre processos semelhante a um soquete de rede, mas apenas na máquina local.Agora chegamos aos dois tipos de arquivos especiais que são relevantes para sua pergunta: diretórios e links simbólicos.
Na verdade, um arquivo especial de diretório funciona de maneira muito semelhante a um diretório da vida real. Por exemplo, pense em uma lista telefônica: ela lista os nomes das pessoas junto com seus números de telefone. Isso é exatamente o que um diretório faz em um sistema de arquivos Unix: ele lista os nomes dos arquivos e seus números de série.
Esse emparelhamento de nome e número de série do arquivo é o que chamamos de hardlink (ou apenas link ) .
Quando você "exclui um arquivo" no Unix usando o
rm
utilitário , na verdade não está "excluindo o arquivo". Você está removendo a entrada desse nome do diretório , ou seja, está removendo o hardlink , não o arquivo. Isso é chamado de desvinculação e, na verdade, a função da biblioteca POSIX usada porrm
é chamadaunlink
.Então, quando você faz algo como
Você não criou um arquivo chamado
foo
. Você criou um arquivo sem nome, mas com algum número de série de arquivo específico e adicionou uma entrada de diretório ao diretório atual que vincula o nomefoo
ao número de série do arquivo que você acabou de criar.Agora, quando você usa o
ln
utilitário para criar um segundo hardlink:você criou uma segunda entrada de diretório no diretório atual que vincula o nome
bar
ao mesmo número de série do arquivo ao qualfoo
está vinculado.É importante perceber que nenhum desses dois links é especial. Eles são exatamente os mesmos.
Se você desvincular agora
foo
:Tudo o que você fez foi remover a entrada do diretório que vincula o nome
foo
ao número de série do arquivo. Você não removeu o arquivo. Portanto, você ainda pode acessar o arquivo usando o nome,bar
já que esta entrada de diretório não foi alterada.Na verdade, você não pode excluir arquivos no Unix. Você só pode remover links. O próprio sistema de arquivos removerá o arquivo quando ele não tiver mais links apontando para ele e não estiver mais aberto.
Um link simbólico , entretanto, é um arquivo especial que contém um caminho . Ou seja, quando você faz
Você está literalmente escrevendo a string
/path/to/quux
no arquivo. Mais precisamente, você está criando um arquivo especial de link simbólico com o conteúdo/path/to/quux
e está criando uma entrada de diretório no diretório atual que vincula o nomebaz
ao número de série do arquivo que você acabou de criar.Na verdade, não importa se é
/path/to/quux
resolvido para um número de série de arquivo ou não. Na verdade, existem programas que usam isso para algumas configurações inteligentes. Por exemplo, os servidores web fnord e gatling usam links simbólicos para representar redirecionamentos HTTP, então quando você faz isso:Em seguida, navegar para
http://mydomain/search.html
irá redirecioná-lo parahttps://www.google.com/
.Então, resumindo:
Porque você não removeu o arquivo original. Você removeu apenas um dos vários links. O arquivo não está mais acessível usando esse nome específico, mas ainda existe e pode ser acessado usando outros nomes.
Novamente, você não está removendo o arquivo original. Você está removendo o nome . Mas o link simbólico aponta para o nome e não para o arquivo. Portanto, o link simbólico agora aponta para um nome que não pode mais ser resolvido para um arquivo.
Sidenote: Você deve ter notado algo interessante: os diretórios fornecem um mapeamento de nomes para arquivos. Mas os diretórios também são arquivos. Portanto, os diretórios também fornecem automaticamente um mapeamento de nomes para diretórios.
Em outras palavras: diretórios podem ser aninhados arbitrariamente no Unix!
Isso pode não parecer muito interessante hoje em dia, já que todo sistema de arquivos amplamente utilizado permite hierarquias aninhadas que são arbitrariamente profundas. Mas não foi esse o caso quando o Unix foi criado há quase 60 anos. Vários sistemas de arquivos na época não tinham diretórios ou tinham um nível fixo de aninhamento (por exemplo, 2 níveis).
Tornar os diretórios arquivos especiais fornece um sistema de arquivos hierárquico gratuitamente, sem a necessidade de adicionar nenhuma construção especial. Este é um design muito elegante.
Isso ocorre porque os hardlinks são essencialmente referências ao mesmo arquivo e não existe um arquivo "original" em termos de hardlinks. Eles apontam para a mesma estrutura de dados no disco (o inode que contém próximo a todos os metadados do arquivo).
Enquanto os softlinks apontam para o nome do arquivo e não para a estrutura de dados que descreve o arquivo.
No Linux, o que identifica exclusivamente um arquivo em todo o sistema de arquivos é o
inode
número. Isso nada mais é do que um ID numérico, garantido como único em todo o sistema de arquivos (nota:inodes
pode ser reciclado, mas não há dois arquivos "ativos" que possam ter o mesmoinode
no mesmo sistema de arquivos).Um nome de arquivo nada mais é do que uma "etiqueta de conveniência" anexada a ele
inode
dentro de um diretório específico. Fazer hardlink de um arquivo nada mais é do que adicionar outro nome conveniente, dentro do mesmo diretório ou de um diretório diferente (no primeiro caso, o novo hardlink deve ter um nome diferente).Você pode ver o
inode
número vials -i
. Por exemplo:Observe como
zzz.txt
etest.txt
, tendo o mesmoinode
número, são realmente o mesmo arquivo - referenciado por dois nomes diferentes. A remoção de apenas um desses dois nomes não remove (desvincula) realmente o nomeinode
do sistema de arquivos, deixando o outro inalterado.Um soft link é uma coisa completamente diferente - não é um link real para o original
inode
, mas sim um pequeno arquivo especial (com seu próprio diferenteinode
) apontando para o caminho/nome do arquivo original . A remoção do arquivo original deixa um ponteiro quebrado ("corrompido") para trás.