Qual é a diferença entre um link físico e um arquivo?

37

Um link físico é definido como um ponteiro para um inode. Um link virtual , também conhecido como link simbólico , é definido como um arquivo independente que aponta para outro link sem as restrições de links físicos.

Qual é a diferença entre um arquivo e um link físico? Um link rígido aponta para um inode, então o que é um arquivo? A entrada do inode em si? Ou um inode com um link físico?

Digamos que eu crie um arquivo com toque. Em seguida, uma entrada de inode é criada na tabela de inodes . E eu crio um link físico, que tem o mesmo número de inode que o arquivo. Então, eu criei um novo arquivo? Ou o arquivo é definido apenas como um inode?

Levent Divilioglu
fonte
Esta é quase certamente uma duplicata do unix.stackexchange.com/questions/9575/…
infixada em
7
@infixed Exatamente não, estou perguntando a diferença de um arquivo e um link físico.
Levent Divilioglu
Então, cancelei a exclusão da minha resposta original que, acredito, também foi abordada nas respostas a essa pergunta vinculada. Então ainda é 'exatamente não'?
infixado em 20/02
7
A diferença entre um arquivo e um hardlink é igual à diferença entre você e a linha com seu nome na lista telefônica.
Jörg W Mittag
2
Esta é uma duplicata do unix.stackexchange.com/questions/234402/…
seumasmac

Respostas:

61

A resposta muito curta é:

  • um arquivo é um blob de dados anônimo
  • um hardlink é um nome para um arquivo
  • um link simbólico é um arquivo especial cujo conteúdo é um nome de caminho

Arquivos e diretórios Unix funcionam exatamente como arquivos e diretórios no mundo real (e não como pastas no mundo real); Os sistemas de arquivos Unix são (conceitualmente) estruturados assim:

  • um arquivo é um blob de dados anônimo; não tem um nome, apenas um número (inode)
  • um diretório é um tipo especial de arquivo que contém um mapeamento de nomes para arquivos (mais especificamente inodes); como um diretório é apenas um arquivo, os diretórios podem ter entradas para os diretórios, é assim que a recursão é implementada (observe que quando os sistemas de arquivos Unix foram introduzidos, isso não era óbvio, muitos sistemas operacionais não permitiam que os diretórios contivessem diretórios de volta então)
  • essas entradas de diretório são chamadas de hardlinks
  • um link simbólico é outro tipo especial de arquivo, cujo conteúdo é um nome de caminho; esse nome do caminho é interpretado como o nome de outro arquivo
  • outros tipos de arquivos especiais são: soquetes, fifos, dispositivos de bloco, dispositivos de caracteres

Manter essa metáfora em mente e, especificamente, ter em mente que os diretórios Unix funcionam como diretórios do mundo real e não como pastas do mundo real explica muitas das "esquisitices" que os recém-chegados costumam encontrar, como: por que posso excluir um arquivo que não possuo? não tem acesso de gravação? Bem, por um lado, você não está excluindo o arquivo, está excluindo um dos muitos nomes possíveis para o arquivo e, para fazer isso, precisa apenas de acesso de gravação ao diretório, não ao arquivo. Assim como no mundo real.

Ou, por que posso ter links simbólicos pendentes? Bem, o link simbólico simplesmente contém um nome de caminho. Não há nada que diga que realmente precisa haver um arquivo com esse nome.

Minha pergunta é simplesmente qual é a diferença de um arquivo e um link físico?

A diferença entre um arquivo e um link físico é a mesma entre você e a linha com seu nome na lista telefônica.

O link físico está apontando para um inode, então o que é um arquivo? Entrada de inode em si? Ou um Inode com um link físico?

Um arquivo é um dado anônimo. É isso aí. Um arquivo não é um inode, um arquivo tem um inode, assim como você não é um Número de Seguro Social, você tem um SSN.

Um link físico é um nome para um arquivo. Um arquivo pode ter muitos nomes.

Digamos que eu crie um arquivo com toque, em seguida, uma entrada Inode é criada na Tabela Inode .

Sim.

E eu crio um link físico, que tem o mesmo número de Inode com o arquivo.

Não. Um link físico não possui um número de inode, pois não é um arquivo. Somente arquivos têm números de inode.

O hardlink associa um nome a um número de inode.

Então, eu criei um novo arquivo?

Sim.

Ou o arquivo é apenas definido como um Inode?

Não. O arquivo tem um inode, não é um inode.

Jörg W Mittag
fonte
15
Eu nunca tinha realmente entendido (ou pensado corretamente) qual metáfora estava por trás da palavra "diretório". O exemplo da lista telefônica é excelente; talvez você deva apresentá-lo mais cedo (quando mencionar o mundo real). Da mesma forma, a maioria das pessoas raramente lida com "arquivos" fora de um computador, então talvez seja mais claro dizer "exatamente como arquivos em papel e um diretório como uma lista telefônica".
IMSoP 21/02
2
@IMSoP É uma lacuna de geração. Antes dos computadores, uma lista telefônica era um dos tipos de diretório. O dicionário de Cambridge diz: " diretório: um livro que fornece uma lista de nomes, endereços ou outros fatos [...]] Procure seu número na lista telefônica. "
kubanczyk
2
@kubanczyk De fato - para as pessoas que trabalhavam em escritórios pré-digitais, acho que as metáforas parecem tão óbvias que parece quase condescendente explicá-las. Mas para aqueles da minha geração e abaixo, é tão obscuro quanto o motivo pelo qual a área de armazenamento na parte traseira do carro é chamada de "bota" ou "porta-malas", então você precisa realmente explicá-la.
IMSoP 22/02
A palavra "have" na frase "Um link físico não possui um número de inode" é possivelmente enganosa, porque você diz que "O link físico associa um nome a um número de inode". A estrutura de dados da entrada de diretório "hardlink" contém realmente o # inode - é assim que o link é "associado" ao # inode. Por "não tem", acho que você quer dizer que o hardlink não possui um inode # que indica onde o link está armazenado no disco.
22717 Kelvin
2
Dizer que um arquivo tem um inode é um pouco retroativo. O inode é a estrutura que contém as informações sobre onde está o "blob de dados". Se não houver inode, não há arquivo.
Barmar 22/02
18

Um link físico é uma entrada de diretório. Um arquivo pode ter várias entradas de diretório, se estiver presente com nomes diferentes ou em diretórios diferentes. Uma entrada de diretório é chamada de "link físico" quando é colocada em relação a outras entradas de diretório para o mesmo arquivo.

O inode contém outros metadados do arquivo, além do nome e do conteúdo (local do conteúdo, permissões, registros de data e hora, etc.). Há um inode por arquivo. (Nem todos os sistemas de arquivos colocam os metadados em um espaço claramente identificável no disco que você poderia chamar de "inode", mas é uma arquitetura comum.) Uma entrada de diretório vincula um nome a um inode. É possível que mais de uma entrada de diretório se vincule ao mesmo inode, daí o termo "link". Esse link é chamado de "hard link" por oposição a "soft links" ou "links simbólicos" que não dizem "para esse nome, use este inode", mas "para esse nome, procure esse outro nome".

Pense nos arquivos como salas e nas entradas do diretório como portas. "Abrir o arquivo /foo/bar" significa "ir para o corredor /fooe ir para o quarto bar". “Ir para o quarto bar” realmente significa “abrir a porta marcada bare entrar no quarto”, mas “ir para o quarto bar” é uma maneira normal de dizer a mesma coisa de maneira mais curta. É possível ter mais de uma porta que leva à mesma sala.

Ao criar um link físico para um arquivo existente ( ln existing new), você cria um segundo link para o mesmo arquivo, ou seja, está criando uma nova entrada de diretório que se vincula ao arquivo já existente. Após a criação, as duas entradas de diretório têm status igual: não há uma que seja "primária" e uma que seja "secundária", elas são apenas os dois links para o mesmo arquivo.

Você também pode remover todos os links para um arquivo sem remover o próprio arquivo. Isso acontece se você excluir um arquivo (ou seja, você remover todas as suas entradas de diretório) enquanto um programa ainda tiver o arquivo aberto. O arquivo permanece no sistema de arquivos, na verdade, é removido apenas quando o último processo que abriu o arquivo o fecha. Na metáfora da sala e portas, uma sala que não tem portas ainda ocupa espaço.

Gilles 'SO- parar de ser mau'
fonte
quando os hard links e soft links foram introduzidos pela primeira vez, respectivamente?
N611x007
2
@ n611x007: Você poderia abrir uma nova pergunta se tiver uma pergunta nova ou de acompanhamento? A seção de comentários não é adequada ou destinada a novas perguntas ou discussão prolongada. Obrigado.
David Foerster
1
@ n611x007 Os links físicos são mais antigos que o Unix, a v1 os possuía . Os links simbólicos no Unix são um pouco mais novos; A Wikipedia tem um pouco de história.
Gilles 'SO- stop be evil'
Salas e portas é uma ótima analogia! Os links simbólicos são como sinais para as portas.
curiousdannii
1
@curiousdannii: Os links simbólicos são mais como salas com uma pessoa sentada neles que diz "oi m8 office errado, vá para a posição # 234"
Lightness Races with Monica
8

Além de todas as outras respostas, quero destacar as seguintes propriedades importantes:

Um softlink é uma referência verdadeira, ou seja, é um arquivo pequeno que contém um nome de caminho. A resolução de um vínculo virtual acontece de maneira transparente com o aplicativo: se um processo abrir um arquivo, diga /this/path/herequal é um link simbólico apontando para /that/other/path, todo o tratamento da abertura /that/other/pathé feito pelo sistema operacional. Além disso, se /that/other/pathfor um link simbólico, isso também está sendo tratado pelo sistema operacional. De fato, o sistema operacional segue a cadeia de links simbólicos até encontrar outra coisa (por exemplo, um arquivo comum) ou até atingir SYMLOOP_MAX(ver sysconf(3)) muitas entradas; nesse caso, o sistema operacional (mais precisamente: a chamada do sistema) retorna um erro e define errnopara ELOOP. Assim, uma referência circular como xyz -> xyznão irá parar o processo. (Para sistemas Linux, veja path_resolution(7)detalhes completos.)

Observe que um processo pode verificar se um nome de caminho é um link simbólico ou não através do uso de lstat(2)e pode modificar seus atributos de arquivo (armazenados na tabela de inodes) por meio de lchown(2)outros (veja symlink(7)a história completa).

Agora, em termos de permissão, você notará que os links simbólicos sempre têm permissões 777 ( rwxrwxrwxem notação simbólica). Isso se deve ao fato de que qualquer outra permissão pode ser ignorada acessando o arquivo real, de qualquer maneira. Por outro lado, o 777 para um link simbólico não torna o arquivo vinculado acessível se não estiver acessível em primeiro lugar. Por exemplo, um link simbólico com permissões 777 apontando para um arquivo com permissões 640 não torna o arquivo acessível para "outro" (público em geral). Em outras palavras, um arquivo pode xyzser acessado através de um link simbólico, se e somente se estiver diretamente acessível, ou seja, sem indicação indireta. Portanto, as permissões do link simbólico não têm nenhum efeito de segurança.

Uma das principais diferenças visíveis entre links físicos e links simbólicos (também conhecidos como links flexíveis) é que os links simbólicos funcionam nos sistemas de arquivos, enquanto os links físicos estão confinados a um sistema de arquivos. Ou seja, um arquivo na partição A pode ser vinculado a partir da partição B, mas não pode ser vinculado a partir daí. Isso fica claro pelo fato de que um hardlink é realmente uma entrada em um diretório, que consiste em um nome de arquivo e um número de inode, e que os números de inode são exclusivos apenas por sistema de arquivos.

O termo hardlink é realmente um tanto enganador. Embora a origem e o destino dos links simbólicos sejam claramente distinguíveis (o link simbólico tem sua própria entrada na tabela de inodes), isso não é verdade para os links físicos. Se você criar um hardlink para um arquivo, a entrada original e o hardlink serão indistinguíveis em termos do que estava lá primeiro. (Como eles se referem ao mesmo inode, eles compartilham seus atributos de arquivo, como proprietário, permissões, carimbos de data e hora, etc.) Isso leva à afirmação de que toda entrada de diretório é na verdade um link físico e que vincular um arquivo significa apenas criar um segundo ( ou terceiro ou quarto ...) hardlink. De fato, cada inode armazena um contador para o número de hardlinks para esse inode.

Por fim, observe que usuários comuns podem não vincular diretórios. Isso ocorre porque isso deve ser feito com extrema cautela: um usuário incauto pode introduzir ciclos na árvore de arquivos estritamente hierárquica, com a qual todas as ferramentas usuais (como fsck) e o próprio sistema operacional não estão preparados para lidar.

contra-modo
fonte
6

Uma resposta simples:

  • Uma entrada de arquivo em um diretório é um link físico para esse arquivo.

  • Alguns arquivos têm mais de um link físico, pois vários links físicos para o mesmo arquivo são permitidos.

Andrew Henle
fonte
3

Nos primeiros dias do Unix, os arquivos internamente eram inodes em uma unidade de disco específica. Os nomes dos arquivos eram uma maneira mais amigável de acessá-los.

Um link físico estava atribuindo mais de um nome de arquivo a um inode. Você pode criar um arquivo, vincular um segundo nome a ele e excluir o primeiro nome e era indistinguível de simplesmente criar o arquivo com o segundo nome em primeiro lugar.

De fato, a chamada do sistema que um programa precisa usar para excluir um arquivo é 'unlink (2) `. Os dados não desaparecem até que o sobrenome seja desvinculado do inode. (e o inode não é aberto por um processo em algum lugar)

É isso que torna mais fácil para o Linux atualizar as coisas enquanto ainda executa os programas. Se um processo estiver executando um executável e ocorrer uma atualização, o nome do programa será reutilizado, mas o inode que contém a versão antiga ainda existe para que possa continuar em execução. E quando o último processo executando essa versão antiga é interrompido, esse armazenamento da versão antiga é liberado.

Os links flexíveis surgiram porque, quando você tem uma árvore de arquivos unitária, com vários pontos de montagem, não era possível criar um link físico de um disco rígido para um inode em outro. Então, os links flexíveis foram inventados.

infixado
fonte
Eu acho que isso é uma duplicata do unix.stackexchange.com/questions/9575/…
infixado em
2
early dayspor que está diferente agora? sua resposta parece não refletir essa visão?
N611x007
@ n611x007 Porque 'hoje em dia' coisas como o Linux podem montar sistemas de arquivos não-unix que não se encaixam no modelo de inode. Como derivados FAT e ISO-9660, por exemplo. É uma ecologia de sistema de arquivos muito mais diversificada, em vez de um tamanho único
infixado em
1

Um arquivo são os dados gravados no disco. Esses dados são referenciados por seu inode, que contém metadados sobre o arquivo informando ao sistema quais blocos no disco são usados ​​por esse arquivo, entre outras coisas. Um link físico aponta para o número de inode desse arquivo.

Portanto, tecnicamente, sim, você está criando um novo arquivo, mas todo esse arquivo contém é o número do inode do arquivo que ele faz referência e o nome. É melhor pensar nisso como criar um ponteiro para o inode ou um ponteiro para o arquivo.

user151768
fonte
1

Arquivo é um conceito amplamente usado sobre entradas em um sistema de arquivos.

Geralmente inclui Diretório , Arquivo Regular (link físico) e Link Simbólico (link virtual). E pode até incluir dispositivo e soquete.

Minha pergunta é simplesmente qual é a diferença de um arquivo e um link físico? O link físico está apontando para um inode, então o que é um arquivo? Entrada de inode em si? Ou um Inode com um link físico?

Digamos que eu crie um arquivo com toque e, em seguida, uma entrada Inode é criada na Tabela Inode. E eu crio um link físico, que tem o mesmo número de Inode com o arquivo. Então, eu criei um novo arquivo? Ou o arquivo é apenas definido como um Inode?

Como até mesmo o link simbólico é normalmente contado como arquivo, um link físico também pode ser contado como um arquivo. Você pode dizer que é um arquivo, independentemente de ser um link físico ou físico.

O conceito é um pouco ambíguo, portanto, também é bom dizer que uma entrada de inode é um arquivo, embora você possa realmente querer se referir aos dados.

Se você é um programador C ++ ou Java, pode ler sobre std :: filesystem :: file_type , java.io.File e java.nio.file.Files .

Detalhes sobre as diferenças entre o link físico e o link virtual podem ser encontrados no link no comentário do infixed.

cshu
fonte
1

A diferença entre um "arquivo" com um nome determinado e um "link físico" é histórica. Um arquivo (regular) com um determinado nome é criado usando uma chamada do sistema de criação, um link físico é criado usando uma chamada do sistema de link.

No entanto, enquanto os humanos falam e se lembram do histórico de entradas de diretório e os chamam de arquivos e links físicos de acordo, o sistema de arquivos não. As entradas de diretório de "arquivo original" e "link físico" são totalmente indistinguíveis em qualidade: ambas estabelecem uma referência entre um nome de arquivo e o inode de um arquivo e depois que a última referência se for (as referências não são apenas nomes de arquivos para um arquivo, mas também descritores de arquivo com os quais um arquivo aberto pode ser acessado), o arquivo para o inode não referenciado é considerado excluído e o inode e o espaço no arquivo associado são recuperados.

Então, quando os humanos contrastam "arquivos" e "links físicos", o primeiro surgiu com uma "contagem de links de 1", e todos os outros passaram a existir com uma contagem maior de links. A diferença é acadêmica e, na verdade, renomear um arquivo ao mesmo tempo consistiu em criar um link físico para o nome de destino e remover o link para o nome de origem. Atualmente, geralmente é usada uma única chamada do sistema que faz isso atomicamente.

user217420
fonte