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

36

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

Łukasz
la source
7
Je devrais mettre en garde contre rm -run mount --bind. Avec a ln, il supprime le lien, alors que pour a --bind, cela a le même effet que d'exécuter le rm -rsur la cible. Pas bien, comme je l'ai trouvé peu de temps avant de reconstruire l'un de mes serveurs ...
Mark K Cowan
@MarkKCowan c'est vrai, sauf si vous avez créé un lien en dur .
JohnnyQ
@JohnnyQ Impossible de répertoires en liens durs
Mark K Cowan

Réponses:

33

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

  • Dans un chroot , si la cible du lien 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 ( A) sur lequel est Bmonté 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é.

muru
la source
16

Eh bien, ln -scrée un lien symbolique, alors que mount --bindcré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/linksera 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 lsprogramme essaiera d’obtenir une liste de répertoires pour /var/link, mais obtiendra en fait une liste de répertoires pour la /var/targetplace.

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/links'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/mounts'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/targetle fera apparaître /var/mountaussi, 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/mountet /var/targetsont 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.

Tanner Swett
la source
1
Je n'ai pas utilisé mount --bind, mais je doute qu'il puisse reproduire le comportement d'un lien symbolique tel que 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.
Joe
10

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.

Mark Williams
la source
2

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

Udi
la source