Por que existem links físicos?

Respostas:

56

A principal vantagem dos links físicos é que, comparados aos links flexíveis, não há penalidade de tamanho ou velocidade. Soft links são uma camada extra de indireção sobre o acesso normal a arquivos; o kernel precisa desreferenciar o link quando você abre o arquivo, e isso leva uma pequena quantidade de tempo. O link também ocupa uma pequena quantidade de espaço no disco, para conter o texto do link. Essas penalidades não existem com links físicos porque são incorporadas à própria estrutura do sistema de arquivos.

A melhor maneira que eu conheço de ver isso é:

$ ls -id .
1069765 ./
$ mkdir tmp ; cd tmp
$ ls -id ..
1069765 ../

A -iopção para lsfornecer o número de inode do arquivo. No sistema em que preparei o exemplo acima, eu estava em um diretório com o número de inode 1069765, mas o valor específico não importa. É apenas um valor único que identifica um arquivo / diretório específico.

O que isso diz é que, quando entramos em um subdiretório e observamos uma entrada diferente do sistema de arquivos chamada .., ela tem o mesmo número de inode que obtivemos antes. Isso não está acontecendo porque o shell está interpretando ..para você, como acontece com o MS-DOS e o Windows. No sistema de arquivos Unix, ..há uma entrada de diretório real; é um link físico que aponta para o diretório anterior.

Links físicos são os tendões que unem os diretórios do sistema de arquivos. Era uma vez, o Unix não tinha links físicos. Eles foram adicionados para transformar o sistema de arquivos simples original do Unix em um sistema de arquivos hierárquico.

(Para obter mais informações, consulte Por que '/' possui uma entrada '..'? )

Também é algo comum nos sistemas Unix que vários comandos diferentes sejam implementados pelo mesmo executável. Não parece mais o caso do Linux, mas dos sistemas que eu usei no passado cp, mve rmeram todos executáveis. Faz sentido se você pensar sobre isso: quando você move um arquivo entre volumes, é efetivamente uma cópia seguida por uma remoção, então mvjá era necessário implementar as funções dos outros dois comandos. O executável pode descobrir qual operação fornecer, porque recebe o nome pelo qual foi chamada.

Outro exemplo, comum em Linuxs embarcados, é o BusyBox , um único executável que implementa dezenas de comandos.

Devo salientar que na maioria dos sistemas de arquivos, os usuários não têm permissão para criar links físicos para diretórios. As entradas .e ..são gerenciadas automaticamente pelo código do sistema de arquivos, que normalmente faz parte do kernel. A restrição existe porque é possível causar sérios problemas no sistema de arquivos se você não tomar cuidado com a criação e o uso de links físicos de diretório. Essa é uma das muitas razões pelas quais existem links flexíveis; eles não correm o mesmo risco.

Warren Young
fonte
4
Sobre "O link também ocupa uma pequena quantidade de espaço no disco, para conter o texto do link". Nos sistemas de arquivos modernos, nenhum espaço extra é usado para armazenar o caminho do link, pois a própria entrada do diretório é usada para armazená-lo, pelo menos se o nome não for muito longo para caber. Isso é chamado de "links simbólicos rápidos"
jlliagre 25/11/13
Eu acrescentaria que alguns aplicativos não sabem como lidar com links suaves (sym) e, portanto, links físicos podem ser úteis para evitar redundâncias ao configurá-los, fazendo referência aos mesmos arquivos de dados / configuração. Um exemplo é ioquake3, que não pode seguir arquivos pk3 com link simbólico, mas pode seguir arquivos pk3 com link físico.
gaborous
3
Além disso, se você excluir o destino de um link simbólico, o arquivo desaparecerá e o link simbólico será quebrado. Um problema que não existe com um link físico.
espectros
1
Mas os links físicos também contêm algumas informações - seus nomes. Então isso deveria ocupar espaço.
Josef Klimuk
39

Um uso de hardlinks extremamente úteis é em backups incrementais combinados com o rsync. Economiza muito espaço e facilita muito o processo de restauração. Eu uso essa abordagem para backup em meus servidores.

Tire um tempo para ler esta explicação .

hmontoliu
fonte
12

Se, depois de ler essa página da Wikipedia, sua pergunta for "por que eu os usaria", você não entenderá o que são links físicos.

Um link é uma entrada de diretório que aponta para blocos no disco. Em outras palavras, todos os arquivos no seu sistema possuem pelo menos um link. Quando você rmarquiva, é a chamada do sistema real unlink(). Remove a entrada do diretório. Os blocos no disco não foram alterados, mas o link se foi, portanto, o arquivo foi removido da lista de diretórios.

Você pessoalmente nunca pode usar links físicos, mas eles estão espalhados por todo o sistema. Por exemplo:

$ ls -li /bin | grep 53119771
53119771 -rwxr-xr-x 3 root root  26292 2010-08-18 10:15 bunzip2
53119771 -rwxr-xr-x 3 root root  26292 2010-08-18 10:15 bzcat
53119771 -rwxr-xr-x 3 root root  26292 2010-08-18 10:15 bzip2

Você pode ver que bunzip2, bzcate bziptodos usam o mesmo inode. Em essência, é um arquivo com três nomes. Você poderia ter três cópias do arquivo, mas por quê? Usaria apenas espaço em disco desnecessariamente.

bahamat
fonte
12
Mas também há vários links simbólicos /bin, acho que essa é uma das fontes de confusão. Por que, às vezes, os executáveis ​​seriam vinculados e, às vezes, vinculados?
Dmitry Pashkevich
16
Esta resposta não fornece nenhum motivo para o uso de links físicos em links virtuais.
Mark Amery
8

Há vários usos. Eu os uso para criar bloqueios baseados em arquivo. A chamada do sistema de link (2) é atômica, diferente da maioria das outras chamadas do sistema.

Outro uso está no rsnapshot, onde os backups são feitos ao longo do tempo usando links físicos para reduzir a quantidade de espaço em disco. Se um arquivo não tiver sido alterado, ele será vinculado às instâncias mais antigas do arquivo, os arquivos que foram alterados serão copiados novamente.

Eu também os uso para trocar arquivos de configuração nos servidores:; rm file.cfg && ln ~/tmp/file.cfg file.cfgentão, os arquivos ~ / tmp / * podem ser excluídos com segurança.

Arcege
fonte
1
Por que separar lne em rmvez de apenas um mv?
Tommiie 01/04
6

Para adicionar às várias boas discussões já presentes ...

  • A maneira como o acesso a recursos para programas é implementado no unix (ou seja, "tudo é um arquivo" ) significa que a infraestrutura para lidar com várias referências a um arquivo é necessária para que o sistema operacional funcione, portanto, não há custo adicional aqui.
  • A maneira como os diretórios foram implementados nos sistemas de arquivos unix originais (ou seja, uma lista de (inode, name)pares de formato fixo significa que não há nenhum custo extra no sistema de arquivos em ter links físicos (bem, desde que evitemos ciclos ao proibir o hardlinke de diretórios (exceto .e ..(isso começa a parecer cegueira para mais alguém?)))

então nós os obtemos de graça.

dmckee
fonte
2

Eu provavelmente deveria cobrir um cenário de armadilhas de links físicos. Um link físico será apenas o mesmo arquivo com um nome diferente e / ou um local diferente , desde que o arquivo vinculado original exista . Nem sequer é correto pensar no arquivo como "original": ambos são entradas de diretório por si só e ambos (ou mais) são iguais. Para arquivos de longa duração, isso pode ser uma bênção, mas se um dos pares for excluído e depois criado, mesmo com o mesmo nome e conteúdo, os arquivos serão separados.

Suponha que você criou um /foo/myfilelink físico para o link /repo/myfile. Ambos são ponteiros para os mesmos dados de arquivo; mudar um, o outro muda. Mas suponha que isso /repoocorra com um repositório Git. Se você fizer check-out de um ramo que não contém myfile, ele /repo/myfileserá excluído. Neste momento, /foo/myfiletorna-se uma cópia simples de /repo/myfile, como no momento em que o outro par foi desvinculado. É fácil nem perceber quando você alterna entre os ramos que o repertório de arquivo muda, mas, quando você faz o checkout do ramo original, um novo arquivo/repo/myfileé criado pelo Git. Se você não prestou atenção, se perguntaria por que os dois arquivos agora têm conteúdo diferente, embora seja fácil de entender, já que o relacionamento de vínculo físico entre os arquivos não tem idéia sobre seus nomes. Um link flexível, pelo contrário, sobreviveria por esse ciclo de exclusão e criação.

Por outro lado, o software que usa links físicos está ciente disso, e o Git é um excelente exemplo. O Git clona um repositório no mesmo sistema de arquivos quase de graça, porque usa links físicos por padrão em vez de copiar arquivos. Para o Git, o link físico é um caso de uso perfeito, porque seus arquivos de objeto e pacote nunca mudam; portanto, um clone do repositório nunca modifica o outro (o Git não sabe vincular arquivos modificáveis) e qualquer um dos clones pode ser excluído sem qualquer precaução: não há necessidade de rastrear qual é o "original" e realmente conter os arquivos: qualquer um dos links físicos é um parceiro igual e "contém" o arquivo completo. Soft links simplesmente não funcionariam aqui.

Outra vantagem do link físico é que qualquer link pode ser movido sem interromper o acesso ao conteúdo do arquivo. Com links flexíveis, mover o arquivo original faz com que todos os links flexíveis sejam danificados.

A conclusão é que, em muitos casos de uso, qualquer um dos tipos de links funciona igualmente bem, mas em alguns tipos é vantajoso. A eficiência, mencionada em muitas respostas aqui, provavelmente é uma preocupação muito pequena com máquinas e sistemas de arquivos modernos, a menos que você esteja limpando um sistema de arquivos em um chip FLASH de um controlador embutido insignificante. As diferenças funcionais são mais importantes e geralmente ditam as restrições de engenharia e a melhor escolha:

  • A "origem" do link físico pode ser movida com segurança, enquanto o link flexível será interrompido.
  • O link físico é indistinguível do arquivo do qual foi vinculado e o arquivo permanece ativo enquanto qualquer um dos links físicos estiver ativo; o link flexível é assimétrico.
  • O ponto com vínculo físico rompe o grupo vinculado se excluído e recriado, mas o vínculo virtual não perde seu destino.
  • O link flexível pode atravessar sistemas de arquivos, o link físico não pode.
  • O link virtual pode apontar para um diretório, o link físico geralmente não pode (e praticamente sempre não deveria).

Além disso, devo salientar que a chamada de biblioteca que exclui um arquivo é chamada unlink()por um motivo! Cada entrada de diretório é apenas um link físico inicialmente singular para seu inode.

kkm
fonte