ln -s vs mount --bind

26

Estou tentando entender a diferença entre usar ln -s e mount --bind . No cenário básico, posso usar ambos para acessar um diretório de outro lugar. Em quais cenários os dois se comportarão de maneira diferente?

    
por Łukasz 07.12.2014 / 17:06

4 respostas

28

Eles se comportarão de maneira diferente em pelo menos dois casos:

  • Em um chroot , se o destino do link estiver fora do chroot, o link estará morto. Uma montagem de ligação ainda estará acessível.
  • Vários programas podem distinguir entre links simbólicos e diretórios ou arquivos reais. Poucos (se houver) podem distinguir entre um diretório ou arquivo e aquele montado nele. Isso também se estende a links simbólicos para algo ( A ) que tem algo a mais ( B ) montado neles. O link mostrará o conteúdo do destino de montagem ( B ) em vez do original ( A ).

Além disso, você pode vincular a montagem de um diretório ou arquivo em um diretório ou arquivo existente, mascarando o conteúdo original (tornando o conteúdo original inacessível, a menos que o original tenha sido montado em outro lugar). Um link simbólico exige que o original seja movido ou excluído.

    
por muru 07.12.2014 / 17:09
11

Bem, ln -s cria um link simbólico, enquanto mount --bind cria uma montagem.

Um link simbólico é um tipo especial de arquivo. Se você fizer ln -s /var/target /var/link , então /var/link será um arquivo contendo o caminho " /var/target ". A única diferença entre um link simbólico e um arquivo comum é que quando um programa tenta executar uma operação em um link simbólico, a operação é geralmente executada no destino em vez do arquivo. Portanto, se você usar ls /var/link , o programa ls tentará obter uma listagem de diretórios para /var/link , mas, na verdade, obterá uma listagem de diretórios para /var/target .

Links simbólicos ainda são apenas arquivos, no entanto. Eles podem ser renomeados e excluídos e todo esse jazz. Observe que você não pode criar um link simbólico (ou um arquivo comum, para esse assunto) chamado /var/link se já houver um arquivo chamado /var/link ; você precisa se livrar dele primeiro.

Uma montagem não é um arquivo; é um registro que o kernel mantém na memória. Se você fizer mount --bind /var/target /var/mount , o kernel registrará o fato de que /var/mount agora é um novo nome para /var/target . (Eu não sei os detalhes; em particular, eu não sei se montar algo em um subdiretório de /var/target fará com que ele apareça em /var/mount também, ou por que ou por que não. ser apreciado.) Então agora, se você fizer ls /var/mount , a mesma coisa acontecerá como se você tivesse ls /var/target , porque /var/mount e /var/target são o mesmo diretório.

As montagens não são arquivos. Não sei o que aconteceria se você tentasse renomear ou excluir /var/mount . Note que você não pode montar nada em /var/mount a menos que já exista um diretório em /var/mount .

    
por Tanner Swett 08.12.2014 / 03:54
9

Além disso, ln -s sobreviveria a uma reinicialização; enquanto o mount -bind não, a menos que você edite o / etc / fstab para torná-lo persistente.

    
por Mark Williams 08.12.2014 / 09:20
2

Além das outras respostas. O sistema não permite link físico para o diretório:

# ln mydir mpoint
ln: 'mydir': hard link not allowed for directory

A montagem permite que você faça hard-like ou seja, dois ou mais nomes para o mesmo um inode :

# mount -B mydir/ mpoint/
# ls -d -i *
807175  mpoint/  807175  mydir/

(É possível encontrar ajuda para o backup de instantâneo com a versão antiga do rsync.)

Além disso, observe que essa montagem não está completa:

# mount -B -oro mydir/ mpoint/
mount: warning: mpoint/ seems to be mounted read-write.
# mount | grep mpoint
/root/learn/mydir on /root/learn/mpoint type none (rw,bind)

Então, a montagem ainda é lida e escrita mesmo se eu pedisse a opção ro (somente leitura).

    
por Udi 08.12.2014 / 13:11