Casos de uso para hardlinks? [fechadas]


40

Em que situações alguém desejaria usar um link físico em vez de um link virtual? Pessoalmente, nunca deparei com uma situação em que gostaria de usar um link físico em vez de um link flexível, e o único caso de uso que encontrei ao pesquisar na Web é a desduplicação de arquivos idênticos .


4
Há boas respostas abaixo, mas considere o contexto histórico (discutível). Quando o Unix era novo, as unidades de disco eram lentas e tinham capacidade e buffer limitados. Um link físico era simplesmente outra entrada direta no sistema de arquivos para o mesmo arquivo. Se você estava acessando ls ou como você gostaria de chamá-lo, listar , era irrelevante. Se você transformou list em um link simples, seu uso envolveria encontrá-lo no diretório, ler o arquivo especial chamado list , verificar se você deseja o arquivo ls , encontrar ls no diretório e ler o arquivo ls real a partir do disco. Uma enorme diferença no desempenho!
RichF 29/01

16
Bem, o primeiro link para um arquivo é bastante útil.
Pare de prejudicar Monica

@OrangeDog: Sim, mas você só precisa de um campo de contagem de links no inode se desejar oferecer suporte a vários links. (Você pode precisar de um sinalizador para a versão na memória dos inodes para lidar com o caso desvinculado, mas ainda aberto. O fsck após uma falha sem registro no diário ainda precisaria procurar inodes sem links de qualquer maneira.)
Peter Cordes

11
A semântica do diretório POSIX teria que ser projetada de maneira diferente: ..é sempre o mesmo inode que .no diretório pai. Coisas como findpodem verificar esse link-count = 2 para detectar diretórios de folhas e evitar que statas entradas do readdir procurem subdiretórios. Mas esse é apenas um recurso secundário ativado pelo suporte a links físicos de arquivos que não são de diretório (regular, link simbólico, dispositivo, soquete e pipe nomeado). (Sim, links simbólicos têm o seu próprio inode, e pode ser hardlinked.)
Peter Cordes

11
Um motivo para o uso de hardlinks que não vi na minha análise do SO, de natureza "global". Imagine um sistema de arquivos em que os arquivos geralmente são pequenos (por exemplo, notas curtas), mas para manter as coisas organizadas, você pode precisar de indicadores para o mesmo arquivo em locais diferentes. Com links simbólicos, cada ponteiro usa um inode. Esses sistemas de arquivos já podem ter um problema com a falta de inodes. O uso de hardlinks como ponteiros ajuda nesse problema. inodes são limitados em número; nomes para eles não são (pelo menos, não da mesma maneira).
mathguy

Respostas:


27

Além do uso de backup mencionado em outro comentário, que acredito que também inclui os instantâneos em um volume BTRFS, um caso de uso para links físicos sobre links físicos é uma coleção de arquivos classificados por tags. (Não é necessariamente o melhor método para criar uma coleção, um método orientado a banco de dados é potencialmente melhor, mas para uma coleção simples razoavelmente estável, não é tão ruim.)

Uma coleção de mídia em que todos os arquivos são armazenados em um diretório simples e são classificados em outros diretórios com base em vários critérios, como ano, assunto, artista, gênero etc. Isso pode ser uma coleção pessoal de filmes ou um coletivo de estúdio comercial. trabalho. Essencialmente finalizado, o arquivo é salvo, provavelmente não será modificado e classificado, possivelmente em vários locais por links.

Lembre-se de que o conceito de "original" e "cópia" não é aplicável a links físicos: todo link para o arquivo é original, não existe "cópia" no sentido normal. Para a descrição do caso de uso, no entanto, os termos imitam a lógica do comportamento.

O "original" é salvo no diretório "catálogo" e as "cópias" classificadas são vinculadas a esses arquivos. Os atributos do arquivo nos diretórios de classificação podem ser configurados para r / o, impedindo alterações acidentais nos nomes dos arquivos e na estrutura classificada, enquanto os atributos no diretório do catálogo podem ser r / w, permitindo que sejam modificados conforme necessário. (Isso pode ser um arquivo de música em que alguns players tentam renomear e reorganizar arquivos com base em tags incorporadas no arquivo de mídia, de entrada do usuário ou recuperação da Internet.) Além disso, como os atributos dos diretórios "copy" podem ser diferentes de No diretório "original", a estrutura classificada pode ser disponibilizada ao grupo ou mundo, com acesso restrito, enquanto o "catálogo" principal é acessível apenas ao usuário principal, com acesso total. Os arquivos em si, no entanto, sempre terão os mesmos atributos em todos os links para esse inode. (O ACL poderia ser explorado para melhorar isso, mas não minha área de conhecimento.)

Se o original for renomeado ou movido (o diretório "catálogo" único se torna muito grande para gerenciar, por exemplo), os links físicos permanecem válidos, os links flexíveis são quebrados. Se as "cópias" forem movidas e os links flexíveis forem relativos, os links flexíveis serão novamente quebrados e os hard links não serão.

Nota: parece haver inconsistência em como as diferentes ferramentas relatam o uso do disco quando há links flexíveis. Com links físicos, no entanto, parece consistente. Portanto, com 100 arquivos em um catálogo classificados em uma coleção de "tags", pode haver facilmente 500 "cópias" vinculadas. (Para uma coleção de fotografias, digamos data, fotógrafo e uma média de 3 tags "assunto".) O Dolphin, por exemplo, reportaria isso como 100 arquivos para links físicos e 600 arquivos se forem usados ​​links físicos. Curiosamente, ele relata o mesmo uso de espaço em disco de qualquer maneira, portanto parece uma grande coleção de arquivos pequenos para links flexíveis e uma pequena coleção de arquivos grandes para links físicos.

Uma ressalva para esse tipo de caso de uso é que, nos sistemas de arquivos que usam COW, modificar o "original" pode interromper os links físicos, mas não os links virtuais. Mas, se a intenção é obter a cópia principal, após editar, salvar e classificar, o COW não entra no cenário.


3
FYI: os snapshots btrfs não são hardlinks. Eles têm um comportamento diferente (por exemplo, modificar uma cópia não modifica a outra). E statmostrará apenas um link.
derobert

@derobert Não sabe ao certo como os instantâneos funcionam, pouca investigação mostra coisas interessantes. Para arquivos / diretórios inalterados, statmostre o mesmo número de inode, mas um ID de dispositivo diferente. Deve ter algo a ver com a maneira como os subvolumes são sobrepostos no volume principal, raramente montado. Suspeito que se o volume principal fosse montado statmostraria uma contagem de links igual ao número de instantâneos que mantinham essa versão do arquivo. O COW provavelmente cuida da modificação que não afeta nenhuma outra. Mera especulação baseada em curiosidade leve, mas não curiosa o suficiente para aprofundar.
Gypsy Spellweaver

Cada link simbólico possui seu próprio inode, portanto, utiliza uma entrada de inode no sistema de arquivos. Os sistemas de arquivos Unix tradicionais exigem que você escolha quanto espaço reservar para inodes no momento da criação do FS, em vez de alocá-lo conforme necessário, como o XFS. Portanto, é realmente significativo que a versão do link simbólico usaria muitos mais inodes (mesmo além das implicações da pegada de cache do VFS).
Peter Cordes

23

Links físicos são úteis para casos em que você não deseja vincular a existência dos dois arquivos. Considere isto:

touch a
ln -s a b
rm a

Agora bé inútil. (E essas etapas podem ocorrer bastante distantes, executadas por pessoas diferentes etc.)

Considerando que, com um link físico,

touch a
ln a b
rm a

b ainda está presente e correto.


8
@ MatthewCline Você gostaria desse comportamento ao gerenciar backups incrementais eficientes. Especialmente quando os backups antigos são excluídos, em um sistema de backup baseado em soft-link, você teria que verificar e vincular novamente todos os arquivos / links de backup mais recentes a uma base válida, enquanto os hardlinks fazem esse trabalho "de graça" no nível do inode. Timeshift / Backintime, por exemplo, use links físicos extensivamente.
precisa saber é

3
@orzechow Eu não acho que você queira um comportamento de link físico próximo ao seu sistema de backup. O github.com/bit-team/backintime/wiki/… backintime tolamente assume que todas as alterações nos arquivos ocorrerão por um ciclo de remoção-criação, em vez de atualização no local.
DepressedDaniel

10
Os links físicos do @DepressedDaniel estão bem dentro de um sistema de backup; você não deseja que os backups sejam vinculados aos arquivos ativos . Mas em qualquer caso, uma cópia de segurança nunca deve ser acessível directamente a partir de um sistema vivo ...
Stephen Kitt

11
Esta não é uma resposta - especificamente, não é um caso de uso. É apenas uma demonstração do comportamento dos links físicos.
usar o seguinte comando

11
@ ThomasPadron-McCarthy é um mal-entendido. O BiT usa links físicos apenas para vincular arquivos idênticos dentro de diferentes instantâneos. Eles não estão vinculados ao arquivo original! (Eu sou o BiT Dev)
Germar

11

Um único programa pode mudar seu comportamento, dependendo de qual nome é lançado como:

$ ls -li `which pgrep` `which pkill`
208330 -r-xr-xr-x  2 root  bin  19144 Jul 26  2016 /usr/bin/pgrep
208330 -r-xr-xr-x  2 root  bin  19144 Jul 26  2016 /usr/bin/pkill

Que na fonte é decidido através de algo como

if (strcmp(__progname, "pgrep") == 0) {
    action = grepact;
    pgrep = 1;
} else {
    action = killact;

embora os detalhes exatos variem dependendo do sistema operacional e do idioma envolvido.

Isso permite que o código (principalmente) idêntico não precise ser compilado para dois (principalmente) binários idênticos. Lembre-se de datas unix para os dias em que o espaço em disco era muito caro, embora, de acordo com Stevens no capítulo 4 do APUE, os links simbólicos tenham sido implementados no BSD4.2 (1983) para substituir várias limitações de links físicos. Um programa de teste para verificar se o nome do link simbólico é usado como o nome do programa pode se parecer com:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    printf("called as '%s'\n", *argv);
    exit(0);
}

E testado via:

$ cc -o myname myname.c 
$ ln -s myname alias
$ ./myname
called as './myname'
$ ./alias
called as './alias'
$ 

4
Mas isso geralmente não é tratado com softlinks?
Matthew Cline

11
@MatthewCline poderia ser hoje, mas links simbólicos não existiam antes do 4.2BSD (1983), de acordo com Stevens no APUE.
thrig

4
@thrig, a pergunta pede especificamente casos de uso que não podem ser realizados por links simbólicos ou são, pelo menos, preferíveis ao invés de usar links simbólicos. Sua resposta se aplica a HLs e SLs.
Marcelo

3
O BusyBox leva isso ao máximo.
Max Ried

8

Quando o meu software P2P termina o download de um determinado arquivo, ele é colocado em um diretório específico. Os arquivos baixados quase nunca precisam ser editados. O caso mais comum é criar um hardlink em um diretório diferente, onde preciso que o arquivo esteja.

Vantagens:

  • Ainda compartilho o arquivo na rede P2P como deveria, mesmo que eu rmou mva "cópia".
  • O arquivo também está no caminho em que eu preciso; a maioria desses locais não é compartilhada.
  • Eu posso rmo "original" para parar de compartilhar o arquivo; esta operação não afeta a "cópia" no local desejado.
  • Meu espaço em disco é usado apenas uma vez.

O ponto principal: se eu soubesse com antecedência qual arquivo eu rmprimeiro, eu poderia usar o link simbólico. Mas eu nunca sei.


6

Os sistemas de arquivos são uma maneira simples e eficiente de organizar e classificar arquivos (esse é o principal motivo de sua existência). Os hardlinks permitem um maior grau de flexibilidade nesse assunto.

Como mencionado, não há conceito de original e cópias ao lidar com hardlinks, todas as entradas de diretório (hardlinks) são simplesmente referências à existência do arquivo (aponte para seu inode) sem precedência, portanto, também não há hardlinks quebrados. .

Portanto, aqui estão alguns dos casos de uso que os hardlinks participam, mas os softlinks não :

  1. Imagine que você tem uma coleção de filmes, músicas ou outras mídias e deseja aplicar critérios de classificação diferentes, como músicas classificadas por artista em um ramo (cada artista tem seu próprio subdiretório); por gênero em outro ramo (cada um em um subdiretório diferente), etc. Ainda assim, você não deseja duplicar os arquivos nem decidir onde colocar o "original" para ter a liberdade de reclassificar sem precisar " gerenciar "e vincular novamente os arquivos ao mover-se para evitar links quebrados.

  2. Outro motivo é evitar o desperdício de espaço de armazenamento necessário para ter várias cópias do mesmo arquivo e ainda permitir que o chrootsyscall se beneficie de um subconjunto de arquivos na raiz "principal" do sistema de arquivos (links simbólicos nunca poderiam referenciar arquivos de fora o chrootsandbox, mesmo se eles têm caminhos relativos).

  3. Outro motivo muito importante, mas raramente mencionado, para a existência de links físicos são os ..subdiretórios. Na ..verdade, os diretórios são (na maioria das implementações do unix fs) links diretos para o diretório pai, sem links vinculados isso deve ser implementado de uma maneira completamente diferente, enquanto a existência de links vinculados facilita a implementação.


11
Para o ponto 1, usar uuids como o nome 'canônico' dos arquivos e tornar todos os nomes legíveis por humanos links simbólicos para os uuids, é uma solução alternativa.
R ..

Embora a sugestão de uuids pareça academicamente correta, o uso de uuids para nomes de arquivos não parece muito prático e, novamente, o objetivo é simplificar as coisas, não torná-las mais difíceis ou "menos compreensíveis ao ser humano". Além disso, ter uudis para a referência de arquivo "canônica" seria apenas um indireto adicional ao inode de arquivo real; portanto, não há nenhum ponto a ser realizado nessa abordagem, pois ela não oferece vantagens, apenas desvantagens como: impacto no desempenho, adicional espaço em disco para armazenar mais entradas de diretório, ter um monte de arquivos com nomes "estranho" por aí ...
Marcelo

5

Exemplo muito comum do mundo real que precisa de links físicos:

git clone --reference <repository>

Isso clona de um repositório Git local com quase zero de cópia. Em vez de copiar os arquivos de objetos (arquivos imutáveis ​​usados ​​pelo Git para seu "banco de dados"), simplesmente os vincula.

Qualquer repo pode remover um objeto, mas o inode permanece válido para o restante dos repos. E se um objeto for removido de todos os repositórios, ele será excluído do disco. Os links físicos são uma solução rápida e robusta. Muito comum em servidores de IC.


Há uma versão não-hard-link: git clone --shared <repository>. Isso, no entanto, é inconstante e tem muito mais ressalvas, pois todos estão trabalhando no mesmo diretório.


4

Recentemente, tive um caso de uso para um procedimento de atualização um tanto seguro para sistemas baseados em U-Boot, onde uImagehá um link para a imagem a ser inicializada; a idéia era que uma queda de energia não deveria causar problemas, não importa em que ponto do processo acontece (assumindo que o sistema de arquivos seja reproduzido):

ln image.bin backup_image.bin
ln -sf backup_image.bin uImage

// replace image.bin

ln -sf image.bin uImage
rm backup_image.bin

Sem hardlinks, não seria tão simples.

/editar:

Graças aos comentários, agora sei que seria melhor fazer:

ln image.bin backup_image.bin
ln -sf backup_image.bin uImageNew
mv uImageNew uImage || rm -rf uImage && mv uImageNew uImage

// replace image.bin

ln -sf image.bin uImageNew
mv uImageNew uImage || rm -rf uImage && mv uImageNew uImage
rm backup_image.bin

(O rmestá aqui para poder escapar melhor de um estado estranho, por exemplo, se uImageé algo inesperado que causaria mvfalha [mas não necessariamente a ln -sfsolução anterior ].)


2
+1 porque conceitualmente é uma boa razão, mas infelizmente ln -sfnão é atômica. Exclui o link simbólico antigo e cria um novo. Para corrigir isso, você precisa criar um novo link simbólico com um nome temporário e rename(2)( mv) com o nome daquele que você deseja substituir.
R. ..

@R .. Você está certo! Ph stat("uImage", {st_mode=S_IFREG|0777, st_size=0, ...}) unlink("uImage"),symlink("backup_image.bin", "uImage")
phk 29/01

11
BTW, veja aqui a minha versão do install.shque resolve o problema: git.musl-libc.org/cgit/musl/tree/tools/install.sh
R ..

@R .. Observe que mvmesmo com -fpode falhar se o destino já existir como, por exemplo, um link simbólico que faz parte de um loop de link simbólico. Demo:ln -sf foo bar; ln -sf bar foo; echo "Before:"; ls -l foo bar; >testfile; mv testfile foo || { echo "Using mv -f"; mv -f testfile foo; }; echo "After:"; ls -l foo bar
phk

3

Um uso que tive para links físicos é ao baixar ou descompactar um arquivo quebrado. O programa que faz o download ou descompacta (como descompactar ou descompactar) geralmente remove automaticamente o arquivo incompleto quando encontra um erro, e geralmente não há opção para mantê-lo. Se eu quiser manter o arquivo, posso criar um link físico para ele.


3

O BackupPC é um sistema de backup que usa links físicos nos servidores para fornecer desduplicação no nível do arquivo.

Os arquivos são armazenados primeiro em uma árvore de diretórios "pool" com base em seu hash md5. Qualquer backup que use esse arquivo cria um vínculo físico com o arquivo do pool. À medida que os backups expiram / são excluídos, seus links físicos são removidos do sistema de arquivos.

Os links físicos são superiores aos links virtuais aqui porque eles fornecem contagem automática de referência. Um trabalho cron exclui periodicamente quaisquer arquivos no diretório do pool que não tenham mais de um link.

Esse método tem algumas desvantagens (principalmente, que é difícil usar ferramentas baseadas no sistema de arquivos para replicar o armazenamento de backup), mas provou ser bastante robusto na prática.


Outro caso de uso: o servidor de aplicativos da web tomcat java trata nomes de arquivos como metadados. Um arquivo java "war" deve ser nomeado com base em seu caminho no servidor da web.

por exemplo: foo.war é o código java que serve o URL/foo

Infelizmente, ele resolve links simbólicos antes de tomar essa decisão.

Portanto, diga que deseja implantar uma compilação de aplicativo e atribua a ele um nome de arquivo descritivo (por exemplo, com um número ou data de lançamento). Você não pode fazer um link simbólico para o arquivo com o nome "real" - é necessário criar um link físico.

foo.warlinkado para foo-20170129.warnão funciona

foo.warcom links para foo-20170129.warobras.

Eu não gosto desse comportamento do tomcat, mas os hardlinks me dão uma maneira de contornar isso.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.