Qual é a diferença entre ln -s e mount --bind?

36

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

Łukasz
fonte
7
Eu deveria alertar contra rm -ra mount --bind. Com a ln, ele remove o link, enquanto que para a --bind, ele tem o mesmo efeito que a execução rm -rno destino. Não é bom, como eu encontrei pouco antes de reconstruir um dos meus servidores ...
Mark K Cowan
@ MarkKCowan isso é verdade, a menos que você tenha criado um link físico .
JohnnyQ
@JohnnyQ Não é possível vincular diretórios
Mark K Cowan

Respostas:

33

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 mais ( B) montado neles. O link mostrará o conteúdo da montagem target ( B) em vez do original ( A).

Além disso, você pode montar 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 requer que o original seja movido ou excluído.

muru
fonte
16

Bem, ln -scria um link simbólico, enquanto mount --bindcria uma montagem.

Um link simbólico é um tipo especial de arquivo. Se você o fizer ln -s /var/target /var/link, /var/linkhaverá um arquivo contendo o caminho " /var/target" nele. 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, e não no arquivo. Portanto, agora, se o fizer ls /var/link, o lsprograma tentará obter uma listagem de diretórios /var/link, mas na verdade obterá uma listagem de diretórios /var/target.

Links simbólicos ainda são apenas arquivos. 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, nesse caso) chamado /var/linkse já houver um arquivo chamado /var/link; você precisaria se livrar dele primeiro.

Uma montagem não é um arquivo; é um registro que o kernel mantém na memória. Se você o fizer mount --bind /var/target /var/mount, o kernel registrará o fato de que /var/mountagora é um novo nome para /var/target. (Não conheço os detalhes; em particular, não sei se montar algo em um subdiretório /var/targettambém fará com que apareça /var/mount, ou por que ou por que não. Edições para esta resposta seriam apreciadas.) se você fizer ls /var/mountisso, acontecerá o mesmo que você fez ls /var/target, porque /var/mounte /var/targeté o mesmo diretório.

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

Tanner Swett
fonte
11
Eu não usei mount --bind, mas duvido que possa replicar o comportamento de um link simbólico como ln -s ../../myfile .. Se você mover isso para outro diretório, ele apontará para outro lugar porque é um link relativo. Isso pode ser útil se você precisar fazer backup de uma subárvore e ainda assim os links funcionarem no backup.
21414 Joe
10

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.

Mark Williams
fonte
2

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

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

A montagem permite criar um link rígido, ou seja, dois ou mais nomes para o mesmo inode :

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

(Pode-se achar que isso ajuda no backup de instantâneo com a versão antiga do rsync.)

Além disso, observe que esta 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)

Portanto, o mount ainda é lido e gravado, mesmo que eu tenha solicitado a opção ro (somente leitura).

Udi
fonte