Qual é a diferença entre links simbólicos e hard links?

Respostas:

40

A semântica diferente entre os links físicos e físicos torna-os adequados para coisas diferentes.

Links físicos:

  • indistinguível de outras entradas do diretório, porque cada entrada do diretório é um link físico
  • "original" pode ser movido ou excluído sem quebrar outros links físicos para o mesmo inode
  • somente possível dentro do mesmo sistema de arquivos
  • as permissões devem ser as mesmas do "original" (as permissões são armazenadas no inode, não na entrada do diretório)
  • só pode ser feito em arquivos, não em diretórios

Links simbólicos (links flexíveis)

  • simplesmente registra esse ponto para outro caminho de arquivo. ( ls -lmostrará para qual caminho um link simbólico aponta)
  • quebrará se o original for movido ou excluído. (Em alguns casos, é realmente desejável que um link aponte para qualquer arquivo que atualmente ocupe um local específico)
  • pode apontar para um arquivo em um sistema de arquivos diferente
  • pode apontar para um diretório
  • em alguns formatos de sistema de arquivos, é possível que o link simbólico tenha permissões diferentes do arquivo para o qual aponta (isso é incomum)
daxelrod
fonte
11
Boa lista. Só queria acrescentar que você também pode interromper um link simbólico de caminho relativo movendo o link simbólico em si.
jw013
4
"A entrada no diretório [E] é um link físico." Esse é um ponto excelente que eu nunca vi expressado antes, mas me preocupo que alguém que esteja começando a entender os links não o entenda. Para aqueles que estão nessa situação, aqui está uma dica: O layout dos arquivos e diretórios que você vê ao executar o comando ls não é exatamente a mesma coisa que o sistema de armazenamento que ele representa. Links físicos são referências a um arquivo individual no sistema de armazenamento. Um arquivo é armazenado uma vez. Leia sobre "inodes".
Mario
@ Mario: sim. Cada entrada de diretório vincula um nome a um inode. A chamada do sistema para excluir um nome de arquivo é chamada mesmo unlink(2). Arquivos "normais" (com uma contagem de links de 1) são apenas um caso especial. Se ajudar, você pode pensar em inodes como objetos e nomes como ponteiros com contagem ref (a contagem de links do inode é a contagem de referência).
Peter Cordes
11
Você pode pensar em um link simbólico como um arquivo de texto com um nome. É interpretado como um link simbólico devido a um sinalizador especial para o arquivo. Exemplos de links físicos que você conhece ..e são ..
precisa saber é o seguinte
Aqui está outra resposta que explica por que não é possível criar links físicos para diretórios . Acho esta resposta útil porque é mais concisa e fácil de ler.
Trevor Boyd Smith
18

O objetivo de ambos os tipos de links é fornecer uma maneira de fazer com que um arquivo apareça em dois locais ao mesmo tempo. Isso tem muitos usos. 9 em 10 vezes você deseja usar links simbólicos.

Links simbólicos ou "links simbólicos" funcionam um pouco como os atalhos do Windows. O conteúdo de um link simbólico é um ponteiro para o local real do arquivo / diretório. Se você excluir o arquivo real, o link simbólico ficará "dangling" e não funcionará. A exclusão do link simbólico não exclui o arquivo real. Você pode ter quantos links simbólicos para um único arquivo (ou mesmo outros links simbólicos) desejar.

Ao contrário do Windows, eles funcionam no nível do sistema de arquivos, não no shell ou no aplicativo; portanto, praticamente qualquer aplicativo "seguirá" os links simbólicos conforme o esperado. ls -alpode ser usado como uma maneira rápida de ver para onde os links simbólicos "apontam".

Os hardlinks funcionam mesmo em um nível inferior. Um hardlink é uma entrada real, física, do diretório no nível do sistema de arquivos do arquivo. Tecnicamente, uma entrada de diretório é um hardlink, portanto, cada arquivo possui pelo menos um hardlink em um diretório em algum lugar. Os hardlinks não são separados do arquivo para o qual apontam; se um arquivo tiver vários hardlinks em diretórios diferentes, excluir o hardlink com utilitários como rmnão excluirá o arquivo de verdade, até que todos os hardlinks tenham desaparecido.

Não consigo pensar em situações em que o uso de hardlinks é comum ou mesmo necessário, a menos que você intencionalmente queira impedir que os arquivos sejam excluídos ou esteja fazendo algum trabalho estranho de baixo nível com partições ou outras coisas relacionadas ao sistema de arquivos. EDIT: Há ótimas idéias nas outras respostas a esta pergunta!

LawrenceC
fonte
Além disso, os links simbólicos têm permissões como arquivos normais, mas o sistema operacional não os consulta, consulta o arquivo de permissões direcionadas para decidir o comportamento. E não faça cadeias circulares de links simbólicos. Muito mal.
18711 LawrenceC em
3
É realmente muito ruim? O que vai acontecer? A maior emoção que consigo recriar são as mensagens de erro "Muitos níveis de links simbólicos".
mattdm
11
ls -lé suficiente para ver o que está sendo vinculado por um link simbólico, o que asignifica --allver página de manual. E mesmo que os links simbólicos funcionem no sistema de arquivos, existem funções alternativas para usar links simbólicos como arquivos em vez de seguir.
D4RIO 18/03
4
Na verdade, os atalhos do Windows são bem diferentes dos links simbólicos: eles seguem seu objetivo e também são arquivos regulares. (O Windows também possui links simbólicos, mas eles não são muito usados.) Os links simbólicos são puramente textuais, o texto de destino é lido sempre que você acessa o arquivo. A importância das permissões de link simbólico depende do sistema operacional e do sistema de arquivos.
Gilles 'SO- stop be evil'
AFAIK, o conteúdo de um arquivo de link simbólico é o caminho para o qual o link simbólico aponta, que pode ser visto quando se olha para o tamanho do arquivo de link simbólico: ln -s /home 1; ls -l 1mostra que o link simbólico 1 tem 5 bytes de comprimento, enquanto ln -s /usr/share/ 2; ls -l 2mostra que 2 tem 11 bytes.
Daniel kullmann
13

Os links físicos são muito úteis para mecanismos de backup com base em disco, porque você pode ter uma árvore de diretórios completa para cada backup enquanto compartilha o espaço para arquivos que não foram alterados - e o sistema de arquivos controla a contagem de referências; portanto, quando a última referência a uma determinada versão desaparece porque o backup expirou / foi removido por motivos de espaço, o espaço usado é recuperado automaticamente. Alguns clientes de email também o usam para mensagens arquivadas em várias pastas, pelo mesmo motivo.

geekosaur
fonte
5
Talvez mecanismos de controle de versão baseados em disco? Se você vincular algo, não será um backup. Se o arquivo original for corrompido, todos os links para ele também serão corrompidos.
D4RIO
11
Pense em sistemas de backup incrementais como o Time Machine da Apple. (Deveria ser óbvio que esses não são backups do tipo recuperação de desastre, mas "opa, excluí esse arquivo por acidente"). Todos os arquivos inalterados em um backup incremental são vinculados juntos; quando o arquivo é alterado, o próximo incremental o copia em vez de vincular à versão anterior.
geekosaur 18/03
Obrigado, sistemas de backup, em seguida, incrementais são bastante semelhantes aos sistemas de controle de versão desta forma = D
D4RIO
Mas como o mecanismo de backup incremental preserva a versão "antiga" de um arquivo? 1) Backup A criado, ele vinculou o arquivo F; 2) Arquivo F modificado; 3) dia seguinte backup B criado ... Parece que eu não conseguir alguma coisa
Dmitry Pashkevich
3

Links físicos são apenas referências aos mesmos espaços em disco, e é por isso que você não pode vincular algo em outro sistema de arquivos.

Links simbólicos são arquivos que vinculam outros arquivos (como atalhos do Windows), talvez no mesmo sistema de arquivos, talvez não.

Edição: Vou explicar algo mais. Todo arquivo existente possui no mínimo 1 link físico. Links físicos são a maneira de acessar o conteúdo de um inode do sistema de arquivos. Você pode obter o número de inode de um arquivo ls -ie obter o número de hardlinks da statseguinte forma:

$ stat plantilla-disenos.odt 
  File: «plantilla-disenos.odt»
  Size: 12367       Blocks: 32         IO Block: 4096   fichero regular
Device: 803h/2051d  Inode: 319875      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/   d4rio)   Gid: ( 1000/   d4rio)
Access: 2011-02-11 21:36:19.000000000 -0300
Modify: 2010-03-02 23:27:28.000000000 -0300
Change: 2010-04-10 17:46:27.000000000 -0300

Obrigado @geekosaur por esta referência:

O kernel precisa reiniciar a tradução do nome do caminho para o inode (percorrendo a árvore de diretórios) para expandir os links simbólicos, enquanto os links físicos usam o mesmo inode. (Você costuma ver isso conhecido como namei, do nome da função do kernel que fazia isso no Unix tradicional.)

e isso (editado):

Os links físicos são muito úteis para mecanismos de backup incremental baseados em disco , como o Time Machine da Apple , porque você pode ter uma árvore de diretórios completa para cada backup enquanto compartilha o espaço para arquivos que não foram alterados - e o sistema de arquivos controla a contagem de referências, portanto quando a última referência a uma determinada versão desaparece porque o backup foi expirado / removido por motivos de espaço, o espaço usado é recuperado automaticamente. Alguns clientes de email também o usam para mensagens arquivadas em várias pastas, pelo mesmo motivo.

Felicidades

D4RIO
fonte
Os benefícios de desempenho do uso de links físicos? Ou, por que você usaria um link físico em vez de um link simbólico?
ripper234
O kernel precisa reiniciar a tradução do nome do caminho para o inode (percorrendo a árvore de diretórios) para expandir os links simbólicos, enquanto os links físicos usam o mesmo inode. (Você vai ver muitas vezes este referido como namei, a partir do nome da função kernel que fez isso no tradicional Unix.)
geekosaur
@ ripper234: Hardlinks são soluções que economizam espaço em disco. Você não precisa conhecer o sistema de arquivos para criar um link simbólico, mas precisa pensar antes de criar links simbólicos, pois pode criar um loop ou um caminho de resolução longo, para que funções como statfalhem.
D4RIO
@geekosaur: eu estou adicionando a sua resposta ao meu, já que é muito útil
D4RIO
Sem problemas. Na verdade, comecei a escrevê-lo como um comentário para o seu, mas os comentários são muito curtos.
Geekosaur
3

Um link flexível aponta para outro nome de caminho. Esse nome de caminho pode ou não existir realmente. O caminho não é procurado até você acessar o link simbólico. Se o caminho não existir quando você tentar acessá-lo, você terá um link simbólico quebrado.

Com um link físico, você tem um arquivo com vários nomes. Você não pode dizer que um deles é o arquivo "real" e os outros são apenas um link para ele. Eles são todos iguais. Não existe um link rígido quebrado da mesma forma que há links simbólicos quebrados.

Os links físicos funcionam apenas em um único sistema de arquivos. Se você deseja criar um link para um arquivo em um sistema de arquivos diferente (por exemplo uma partição diferente ou um compartilhamento de rede), você deve usar um soft link.

Outra grande diferença é o que acontece quando você exclui um arquivo vinculado. Se você excluir um de um par de arquivos vinculados, e criar um novo arquivo com o mesmo nome, terá dois arquivos separados (o link desapareceu). Se você excluir o destino de um link simbólico e criar um novo arquivo com o mesmo nome, o link apontará para o novo arquivo.

cjm
fonte
3

Links "hard" compartilham o mesmo inode

$ touch foo
$ ln foo foolink # Creates a hard  link
$ ls -li foo foolink
54996 -rw-r--r-- 2 bsd users 0 2011-12-11 09:06 foo
54996 -rw-r--r-- 2 bsd users 0 2011-12-11 09:06 foolink

Se eu editar foo ou foolink, haverá apenas um arquivo e ele será atualizado. Se eu remover apenas um dos nomes de arquivos, o inode e os dados persistirão, o truque sobreviverá.

$ rm foo
$ ls -li foo foolink
ls: cannot access foo: No such file or directory
54996 -rw-r--r-- 1 bsd users 0 2011-12-11 09:06 foolink

Se eu fosse criar o mesmo, mas com um link "soft" ou simbólico, haverá um arquivo, um inode e um novo arquivo com seu próprio inode apontando para o primeiro.

$ touch foo
$ ln -s foo foolink # Create symlink
$ ls -li foo foolink
55029 -rw-r--r-- 1 bsd users 0 2011-12-11 09:11 foo
55033 lrwxrwxrwx 1 bsd users 3 2011-12-11 09:11 foolink -> foo

Se eu editar foo ou foolink, ainda haverá apenas um arquivo e ele será atualizado.

Se eu remover apenas o link simbólico, o inode e os dados persistirão. Se eu remover foo, os dados desaparecerão, o link simbólico persistirá, mas apontará para um arquivo inexistente.

$ rm foo
removed `foo'
$ ls -l foo foolink 
ls: cannot access foo: No such file or directory
lrwxrwxrwx 1 bsd bsd 3 2011-12-11 09:11 foolink -> foo
bsd
fonte
11
Mas qual é um caso de uso prático para isso?
E11h11
11
Um uso, igual a um "atalho" Outro uso, com várias versões de um aplicativo em um sistema, permite instalar, testar uma nova versão, especificando o aplicativo pelo caminho completo, enquanto o link simbólico no compartimento aponta para a produção. Após a conclusão do teste, altere o link simbólico para a nova versão, deixe a versão antiga para todos os usuários que possuam código dependente da versão. Pense em perl, python, etc.
bsd
11
caso de uso prático para links físicos. No momento, no meu sistema de arquivos, encontrei um grande número de links físicos em / usr / share / zoneinfo Pense em todos os arquivos nomeados que representam fusos horários, todos idênticos ao EST. Economizamos espaço no sistema de arquivos por não ter cópias redundantes e permitimos um gerenciamento de pacotes mais fácil sem que a sobrecarga de gerenciamento dos links simbólicos seja instalada / excluída à medida que os pacotes são instalados / excluídos. Mesmo se um for removido, os dados originais são preservados. Desculpe, não tive tempo para uma explicação mais pedante.
BSD
1

Links físicos são entradas de diretório adicionais para o mesmo arquivo. Que significa

  • Todos os links físicos para um arquivo devem estar no mesmo sistema de arquivos (porque uma entrada de diretório não pode apontar para um arquivo em um sistema de arquivos diferente), mas não necessariamente no mesmo diretório.
  • Não há diferença entre a entrada do diretório original e o novo link físico; do ponto de vista do sistema operacional, são apenas duas entradas de diretório para o mesmo arquivo. Um arquivo é excluído apenas se todos os links físicos forem excluídos (e, além disso, não há nenhum processo que ainda tenha esse arquivo aberto).
  • Se você mover / renomear o "original", desde que não o mova para outro sistema de arquivos, os outros links físicos não serão afetados; eles ainda apontam para o mesmo arquivo.
  • Muitos editores não gravam o novo conteúdo no mesmo arquivo ao salvar, mas executam o seguinte procedimento:

    1. Escreva o novo conteúdo em um novo arquivo.
    2. Renomeie o arquivo antigo para um nome de backup (ou, se não estiver mantendo os backups da versão anterior, simplesmente exclua-o).
    3. Renomeie o arquivo gravado recentemente para o nome do arquivo anterior.

    Esse esquema significa que quaisquer outros links físicos para o mesmo arquivo não apontarão mais para o arquivo atual, mas para a versão anterior (isso é verdade mesmo que o editor exclua o arquivo antigo, porque no Unix, "excluindo" um arquivo significa apenas excluir o link; somente se o link excluído for o único link em que o arquivo real será excluído).

  • Como o link físico vai diretamente para o arquivo, você pode acessá-lo mesmo que não tenha acesso ao local original desse arquivo (por exemplo, porque você não tem nenhuma permissão no diretório em que a entrada original está) . Os únicos direitos que determinam seu acesso são os direitos de acesso do arquivo (que estão associados ao arquivo, não ao link; você não pode criar links físicos com permissões diferentes para o mesmo arquivo) e os direitos de acesso ao caminho do link físico está contido em (basicamente, os direitos de execução no diretório em que o link está e quaisquer diretórios pai diretos e indiretos).

Os links simbólicos, por outro lado, armazenam o nome do caminho (o nome do arquivo - ou melhor, a entrada do diretório - incluindo potencialmente o caminho, como /bin/shou subdir/foo.bar) - de outro arquivo. Se o nome do caminho for relativo, ele sempre será interpretado em relação ao diretório em que o link está contido. Isso significa:

  • Um link simbólico pode se referir a arquivos em um sistema de arquivos diferente (mesmo em um sistema de arquivos que não suporta links físicos ou virtuais, como FAT).

  • Se o arquivo original for excluído, o link simbólico não preservará o conteúdo do arquivo. A menos que haja outros links físicos para o mesmo arquivo, o conteúdo do arquivo desaparecerá. O link simbólico será deixado pendente (ou seja, referindo-se a um nome de caminho que não corresponde a uma entrada de diretório). Por outro lado, a exclusão do link simbólico não afeta o arquivo original, pois se refere apenas ao nome do caminho.

  • Se o arquivo original for movido ou renomeado, o link simbólico não será atualizado, mas ficará pendente. Se você mover o link simbólico, ele será interrompido apenas se contiver um caminho relativo, e o caminho não será mais válido a partir da nova posição.

  • Se o arquivo original for substituído por um novo arquivo com o mesmo nome (como no cenário do editor descrito acima), o link se refere ao novo arquivo.

A maioria dos usos de links físicos é basicamente uma maneira de obter uma cópia de um arquivo sem precisar armazenar o conteúdo do arquivo duas vezes. Isso funciona melhor se os arquivos nunca forem alterados novamente, caso contrário, é fácil quebrar acidentalmente o link (consulte o cenário do editor acima). É claro que existem casos em que você deseja que o link seja quebrado, como no caso de manter vários backups: Para arquivos que foram alterados em backups mais recentes, você não deseja que a cópia nos backups antigos também seja alterada.

Normalmente, se você quiser um link, usará um link simbólico. Um exemplo é quando você move um diretório para outra partição (porque a pasta está cheia), você pode definir um link flexível da posição antiga para a nova, para que qualquer programa que tente acessar o diretório no local antigo acessá-lo no novo local. Isso não seria possível com links físicos. No entanto, esteja ciente de que os links simbólicos no diretório movido podem ser interrompidos se eles contiverem caminhos relativos que saem do diretório movido.

celtschk
fonte
1

HARD LINK (apenas arquivos) vs SOFT LINK (arquivos ou diretórios) vs BIND (HARD LINK para diretórios)

VEJA ESTA IMAGEM ANTES DE LER O POST
(fonte: freesoftwareservers.com )

Embora a resposta de daxelrod explique bem a pergunta, achei que a imagem nesse caso fazia uma grande diferença, especialmente para iniciantes que ainda não entendem inodes e complicado jargão do Linux.

Pense nisso: se você "excluiu" tudo do seu disco, poderia executar um software para restaurar os dados, porque os 1 e 0 ainda estão lá, você apenas excluiu todos os Hard Links. O objetivo do Recovery Software é reconstruir os Hard Links para entender os zeros e zeros

Eu li um ótimo "one liner" que fazia tudo isso fazer sentido e eu queria compartilhar!

Todos os arquivos no Linux são "Hard Links" para os zeros e zeros no disco. Quando você cria dados (zeros e zeros), o sistema operacional cria um link físico na árvore de arquivos para fazer referência a esse ponto no disco rígido.

Crie o HARD LINK 2 e exclua o arquivo original do HARD LINK 1 :

Você pode criar outro link físico e excluir o arquivo original e ainda terá acesso ao link físico recém-criado.

Exclua FILE (HARD LINK 1) que está SOFT LINK para:

Se você excluiu o HARD LINK 1, você acha que o SOFT LINK funcionaria? Não, o SO reportará que o HARD LINK 1 não existe.

Exclua SOFT LINK para HARD LINK:

Ao contrário, se você excluir o SOFT LINK, o HARD LINK funcionará? Sim. Enquanto o sistema operacional tiver um arquivo HARD LINK, ele informará que o preenchimento não foi excluído.

- Também vale a pena pesquisar / observar o BIND, uma maneira de vincular dois diretórios, como ligar dois diretórios, mas é transparente para o sistema operacional (os SOs podem dizer quando você Symlink e alguns têm regras sobre o clima, podem seguir os Links simbólicos). Ele usa o Mount, não LS e pode ser configurado via FSTAB.

O que é uma montagem BIND

FreeSoftwareServers
fonte
11
Esse é um esforço bastante ambicioso, especialmente para um primeiro post. Infelizmente, acredito que adicionar o material em "bind" (que não foi solicitado) apenas confunde os assuntos; especialmente porque você não parece ter se esforçado muito para explicar a montagem "vincular". Além disso, entendo muito bem os links físicos e simbólicos / simbólicos, e mal entendo sua imagem. Eu ficaria muito surpreso se um iniciante pudesse aprender alguma coisa com isso.
G-Man diz 'Restabelecer Monica'
Embora você possa vincular os diretórios por link simbólico, ele é exibido no sistema de arquivos como um link simbólico; se você ligar, é transparente para o sistema operacional. Aparece como um arquivo.
FreeSoftwareServers
11
(1) Na verdade, em pelo menos algumas versões do Linux, é possível vincular a montagem de um arquivo. (2) Embora as montagens de ligação pareçam muito semelhantes aos links físicos, dizer "A ligação é simplesmente o mesmo que links físicos (exceto que você não pode vincular um diretório)" está errado.
G-Man diz 'Restabelecer Monica'
@ G-Man, concordou e removidos, com apenas um BIND mencionar nota
FreeSoftwareServers
@Free, na verdade, o link virtual aponta para um nome de arquivo (link físico 1); os esquemas devem tornar isso óbvio.
JB.
0

Um link físico manterá um arquivo no disco até que todos os links físicos, mesmo o primeiro (um "nome do arquivo" seja tecnicamente um link físico), sejam excluídos. Um link virtual pode ficar "pendurado" até que o arquivo para o qual aponte (s / ed) seja substituído.

Ignacio Vazquez-Abrams
fonte
0

Essa é uma pergunta muito antiga, mas tenho um caso de uso que exige que eu use links físicos.

Sou músico e, portanto, tenho muitos e muitos arquivos de áudio de vários tipos em vários discos rígidos conectados ao meu Mac. Terabytes no valor. Eu os organizo principalmente muito bem com diretórios de links simbólicos, para que eu possa encontrá-los por editor de conteúdo, estilo / som e outros critérios com base em como estou pensando na época. Infelizmente, um programa que eu uso, o Ableton Live, é completamente incapaz de exibir aliases ou links simbólicos no navegador de arquivos. A única solução que eu encontrei é criar links físicos dos diretórios que eu quero que eles possam ver, e então tudo funciona muito bem.

Portanto, esse é outro caso em que você pode precisar usar links físicos, que podem não ter ocorrido a outras pessoas.

Jonathan van Clute
fonte
Eu arquivaria um relatório de bug para o Ableton Live. Talvez eles consigam consertar isso.
Aventurin
Sim, já há muitas reclamações sobre esse problema nos fóruns dos abletons há anos ... Eles parecem não estar fazendo nenhuma tentativa de resolvê-lo, embora eu não consiga entender por que não.
22417 Jonathan van Clute