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

35

Um hard link é definido como um ponteiro para um inode. Um link soft , também conhecido como link simbólico , é definido como um arquivo independente apontando para outro link sem as restrições de hard links.

Qual é a diferença entre um arquivo e um link físico? Um link físico 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 acabou de ser definido como um inode?

    
por Levent Divilioglu 20.02.2017 / 23:36

8 respostas

61

A resposta muito curta é:

  • um arquivo é um blob anônimo de dados
  • 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 anônimo de dados; não tem 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, diretórios podem ter entradas para diretórios, é assim que a recursão é implementada (note que quando sistemas de arquivos Unix foram introduzidos, isso não era óbvio, muitos sistemas operacionais não t permitir diretórios para conter diretórios naquela época)
  • essas entradas de diretório são chamadas hardlinks
  • um link simbólico é outro tipo especial de arquivo, cujo conteúdo é um nome de caminho; este nome de caminho é interpretado como o nome de outro arquivo
  • outros tipos de arquivos especiais são: sockets, fifos, dispositivos de bloco, dispositivos de caractere

Mantendo esta metáfora em mente, e especificamente tendo 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 encontram, : por que posso excluir um arquivo para o qual não tenho acesso de gravação? Bem, por um lado, você não está excluindo o arquivo, você está excluindo um dos muitos nomes possíveis para o arquivo e, para fazer isso, você só precisa de acesso de gravação para o diretório, não o 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 tem que haver um arquivo com esse nome.

My question is simply what is the difference of a file and a hard link ?

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

Hard link is pointing to an inode, so what is a file ? Inode entry itself ? Or an Inode with a hard link ?

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 Social Security Number, você tem um SSN.

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

Let's say, I create a file with touch, then an Inode entry is created in the Inode Table.

Sim.

And I create a hard link, which has the same Inode number with the file.

Não. Um link físico não possui um número de inode, já que não é um arquivo. Apenas arquivos possuem números de inodes.

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

So did I create a new file ?

Sim.

Or the file is just defined as an Inode ?

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

    
por 21.02.2017 / 11:24
18

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

O inode contém os metadados do arquivo, além de seu nome e conteúdo (localização do conteúdo, permissões, 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 seja vinculada ao mesmo inode, daí o termo “link”. Tal link é chamado de “hard link” por oposição a “soft links” ou “links simbólicos” que não dizem “para este nome, use este inode” mas “para este nome, procure aquele outro nome”. / p>

Pense nos arquivos como entradas de salas e diretórios como portas. “Abra o arquivo /foo/bar ” significa “vá para o corredor /foo e vá para a sala bar ”. “Ir para a sala bar ” realmente significa “abrir a porta marcada com bar e entrar na sala”, mas “ir para a sala bar ” é uma maneira nada notável de dizer a mesma coisa de maneira mais curta. É possível ter mais de uma porta para o mesmo quarto.

Quando você cria um link físico para um arquivo existente ( ln existing new ), está criando um segundo link para o mesmo arquivo, ou seja, você está criando uma nova entrada de diretório vinculada 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 arquivo em si. Isso acontece se você excluir um arquivo (ou seja, remover todas as entradas do diretório) enquanto um programa ainda tiver o arquivo aberto. O arquivo permanece no sistema de arquivos, ele só é removido quando o último processo que tinha o arquivo aberto o fecha. Na metáfora de quarto e portas, uma sala que não tem portas ainda ocupa espaço.

    
por 21.02.2017 / 01:55
8

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

Um softlink é uma referência verdadeira, ou seja, é um pequeno arquivo que contém um nome de caminho. Resolver um softlink acontece de forma transparente para o aplicativo: se um processo abrir um arquivo, digamos /this/path/here , que é um link simbólico apontando para /that/other/path , então todo o tratamento da abertura /that/other/path é feito pelo sistema operacional. Além disso, se /that/other/path for um link simbólico, então isso também está sendo tratado pelo sistema operacional. Na verdade, o sistema operacional segue a cadeia de links simbólicos até encontrar algo diferente (por exemplo, um arquivo regular) ou até alcançar SYMLOOP_MAX (ver sysconf(3) ) muitas entradas, nesse caso, o sistema operacional (mais precisamente: ) retorna um erro e define errno para ELOOP . Assim, uma referência circular como xyz -> xyz não irá parar o processo. (Para sistemas Linux, consulte path_resolution(7) para detalhes completos.)

Note 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 inode) através de lchown(2) e outros (veja symlink(7) para o toda a história.)

Agora, em termos de permissão, você notará que os links simbólicos sempre têm permissões 777 ( rwxrwxrwx na notação simbólica). Isto é devido ao fato de que quaisquer outras permissões podem ser ignoradas, acessando o arquivo real, de qualquer maneira. Por outro lado, o 777 para um link simbólico não torna o arquivo simbolizado acessível se não estivesse 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" (o público em geral). Em outras palavras, um arquivo xyz é acessível através de um link simbólico se, e somente se, estiver diretamente acessível, ou seja, sem indireção. Assim, as permissões do link simbólico não têm nenhum efeito de segurança.

Uma das principais diferenças visíveis entre hardlinks e links simbólicos (por exemplo, softlinks) é que os links simbólicos funcionam nos sistemas de arquivos enquanto os hardlinks estão confinados a um sistema de arquivos. Ou seja, um arquivo na partição A pode ser vinculado de forma simbólica a partir da partição B, mas não pode ser vinculado a partir dele. Isso fica claro pelo fato de que um hardlink é, na verdade, 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 é na verdade um pouco enganador. Enquanto que para symlinks source e destination são claramente distinguíveis (o symlink tem sua própria entrada na tabela de inode), isso não é verdade para hardlinks. Se você criar um link físico para um arquivo, a entrada original e o link físico são indistinguíveis em termos do que havia antes. (Como eles se referem ao mesmo inode, eles compartilham seus atributos de arquivo como proprietário, permissões, timestamps etc.) Isso leva à afirmação de que toda entrada de diretório é realmente um hardlink, e que criar 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 a máxima cautela: um usuário incauto pode introduzir ciclos na árvore de arquivos que, de outra forma, seria estritamente hierárquica, e todas as ferramentas usuais (como fsck ) e o próprio SO não estão preparados para lidar.

    
por 21.02.2017 / 14:34
6

Uma resposta simples:

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

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

por 21.02.2017 / 12:43
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ê poderia criar um arquivo, vincular um segundo nome a ele e excluir o primeiro nome, e seria indistinguível por simplesmente ter feito o arquivo com o segundo nome em primeiro lugar.

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

Isto é o 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 uma atualização ocorrer, o nome do programa será reutilizado, mas o inode que contém a versão antiga ainda existirá para continuar em execução. E quando o último processo que executa a versão anterior parar, o armazenamento da versão antiga é liberado.

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

    
por 21.02.2017 / 00:02
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 que informa ao sistema quais blocos do disco são usados por esse arquivo, entre outras coisas. Um link físico aponta para o número de inode deste arquivo.

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

    
por 21.02.2017 / 00:54
1

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

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

My question is simply what is the difference of a file and a hard link ? Hard link is pointing to an inode, so what is a file ? Inode entry itself ? Or an Inode with a hard link ?

Let's say, I create a file with touch, then an Inode entry is created in the Inode Table. And I create a hard link, which has the same Inode number with the file. So did I create a new file ? Or the file is just defined as an Inode ?

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

O conceito é um pouco ambíguo, por isso não há problema em dizer que uma entrada de inode é um arquivo, embora você realmente queira se referir aos dados.

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

Detalhes sobre as diferenças entre hard link e soft link podem ser encontrados no link no comentário do infixed.

    
por 21.02.2017 / 01:44
1

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

No entanto, enquanto os humanos falam e lembram o histórico de entradas de diretório e os chamam de arquivos e links físicos adequadamente, 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 uma vez que a última referência se foi (referências não são apenas nomes de arquivo para um arquivo, mas também descritores de arquivo com o qual um arquivo aberto pode ser acessado), o arquivo para o inode não referenciado é considerado excluído e o inode e o espaço de arquivo associado são recuperados.

Portanto, quando os humanos contrastam "arquivos" e "hard links", o primeiro surgiu com uma "contagem de links de 1" e todos os outros surgiram com uma contagem maior de links. A diferença é acadêmica e, de fato, a renomeação de um arquivo de uma só vez consistia em criar um link físico para o nome de destino e, em seguida, remover o link para o nome de origem. Atualmente, geralmente é usada uma única chamada de sistema que faz isso atomicamente.

    
por 22.02.2017 / 14:43