Arquivos com dados diferentes podem ser vinculados?

2

Sou um novo usuário de Linux aprendendo com o Arch Linux e recentemente com o Linux From Scratch (7.7). Eu configurei uma nova instalação de AL para ser meu host LFS; Eu manualmente (e também com o script bash ) verificado nos pacotes de pré-requisitos no meu host. No meu caso, estou confiante de que resolvi todas as discrepâncias, exceto para vincular / usr / bin / yacc a / usr / bin / bison.

O script fornecido resulta em yacc is bison (GNU Bison) 3.0.4 , em oposição a /usr/bin/yacc -> /usr/bin/bison . Como o último era o formato de saída dos links simbólicos verificados, presumi que o script estava me dizendo que o yacc está preparado, mas usando um tipo diferente de link. Eu investiguei mais sobre os sistemas de arquivos Linux e tirei uma compreensão superficial de que os dados reais são descritos por inodes (metadados), que são, por sua vez, apontados pelos arquivos (abstratos) com os quais interagimos. Arquivos que simplesmente apontam para o mesmo inode são considerados hard links (embora, eu acho que os arquivos sejam independentes uns dos outros). Eu corri sudo ls -il /usr/bin | less e achei yacc e bison tinham números de inodes levemente diferentes (152077 e 152078, respectivamente). Isso significa que eles não estão vinculados, ou estou interpretando mal a saída do script e exigem uma correção?

Editar: comandos relevantes do script bash:

bison --version | head -n1

if [ -h /usr/bin/yacc ]; then
  echo "/usr/bin/yacc -> 'readlink -f /usr/bin/yacc'";
elif [ -x /usr/bin/yacc ]; then
  echo yacc is '/usr/bin/yacc --version | head -n1'
else
  echo "yacc not found" 
fi
    
por Polite Master 02.08.2015 / 15:43

2 respostas

2

Quando você fez o ls -il /usr/bin , você estava listando nomes de arquivos e números de inodes correspondentes. Neste contexto, é provavelmente melhor pensar em "file name" como separado de "inode", e pensar no inode como o arquivo.

O "inode" é tipicamente uma estrutura de dados em disco contendo metadados (permissons, propriedade, tempo de criação, tempo de acesso, etc) e os blocos de disco que contêm os dados do arquivo. Dependendo do sistema de arquivos, os inodes podem ser localizados estrategicamente em torno do disco ou podem ser armazenados em um banco de dados de vários tipos. Na maioria das vezes, há um algoritmo rápido para ir do número de inode para o bloco de disco no qual o inode está, de modo que a pesquisa seja bastante rápida.

Deste ponto de vista, todo nome de arquivo é apenas um "link físico". Um diretório apenas combina nomes de arquivos e números de inode. Nenhuma distinção é feita entre um "nome de arquivo real" e um "link físico". Portanto, os nomes de arquivos /usr/bin/yacc e /usr/bin/bison são correspondidos a diferentes números de inode, o que significa que esses dois nomes se referem a metadados diferentes e dados de arquivos diferentes. Falando casualmente, os arquivos não são hard links no sentido de que apenas um nome de arquivo corresponde a cada um dos inodes, mas a partir de um sentido técnico, ambos os nomes de arquivos são hard links, cada um deles é o único link rígido para o inode.

No que diz respeito ao seu script e aos "números de inode quase idênticos", yacc e bison estão relacionados. No meu laptop Arch:

1032 % ls -li /usr/bin/yacc /usr/bin/bison
1215098 -rwxr-xr-x 1 root root 394152 Jan 23  2015 /usr/bin/bison*
1215097 -rwxr-xr-x 1 root root     41 Jan 23  2015 /usr/bin/yacc*
1033 % file /usr/bin/yacc
/usr/bin/yacc: POSIX shell script, ASCII text executable
1034 % cat /usr/bin/yacc
#! /bin/sh
exec '/usr/bin/bison' -y "$@"

Os nomes dos arquivos yacc e bison identificam os números de inodes separados apenas um, provavelmente porque foram criados um após o outro. O nome do arquivo para yacc não representa um link simbólico ou um link físico. Um link simbólico apareceria de forma diferente no ls -li output, dois links físicos representariam o mesmo número de inode.

Mas yacc está relacionado a bison , pois é um script de shell que invoca bison . É por isso que seu script fornece uma saída como:

bison (GNU Bison) 3.0.4
yacc is bison (GNU Bison) 3.0.4

Seu script invoca /usr/bin/yacc , que na verdade apenas executa /usr/bin/bison .

    
por 02.08.2015 / 16:15
0

Se dois arquivos tiverem números de inode diferentes, eles não serão vinculados. Essa é a definição de hard links - é o mesmo arquivo (os mesmos metadados incluindo o número do inode) em locais diferentes no sistema de arquivos (nomes diferentes ou diretórios diferentes).

Bison é uma implementação do yacc. Mais precisamente, bison -y emula um POSIX yacc . Você pode ter uma implementação diferente do yacc como /usr/bin/yacc . No seu caso, parece que você instalou o Bison duas vezes, uma vez como /usr/bin/yacc e uma vez como /usr/bin/bison . Eles podem ou não ter sido construídos da mesma maneira. Verifique seus scripts de construção.

Em dash, ksh ou bash, você pode usar [ /usr/bin/yacc -ef /usr/bin/bison ] para testar se /usr/bin/yacc e /usr/bin/bison são o mesmo arquivo (ou seja, cadeias de links simbólicos (possivelmente de comprimento 0) levando a hard links de o mesmo arquivo).

    
por 02.08.2015 / 21:25