Quando você usaria um sobre o outro?
Quando você usaria um sobre o outro?
Respostas:
A semântica diferente entre os links físicos e físicos torna-os adequados para coisas diferentes.
Links físicos:
Links simbólicos (links flexíveis)
ls -l
mostrará para qual caminho um link simbólico aponta)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).
..
e são .
.
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 -al
pode 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 rm
nã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!
ls -l
é suficiente para ver o que está sendo vinculado por um link simbólico, o que a
significa --all
ver 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.
ln -s /home 1; ls -l 1
mostra que o link simbólico 1 tem 5 bytes de comprimento, enquanto ln -s /usr/share/ 2; ls -l 2
mostra que 2 tem 11 bytes.
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.
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 -i
e obter o número de hardlinks da stat
seguinte 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
namei
, a partir do nome da função kernel que fez isso no tradicional Unix.)
stat
falhem.
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.
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
Links físicos são entradas de diretório adicionais para o mesmo arquivo. Que significa
Muitos editores não gravam o novo conteúdo no mesmo arquivo ao salvar, mas executam o seguinte procedimento:
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/sh
ou 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.
HARD LINK (apenas arquivos) vs SOFT LINK (arquivos ou diretórios) vs BIND (HARD LINK para diretórios)
(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.
Você pode criar outro link físico e excluir o arquivo original e ainda terá acesso ao link físico recém-criado.
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.
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.
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.
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.