Qual é a diferença entre um link físico e um link simbólico?

488

Como o título diz, eu gostaria de saber a diferença entre um link físico e um link virtual criado pelo comando ln. O comando man lnfornece informações, mas não responde suficientemente à minha pergunta.

Além disso, seria bom se alguém pudesse fornecer uma configuração em que o link físico possa ser preferível a um link simbólico.

ste_kwr
fonte
15
uma das diferenças ... você tem algum arquivo, por exemplo, teste de arquivo. Se você criar o link de teste do ln, faça o link simbólico do teste ln -s e mova o teste do arquivo para outro diretório (ou renomeie), o link simbólico não funcionará. Hardlink irá funcionar. Agora tente excluir o teste do arquivo. Hardlink ainda funcionará, na verdade, você será ainda capaz de acessar arquivos até número de hardlinks para arquivar isnt 0. Isso é por causa de inodes, está escrito no manual ...
Denwerko
5
Reabri isso porque merece uma boa resposta genérica sobre esse assunto (ao contrário da pergunta anterior, que era um exemplo C obscuro).
Oli
4
Melhor resposta: youtube.com/watch?v=aO0OkNxDJ3c
Abhishek Bhatia
1
Também é uma resposta bastante completa: stackoverflow.com/questions/185899/…
Elzo Valugi
@AbhishekBhatia o vídeo não está disponível
Ooker 19/01

Respostas:

59

No Linux / Unix, os atalhos são conhecidos como Links


Os links são de dois tipos: links flexíveis (links simbólicos) ou hard links.

  1. Links flexíveis (links simbólicos)

    Você pode criar links para arquivos e diretórios e criar links (atalhos) em partições diferentes e com um número de inode diferente do original.

    Se a cópia real for excluída, o link não funcionará .

  2. Hard Links

    Links físicos são apenas para arquivos; você não pode vincular a um arquivo em uma partição diferente com um número de inode diferente.

    Se a cópia real for excluída, o link funcionará , pois acessa os dados subjacentes que a cópia real estava acessando.


Pergunta: Como faço para criar um link virtual?

Resposta: É possível criar um link flexível ln -s; primeiro, você precisa definir a fonte e, em seguida, o destino. (Lembre-se de que você precisa definir os caminhos completos da origem e do destino; caso contrário, não funcionará.)

 sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib32/libGL.so.1
             (----------Source-------)             ( Destination )

insira a descrição da imagem aqui

Como você pode ver, ele tem um inode diferente e pode ser feito em uma partição diferente.


Pergunta: Como faço para criar o Hard link?

Resposta: Um link físico pode ser feito com ln; primeiro, você precisa definir a fonte e, em seguida, o destino. (Lembre-se de que você precisa definir o caminho completo da origem e do destino; caso contrário, não funcionará.)

Digamos que eu tenho um script no /scriptdiretório chamado firefox.

 ls -i # Shows you the inode
 5898242 firefox

 ln /scripts/firefox /scripts/on-fire
       ( Source )    ( Destination )

insira a descrição da imagem aqui

Como você pode ver, ele tem o mesmo inode. Se eu excluir o original, o link funcionará, e ele funcionará como o original.

insira a descrição da imagem aqui

Acima, verifico se o link está funcionando e excluo o script original do firefox.


Você pergunta: Seria bom se alguém pudesse fornecer uma configuração em que o link físico possa ser preferível a um link simbólico.

Resposta : Dependendo do layout da partição do disco, os Hard Links têm a limitação de que eles devem estar na mesma partição (-1 ponto) e só podem vincular a arquivos (-1 ponto) ), mas +1 ponto se o original for excluído do link funcionará e funciona como o original.

Por outro lado, um link flexível pode apontar para diretórios ou arquivos (ponto +1) e não há limitação de partição (ponto +1), mas (-1 ponto) se a fonte for excluída, o link não funcionará.

Qasim
fonte
Posso criar um link físico e fornecer o inode como fonte?
TMOTTM
324

Um hardlink não é um ponteiro para um arquivo, é uma entrada de diretório (um arquivo) apontando para o mesmo inode. Mesmo se você alterar o nome do outro arquivo, um link físico ainda apontará para o arquivo. Se você substituir o outro arquivo por uma nova versão (copiando-o), um link físico não apontará para o novo arquivo. Você só pode ter hardlinks dentro do mesmo sistema de arquivos. Com os hardlinks, você não tem noção dos arquivos e links originais, todos são iguais (pense nisso como uma referência a um objeto). É um conceito de nível muito baixo.

Por outro lado, um link simbólico está realmente apontando para outro caminho (um nome de arquivo); ele resolve o nome do arquivo cada vez que você o acessa através do link simbólico. Se você mover o arquivo, o link simbólico não seguirá. Se você substituir o arquivo por outro, mantendo o nome, o link simbólico apontará para o novo arquivo. Os links simbólicos podem abranger sistemas de arquivos. Com links simbólicos, você tem uma distinção muito clara entre o arquivo real e o link simbólico, que não armazena informações ao lado do caminho sobre o arquivo para o qual aponta.

vartec
fonte
1
Uma coisa que (por próprias palavras) "aponta para o arquivo" pode ser chamada de ponteiro (é trivialmente quase tautologicamente verdadeiro). Se estivermos pesquisando, então (em geral) a noção de links físicos pode existir mesmo que um sistema de arquivos não use inodes.
jfs
320

"Uma imagem vale mais que mil palavras." Representação pictórica


E, "Um exemplo vale cem parágrafos ..."

Crie dois arquivos:

$ touch blah1   
$ touch blah2

Insira alguns dados neles:

$ echo "Cat" > blah1
$ echo "Dog" > blah2

E como esperado:

$cat blah1; cat blah2
Cat
Dog

Vamos criar links físicos e virtuais:

$ ln blah1 blah1-hard
$ ln -s blah2 blah2-soft

Vamos ver o que aconteceu:

$ ls -l

blah1
blah1-hard
blah2
blah2-soft -> blah2

Alterar o nome de blah1 não importa:

$ mv blah1 blah1-new
$ cat blah1-hard
Cat

blah1-hard aponta para o inode, o conteúdo do arquivo - que não foi alterado.

$ mv blah2 blah2-new
$ ls blah2-soft
blah2-soft
$ cat blah2-soft  
cat: blah2-soft: No such file or directory

Não foi possível encontrar o conteúdo do arquivo porque o link virtual aponta para o nome que foi alterado e não para o conteúdo.
Da mesma forma, se blah1 for excluído, blah1-hard ainda mantém o conteúdo; se blah2 for excluído, blah2-soft é apenas um link para um arquivo inexistente.


fonte: copiando descaradamente do StackOverflow!

ABcDexter
fonte
13
Para ser justo com você - você adicionou a linda imagem no topo ... ah, você copiou também! Combinando as duas respostas é realmente muito útil :)
icc97
2
melhor explicado, lugar nenhum!
dennisbot
3
Fiquei olhando a imagem por 20 segundos e, de repente, descobri. Isso é realmente brilhante.
Mohammed Joraid
1
btw: Usar hardlinks com git é uma péssima idéia , caso alguém (frustrado por soft links) se pergunte ... também possa se aplicar a outros sistemas de controle de versão.
precisa saber é o seguinte
1
Um inode para seus hardlinks é semelhante a um arquivo armazenado na nuvem para qualquer dispositivo acessá-lo?
Ooker
89

Ambos são ponteiros para arquivos; a diferença é o tipo de ponteiro. Um link simbólico aponta para outro arquivo por nome . Ele possui um bit de modo especial que o identifica como um link simbólico e seu conteúdo é o nome do arquivo real. Por conter apenas um nome, esse nome não precisa realmente existir ou pode existir em um sistema de arquivos diferente. Se você substituir o arquivo nomeado (alterar seu conteúdo sem afetar o nome), o link ainda conterá o mesmo nome e agora apontará para o novo arquivo. Você pode identificar facilmente um link simbólico e ver o nome do arquivo para o qual ele aponta.

Um link físico aponta para o arquivo pelo número do inode. Como tal, os links físicos não são diferentes do que o primeiro nome de um arquivo. Não há nome "real" vs. nome do link físico; todos os links físicos são nomes igualmente válidos para o arquivo. Por esse motivo, o arquivo ao qual você vincula deve realmente existir e estar no mesmo sistema de arquivos em que você está tentando criar o link. Se você excluir o nome original, o link físico ainda apontará para o mesmo arquivo. Como todos os links físicos são nomes igualmente válidos para o arquivo, você não pode olhar para um e ver os outros nomes para o arquivo; Para encontrar isso, você deve procurar todos os arquivos e comparar o número de inodes para encontrar os outros nomes que possuem o mesmo número de inode.

Você pode dizer quantos nomes um arquivo tem da saída de ls -l. O primeiro número após o modo de arquivo é a contagem de links. Um arquivo com mais de um link possui outros nomes em algum lugar e, inversamente, um arquivo com uma contagem de links de apenas 1 não possui (outros) links físicos.

psusi
fonte
If you replace the named file, then the link still contains the same name, and so now it points to the new file- Eu acho que isso não está bem explicado. Quer dizer, se eu substituir o arquivo no qual obtive um link simbólico, os links que contêm o nome permanecerão intocados. Mas apenas apontaria para o arquivo substituído quando o nome do arquivo (ou seja, o novo arquivo que substituiu o antigo) for igual ao do arquivo substituído (ou seja, o arquivo antigo que foi substituído pelo novo), correto?
Mike
@ Mike, sim: o link simbólico aponta para o nome do arquivo original; portanto, substituí-lo significa que o link agora aponta para o novo arquivo.
Psusi
Mas apenas se o nome estiver correto? Iria ligar simbolicamente ponto de banana e eu substituir o arquivo com laranja, em seguida, sy ligação não consegue encontrar a banana arquivo mais ou seja, não vai funcionar
Mike
@ Mike, the world replace significa que ele tem o mesmo nome, caso contrário, você está apenas excluindo um arquivo e adicionando outro;)
#
58

Um link físico pode funcionar apenas no mesmo sistema de arquivos; é simplesmente um nome diferente para o mesmo inode (os arquivos são referenciados internamente por inodes). Um arquivo só será excluído do disco quando o último elo à sua inode se foi (você rmD ou unlinkd o último link). Os hardlinks geralmente funcionam apenas para arquivos, não para diretórios.

Um link simbólico (link simbólico) é um arquivo especial que contém um caminho para outro arquivo. Esse caminho pode ser absoluto ou relativo. os links simbólicos podem funcionar em sistemas de arquivos e até apontar para arquivos diferentes, se você, por exemplo, desconectar um disco rígido externo e substituí-lo por outro, que possui um arquivo diferente no mesmo caminho. Um link simbólico pode apontar para arquivos ou diretórios.

knittl
fonte
Obrigado, isso me diz como eles funcionam, mas o que exatamente o link físico faz? E por que não funciona para diretórios?
31512 ste_kwr
@knittl: você tem certeza? Parece que em alguns sistemas de arquivos os hardlinks para diretórios são permitidos, mas somente o root pode criá-los. Veja os -d, -F, --directoryinterruptores. E sim, eu tenho visto a nota na ln(1)página :)
0xC0000022L
1
@kniwor: a maneira mais fácil de descrever os hardlinks é "apenas outro nome para o mesmo arquivo (ou seja, dados em disco)". E - pelo menos no meu sistema (s) - lnnão pode ser usado para criar hardlinks para diretórios. Existem hardlinks para diretórios, porém, o exemplo mais importante é .e ... Eu não queria incluir isso na minha resposta original, pois isso apenas complicaria as coisas.
precisa saber é
2
@STATUS_ACCESS_DENIED: bem, ok… mas geralmente não é uma boa ideia. Por isso escrevi "normalmente" na minha resposta original. Veja também meu comentário anterior para exemplos.
knittl
para que um link físico possa apontar para a mesma pasta / arquivo com nomes diferentes, ou seja, ter nomes diferentes vinculados ao mesmo inode?
Charlie Parker
21

Uma das respostas do outro tópico (agora linkado no topo da sua postagem) menciona esta página, que eu acho que é uma explicação razoavelmente boa de nível médio. Se você está se perdendo na arte ascii, aqui está a versão tl; dr:

  • Arquivos padrão são um ponteiro do sistema de arquivos para um inode que, por sua vez, aponta para dados físicos. O componente de arquivo armazena seu link para o sistema de arquivos (essencialmente seu caminho) e um link para o inode.
  • Links físicos são como arquivos. Eles são apenas um ponteiro adicional diretamente para um inode.
  • Links simbólicos são arquivos separados (incluindo inode e dados separados) que armazenam o caminho do sistema de arquivos em um arquivo.

O kernel e os sistemas de arquivos envolvidos traduzem tudo de forma transparente.

Então, com base nisso:

  • Os links físicos permitem apenas a ligação do mesmo sistema de arquivos. Os links simbólicos podem apontar para qualquer caminho.
  • Links físicos (essencialmente) apontam para dados absolutos. Os links simbólicos podem apontar para caminhos relativos (por exemplo ../parent.file)
  • Por extensão, se você mover o ponteiro de destino de um link físico (o qual, lembre-se, é essencialmente apenas um link físico apontando para um inode), o link físico ainda funcionará. Mover o alvo de um link simbólico normalmente interrompe o link simbólico.
  • Resolver um link físico seria mais rápido, mas incomensuravelmente. Essa parte insignificante de velocidade tem o custo de um sistema de arquivos inflexível.

Eu posso ter me confundido um pouco, mas lendo várias coisas, estou lutando para encontrar a diferença entre um arquivo padrão e um hardlink. A maneira como estou lendo é cada arquivo consiste em um link físico (armazenando o nome do arquivo), vinculado a um inode que aponta para dados físicos.

Adicionar um hardlink apenas fornece ao inode um ponteiro adicional baseado no sistema de arquivos. Isso está certo?

Oli
fonte
5
Acho que você está certo, todo arquivo é um nome de caminho para um inode e um link físico é um nome de caminho adicional para o mesmo inode. Portanto, um link físico não é diferente de um arquivo normal.
enzotib
Estou tentando entender isso ... mas você diz:> "Links simbólicos são arquivos separados (incluindo inode e dados separados ) que armazenam o caminho do sistema de arquivos em um arquivo." Um link simbólico realmente tem dados separados? Então é como uma cópia do diretório ao qual está vinculado, certo? ... e toda vez que algo é gravado no link simbólico, ele deve ser gravado duas vezes no disco? Não faz sentido.
MiniGod
@MiniGod Nenhum link simbólico é um inode para um bloco de dados que armazena um caminho para outro inode (nome do arquivo). Sim, é confuso como Matrix, mas quando você o obtém, nunca se esquece :)
Oli
@ Oli Eu posso estar confuso, mas quando você diz: "incluindo inode e dados separados ", você quer dizer que o link simbólico tem dados separados !?
MiniGod 31/12/12
1
@MiniGod Yeah. O Symlink é um inode apontando para dados (como um arquivo normal) e esses dados são um caminho. É um pouco mais inteligente do que isso - para permitir o uso transparente através de links simbólicos - mas isso é basicamente tudo o que são.
Oli
15

Quando usar o Soft Link:

Vincular sistemas de arquivos: se você deseja vincular arquivos entre os sistemas de arquivos, poderá usar apenas links simbólicos / soft links.

Links para o diretório: se você deseja vincular os diretórios, deve usar os Soft links, pois não é possível criar um link físico para um diretório.

Quando usar o Hard Link:

Espaço de armazenamento: os links físicos requerem uma quantidade muito desprezível de espaço, pois não há novos inodes criados durante a criação de links físicos. Nos links flexíveis, criamos um arquivo que consome espaço (geralmente 4KB, dependendo do sistema de arquivos)

Desempenho: o desempenho será um pouco melhor ao acessar um link físico, pois você está acessando diretamente o ponteiro do disco em vez de passar por outro arquivo. Movendo o local do arquivo: Se você mover o arquivo de origem para outro local no mesmo sistema de arquivos, o link físico ainda funcionará, mas o link flexível falhará.

Redundância: Se você deseja garantir a segurança dos seus dados, deve usar o link físico, pois no link físico, os dados são seguros, até que todos os links para os arquivos sejam excluídos, em vez do link físico, você perderá os dados se a instância principal do arquivo for excluída.

Osama
fonte
Observe que também há um link simbólico rápido para o tamanho do nome do caminho de até 64 bytes. Ele ainda ocupa um inode, mas não consome o espaço do bloco de 4kb.
syockit
8

A confusão surge quando você tenta encontrar a diferença entre "o nome do arquivo" e um link físico, porque não há nenhum.

Cada arquivo que você cria consiste em dados no disco e um link físico - que é um nome de arquivo em um diretório e um ponteiro para os dados no disco. Fim da história. Quando o último (ou único) link físico é excluído, o sistema operacional sabe que os dados não são mais necessários.

Com isso, você pode ver que os dados reais nunca são excluídos, apenas os links físicos são. E quando ficar suficientemente cheio no disco, os dados podem ser substituídos pelos dados de outro arquivo. Até então, os dados do arquivo excluído podem ser recuperados, mas é meio difícil de encontrar sem o link físico.

Os links simbólicos, como explicado anteriormente, simplesmente informam "há um arquivo nomeado <targetname>em uma pasta denominada <targetfolder>". Eles apontam para o link físico. Eles não sabem onde estão os dados. O link rígido sabe disso.

Gonesoft
fonte
0

É muito simples. Os arquivos (e diretórios!) São armazenados nos endereços do dispositivo de bloco (HDD ou o que for). Normalmente você tem um único nome mapeado para um endereço, e é assim que você obtém seu arquivo. Um link físico é um nome de segundo, terceiro etc. mapeado para o mesmo endereço. Um link simbólico se refere ao símbolo - o nome - e, portanto, um segundo nome é mapeado para o primeiro nome. No que diz respeito ao kernel, uma vez que ele lê o destino do link simbólico, ele para e volta ao início com o valor do destino como o nome do arquivo (mais ou menos), de modo que links simbólicos relativos são possíveis, mas são inúteis. O nome do destino não é usado acima do nível do sistema de arquivos, exceto se for consultado explicitamente no código do espaço do usuário.

Jim Driscoll
fonte