De que é feito um link simbólico? Entendendo a estrutura dos links simbólicos

5

Eu uso o Ubuntu 15.10 e sou muito novo no Linux. Depois de ler na Wikipédia o que é um link simbólico em geral , e depois de executar um comando de criação de link simbólico no terminal Ubuntu Unix-bash , Eu deveria entender melhor a estrutura de um symlink com o qual trabalhei várias vezes ao criar (e "destruir") ambientes de aprendizado do Ubuntu.

Existe uma sintaxe curta que eu corri cada vez ao instalar um serviço PHPmyadmin (PMA). Sem executá-lo, o serviço simplesmente não funcionou. A partir das informações que eu reuni, esta sintaxe a seguir cria um link simbólico que conecta o Apache a um determinado arquivo PMA que inclui instruções de conf.

Esta é a sintaxe que eu corri cada vez:

cd /etc/apache2/conf-enabled/
sudo ln -s /etc/phpmyadmin/apache.conf phpmyadmin.conf
service apache2 restart

Eu quero entender melhor o que realmente está sendo feito aqui, por exemplo:

  1. Por que o CD de navegação é necessário? Não foi possível especificar quais arquivos queremos trabalhar na pasta raiz (computador) e pronto?

  2. Por que o -s depois do ln?

  3. Eu naveguei para os dois diretórios no comando ln, mas não consegui encontrar o phpmyadmin.conf em nenhum deles - Então, como o sistema pode saber onde está (supondo que não há uma pesquisa em todo o sistema para ele? ).

por JohnDoea 31.12.2015 / 21:08

5 respostas

6
  1. O comando ln cria o symlink no diretório atual se nenhum diretório for especificado. Assim, phpmyadmin.conf é colocado em /etc/apache2/conf-enabled/ . Você também poderia ter feito

    ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf-enabled/phpmyadmin.conf
    

    Este é um comportamento padrão para praticamente todos os comandos Unix.

  2. A opção -s especifica que você está criando um link soft em oposição a um hard link . Leia mais aqui.

  3. Eu não entendo muito bem a questão ("como o sistema pode saber onde está?"). phpmyadmin.conf é criado no diretório atual (neste caso, /etc/apache2/conf-enabled/ ).

por 31.12.2015 / 22:07
7

links simbólicos

Referências autodereferenciadas a nomes de arquivos

Um link simbólico é literalmente um arquivo de texto tratado especialmente pelo kernel e cujo conteúdo é um caminho para outro arquivo / diretório.

Você pode ler o conteúdo de um arquivo de link simbólico com readlink e, se abrir um arquivo de link simbólico, o sistema abrirá o arquivo / diretório referenciado pelo conteúdo do link simbólico.

Analogia de referência de ponteiro / C ++

Se você estiver familiarizado com C / C ++, um link simbólico se comportará como uma referência C ++ ou um ponteiro autodereferenciado na maioria dos contextos (não todos: por exemplo, rm ou mv funcionar diretamente no symlink, não em o alvo). A diferença é que referências reais em C ++ são vinculadas a endereços de memória, enquanto links simbólicos se ligam a endereços de sistemas de arquivos.

Links simbólicos pendentes

O conteúdo de um link simbólico não precisa ser uma referência de caminho de campo válida - > então você tem um link simbólico pendente (como ponteiro danglig ou uma referência pendente).

links simbólicos relativos

Se o caminho de arquivo em um link simbólico não é absoluto (começando com / ), então o caminho de arquivo relativo é resolvido relativamente ao local do symlink (em contextos não-symlink, caminhos relativos são resolvidos em relação ao $PWD ).

O sinalizador -s e os links de hardware

O -s flag é para "criar s ymlinks". ln também pode criar hardlinks . Os hardlinks operam em outro nível, que é mais próximo da implementação do sistema de arquivos (consequentemente, você não pode criar hardlinks em diferentes sistemas de arquivos).

Sistemas de arquivos Unix armazenam nomes de arquivos (/ nomes de diretórios) e conteúdo de arquivos (conteúdo do diretório) separadamente, e os nomes são apenas ponteiros contados de referência autodereferenciados para seus conteúdos. Um hardlink cria outro nome para o mesmo conteúdo enquanto aumenta a contagem de referência.

$ echo 'the contents' > f1
$ ls -l f1 
  * 1 * #the 2nd column is the reference count
$ ln f1 f2 #create another name for the contents of f1
$ ls -l f1
   * 2 * #the contents of f1 has two named references to it
$ rm f1  #the contents of f1 lives on (in f2) #
         # because rm only removes the reference to the data block
         #and this isn't the only reference
         #(rm ivokes a system call literally named 'unlink')

Hardlinks de diretório

Você não pode criar hardlinks de diretório, mas . e .. são hardlinks de diretório criados implicitamente para você. Consequentemente, a contagem do hardlink para um diretório reflete quantos subdiretórios ele possui (cada subdiretório vem com um% hard_de% hardlink para o pai).

Links simbólicos e links de hardware - Visão geral de fotos grandes:

echo 'file data' > fileName 
ln fileName fileName2 #hardlink
ln -s "$PWD/fileName" absoluteSymlinkTofileName 
ln -s fileName relativeSymlinkTofileName 

No mesmo sistema de arquivos físico, .. cria outro nome para ln ( file data falhará nos sistemas de arquivos). Você pode excluir ln ou fileName e, enquanto pelo menos um nome permanecer, fileName2 continuará ativo.

file data é uma referência autodereferenciada ao nome absoluteSymlikTofileName . Contanto que esse caminho seja resolvido para algo, o link simbólico é válido. Se você excluir o alvo, o link simbólico ficará suspenso. Este é um symlink absoluto para que você possa movê-lo para outros lugares sem alterar sua validade.

fileName refere-se a um nome chamado relativeSymlinkToFileName no mesmo diretório que o diretório fileName . Se você movê-lo para outro diretório que também tenha um arquivo (ou diretório) chamado relativeSymlinkToFileName , então ele apontará para isso.

    
por 31.12.2015 / 23:49
3
ln -s /etc/phpmyadmin/apache.conf phpmyadmin.conf

3. Esse comando cria um link simbólico no local /etc/apache2/conf-enabled/phpmyadmin.conf , cujo destino é /etc/phpmyadmin/apache.conf . Depois disso, abrir o arquivo /etc/apache2/conf-enabled/phpmyadmin.conf é equivalente a abrir /etc/phpmyadmin/apache.conf . Se /etc/phpmyadmin/apache.conf existir, então /etc/apache2/conf-enabled/phpmyadmin.conf terá o mesmo conteúdo. Se /etc/phpmyadmin/apache.conf não existir, a abertura /etc/apache2/conf-enabled/phpmyadmin.conf falhará, como se /etc/apache2/conf-enabled/phpmyadmin.conf não existisse.

Um link simbólico é apenas texto. O link em si continua existindo e apontando para o mesmo alvo, independentemente de o alvo existir ou não. Isso permite, por exemplo, links simbólicos para unidades removíveis continuarem existindo se a unidade está presente ou não, ou substituindo um arquivo que um link simbólico aponta para (o fato de que o alvo pode temporariamente parar de existir não afeta o simbólico ligação). Quando o alvo não existe, diz-se que o link simbólico está quebrado

1. O link poderia ter sido criado sem alterar o diretório atual. Claro que o comando teria que ser alterado para incluir o caminho completo para o link desejado.

ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf-enabled/phpmyadmin.conf

Quando o link simbólico é absoluto (ou seja, seu destino é um caminho absoluto), não há vantagem em mudar para o diretório antes de criar o link. Quando um link simbólico é relativo, há uma vantagem, porque o primeiro argumento para ln -s é o destino do link e é interpretado em relação ao local do link, não ao diretório atual no momento em que o ln comando é executado. Por exemplo, um link relativo poderia ter sido feito assim:

ln -s ../../phpmyadmin/apache.conf /etc/apache2/conf-enabled/phpmyadmin.conf

Mas se o diretório atual não for /etc/apache2 , em geral, ../../ não será /etc , então ../../phpmyadmin/apache.conf não será um destino existente; por exemplo, ele não será selecionado pela conclusão do shell.

2. O comando ln existia antes dos links simbólicos. Originalmente, criou links físicos , que têm um caso de uso significativamente mais restrito, por isso não são muito usados. Embora ln -s seja usado com mais frequência que ln , o significado de ln simples não pode ser alterado porque isso quebraria a compatibilidade com versões anteriores.

    
por 31.12.2015 / 22:35
2

Um sistema de arquivos em qualquer sistema operacional é apenas uma estrutura de dados que reside no disco (ou alguma outra mídia que pode ser dividida em "blocos" de tamanho fixo). Ou seja, uma maneira de gravar em blocos como os arquivos são nomeados, talvez alguns outros dados, como proprietário e permissões, e onde o conteúdo deles reside no disco.

Em sistemas de arquivos Unix / Linux, um arquivo é representado por um bloco contendo informações sobre tamanho, proprietário, grupo, permissões e (essencialmente) uma lista de blocos contendo os dados reais. Os sistemas de arquivos tradicionais contêm um número fixo desses inodes, para o qual uma parte do disco é reservada. Eles são apenas numerados de 0 para cima. Um diretório em um sistema de arquivos é implementado como um arquivo que contém uma lista de pares (nome do arquivo, número do inode).

Com essa estrutura, você pode ter o mesmo arquivo aparecendo várias vezes sob nomes diferentes (o inode registra o número de referências). "Excluir um arquivo" é, então, marcar a entrada no diretório como não usada de alguma forma e diminuir a contagem de referências no inode. Se a contagem de referência for zerada, o espaço usado pelo arquivo (inode, blocos usados para dados e ponteiros para blocos de dados) pode ser recuperado. "Renomear um arquivo" altera a entrada no diretório, "mover um arquivo" é apenas excluir uma entrada de diretório e criar outra.

Criar um "link físico" ( ln old new ) para um arquivo é apenas gravar o mesmo número de inode de old em ǹew . Note que após esta operação ambas as entradas de diretório são exatamente equivalentes . Observe também que isso só funcionará dentro do mesmo sistema de arquivos, ou seja, no mesmo disco. Para superar essa restrição, links simbólicos onde foi inventado. Um link simbólico é essencialmente um arquivo minúsculo que contém o nome da entidade vinculada a. Isso é criado por ln -s old new . Observe que old poderia desaparecer, deixando new como um link obsoleto.

O acima é um pouco simplificado, alguns sistemas de arquivos modernos são estruturados de forma diferente; mas eles têm que se comportar como se eles estivessem estruturados como descrito, porque a maneira como os arquivos e diretórios funcionam está muito arraigada no Unix para mudar (muito).

    
por 31.12.2015 / 23:28
1
  1. O comando cd é, na verdade, opcional; isso apenas torna a sintaxe real do comando ln subsequente um pouco mais simples.
  2. A opção -s de ln instrui a criação de um link simbólico em vez de um link físico. Existem várias diferenças entre os dois tipos de links, mas basta dizer que um link simbólico é essencialmente um marcador no sistema de arquivos dizendo "o arquivo que você está procurando está realmente aqui ."
  3. Você pode criar um link para um destino que, na verdade, não existe; isso geralmente é chamado de link "órfão".
por 31.12.2015 / 23:01