J'essaie de comprendre la différence entre utiliser ln -s
et mount --bind
. Dans un scénario de base, je peux utiliser les deux pour accéder à un répertoire ailleurs. Dans quels scénarios ces deux-là se comporteront-ils différemment?
J'essaie de comprendre la différence entre utiliser ln -s
et mount --bind
. Dans un scénario de base, je peux utiliser les deux pour accéder à un répertoire ailleurs. Dans quels scénarios ces deux-là se comporteront-ils différemment?
Réponses:
Ils se comporteront différemment dans au moins deux cas:
A
) sur lequel est B
monté autre chose ( ). Le lien affichera le contenu de mount target ( B
) au lieu de l'original ( A
).En outre, vous pouvez lier le montage d’un répertoire ou d’un fichier sur un répertoire ou un fichier existant en masquant le contenu original (rendant le contenu original inaccessible à moins que l’original ait été lié ailleurs). Un lien symbolique nécessite que l'original soit déplacé ou supprimé.
Eh bien, ln -s
crée un lien symbolique, alors que mount --bind
crée une monture.
Un lien symbolique est un type spécial de fichier. Si vous le faites ln -s /var/target /var/link
, alors ce /var/link
sera un fichier contenant le chemin " /var/target
". La seule différence entre un lien symbolique et un fichier ordinaire réside dans le fait que lorsqu'un programme tente d'effectuer une opération sur un lien symbolique, l'opération est généralement effectuée sur la cible plutôt que sur le fichier. Alors maintenant, si vous le faites ls /var/link
, le ls
programme essaiera d’obtenir une liste de répertoires pour /var/link
, mais obtiendra en fait une liste de répertoires pour la /var/target
place.
Les liens symboliques ne sont toujours que des fichiers. Ils peuvent être renommés et supprimés et tout ce jazz. Notez que vous ne pouvez pas créer un lien symbolique (ou un fichier ordinaire, d'ailleurs) appelé /var/link
s'il existe déjà un fichier appelé /var/link
; vous devez d'abord vous en débarrasser.
Un montage n'est pas un fichier; c'est un enregistrement que le noyau garde en mémoire. Si tu faismount --bind /var/target /var/mount
, le noyau enregistrera le fait qu'il /var/mount
s'agit maintenant d'un nouveau nom /var/target
. (Je ne connais pas les détails; en particulier, je ne sais pas si monter quelque chose dans un sous-répertoire de /var/target
le fera apparaître /var/mount
aussi, ou pourquoi ou pourquoi pas. Des modifications de cette réponse seraient appréciées.) Alors maintenant Si vous le faites ls /var/mount
, la même chose se passera comme si vous le faisiez ls /var/target
, car /var/mount
et /var/target
sont le même répertoire.
Les montages ne sont pas des fichiers. Je ne sais pas ce qui se passerait si vous tentiez de renommer ou de supprimer /var/mount
. Notez que vous ne pouvez rien monter sur/var/mount
moins qu'il y ait déjà un répertoire dans /var/mount
.
ln -s ../../myfile .
. Si vous déplacez cela dans un autre répertoire, il sera pointé ailleurs car il s'agit d'un lien relatif. Cela peut être utile si vous devez sauvegarder une sous-arborescence tout en maintenant les liens actifs dans la sauvegarde.
De plus, ln -s survivrait à un redémarrage; alors que mount --bind ne le ferait pas, sauf si vous éditez / etc / fstab pour le rendre persistant.
En plus des autres réponses. Le système n'autorise pas les liens physiques vers les répertoires:
# ln mydir mpoint
ln: `mydir': hard link not allowed for directory
Le montage vous permet de créer un lien dur, c'est-à-dire deux noms ou plus pour le même inode :
# mount -B mydir/ mpoint/
# ls -d -i *
807175 mpoint/ 807175 mydir/
(On peut trouver que cela aide pour la sauvegarde d'instantané avec l'ancienne version de rsync.)
Notez également que ce montage n'est pas complet:
# 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)
Donc, le montage est toujours en lecture et en écriture, même si je demandais l’option ro (en lecture seule).
rm -r
unmount --bind
. Avec aln
, il supprime le lien, alors que pour a--bind
, cela a le même effet que d'exécuter lerm -r
sur la cible. Pas bien, comme je l'ai trouvé peu de temps avant de reconstruire l'un de mes serveurs ...