ln -s vs mount --bind

26

J'essaie de comprendre la différence entre l'utilisation de ln -s et mount --bind . Dans le scénario de base, je peux utiliser les deux pour accéder à un répertoire depuis un autre endroit. Dans quels scénarios ces deux vont se comporter différemment?

    
posée Łukasz 07.12.2014 - 17:06
la source

4 réponses

28

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 bind mount sera toujours accessible.
  • Plusieurs programmes peuvent faire la distinction entre les liens symboliques et les répertoires ou 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 ) qui contient autre chose ( B ). Le lien affichera le contenu de la cible de montage ( B ) au lieu de l'original ( A ).

En outre, vous pouvez lier un répertoire ou un fichier sur un répertoire ou un fichier existant, en masquant le contenu original (rendant le contenu original inaccessible à moins que l'original n'ait été lié ailleurs). Un lien symbolique nécessite que l'original soit déplacé ou supprimé.

    
réponse donnée muru 07.12.2014 - 17:09
la source
11

Eh bien, ln -s crée un lien symbolique, tandis que mount --bind crée un montage.

Un lien symbolique est un type de fichier spécial. 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. Donc maintenant, si vous faites ls /var/link , le programme ls essaiera d'obtenir une liste de répertoires pour /var/link , mais obtiendra plutôt une liste de répertoires pour /var/target .

Les liens symboliques ne sont encore 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 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 également apparaître dans /var/mount , ou pourquoi ou pourquoi pas. Les modifications apportées à cette réponse soyez apprécié.) Si maintenant vous faites ls /var/mount , la même chose se produira comme si vous aviez 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 pas monter quelque chose à /var/mount sauf si il existe déjà un répertoire sur /var/mount .

    
réponse donnée Tanner Swett 08.12.2014 - 03:54
la source
9

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.

    
réponse donnée Mark Williams 08.12.2014 - 09:20
la source
2

En plus des autres réponses. Le système n'autorise pas le lien physique vers le répertoire:

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

Le montage vous permet de créer des liens durs, c'est-à-dire deux noms ou plus pour le même un inode :

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

(On peut trouver que cela aide pour la sauvegarde par image 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 lu et écrit même si j'ai demandé l'option ro (lecture seule).

    
réponse donnée Udi 08.12.2014 - 13:11
la source

Lire d'autres questions sur les étiquettes