web-dev-qa-db-fra.com

Quelle est la difference entre ln -s et mount --bind?

J'essaie de comprendre la différence entre 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?

32
Łukasz

Ils se comporteront différemment dans au moins deux cas:

  • Dans un chroot , si le lien cible est en dehors du chroot, le lien sera mort. Un montage de liaison sera toujours accessible.
  • Plusieurs programmes peuvent faire la distinction entre des liens symboliques et des répertoires ou des fichiers réels. Peu (le cas échéant) peuvent faire la distinction entre un répertoire ou un fichier et celui qui y est monté. Cela s'étend également aux liens symboliques vers quelque chose (Aname__) qui a autre chose (Bname__) monté sur eux. Le lien affichera le contenu de la cible de montage (Bname__) à la place de l'original (Aname__).

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é.

33
muru

ln -s crée un lien symbolique, alors que mount --bind crée un montage.

Un lien symbolique est un type spécial de fichier. Si vous faites ln -s /var/target /var/link, alors /var/link sera un fichier contenant le chemin "/var/target". La seule différence entre un lien symbolique et un fichier ordinaire est 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 utilisez ls /var/link, le programme ls essaiera d’obtenir une liste de répertoires pour /var/link, mais obtiendra une liste de répertoires pour /var/target à la 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 de lien symbolique (ni de fichier ordinaire) 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 vous faites mount --bind /var/target /var/mount, le noyau enregistrera le fait que /var/mount est maintenant un nouveau nom pour /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 également dans /var/mount, ou pourquoi ou pourquoi pas. Des modifications de cette réponse seraient appréciées.) Alors maintenant, si vous utilisez ls /var/mount, la même chose se produira comme si vous utilisiez 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 à /var/mountsauf si il existe déjà un répertoire à /var/mount.

13
Tanner Swett

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.

10
Mark Williams

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 n 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).

2
Udi