Estou tentando entender a diferença entre usar ln -s
e 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?
Estou tentando entender a diferença entre usar ln -s
e 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?
Respostas:
Eles se comportarão de maneira diferente em pelo menos dois casos:
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.
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ê o fizer ln -s /var/target /var/link
, /var/link
haverá 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 ls
programa 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/link
se 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/mount
agora é 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/target
també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/mount
isso, acontecerá o mesmo que você fez ls /var/target
, porque /var/mount
e /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
.
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.
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.
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).
rm -r
amount --bind
. Com aln
, ele remove o link, enquanto que para a--bind
, ele tem o mesmo efeito que a execuçãorm -r
no destino. Não é bom, como eu encontrei pouco antes de reconstruir um dos meus servidores ...