53 votes

Quelle est la différence entre ln -s et mount --bind ?

J'essaie de comprendre la différence entre l'utilisation de ln -s y mount --bind . Dans le scénario de base, je peux utiliser les deux pour accéder à un répertoire à partir d'un autre. Dans quels cas les deux se comporteront-ils différemment ?

48voto

muru Points 180007

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 bind sera toujours accessible.
  • Plusieurs programmes peuvent faire la distinction entre les liens symboliques et les répertoires ou fichiers réels. Peu de programmes (voire aucun) peuvent faire la distinction entre un répertoire ou un fichier et celui qui est monté dessus. Ceci s'applique également aux liens symboliques vers quelque chose ( A ) qui ont autre chose ( B ). Le lien affichera le contenu de la cible de montage ( B ) au lieu de l'original ( A ).

Vous pouvez également monter 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é monté par bind ailleurs). Un lien symbolique nécessite que l'original soit déplacé ou supprimé.

23voto

Tanner Swett Points 341

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

Un lien symbolique est un type de fichier particulier. Si vous faites un 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 au lieu du fichier. Ainsi, si vous faites ls /var/link , le ls essaiera d'obtenir une liste de répertoires pour /var/link mais obtiendra en fait une liste dans l'annuaire pour /var/target au lieu de cela.

Les liens symboliques restent cependant des fichiers. Ils peuvent être renommés, supprimés et tout le reste. 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 ; il faudrait d'abord s'en débarrasser.

Un montage n'est pas un fichier ; c'est un enregistrement que le noyau conserve en mémoire. Si vous faites un mount --bind /var/target /var/mount le noyau enregistrera le fait que /var/mount est désormais un nouveau nom pour /var/target . (Je ne connais pas les détails ; en particulier, je ne sais pas si le fait de monter quelque chose dans un sous-répertoire de /var/target le fera apparaître dans /var/mount également, ou pourquoi ou pourquoi pas. Les modifications apportées à cette réponse seraient appréciées). Donc maintenant, si vous faites ls /var/mount il se passera la même chose que si vous l'aviez fait ls /var/target parce que /var/mount y /var/target sont dans le même répertoire.

Les montages ne sont pas des fichiers. Je ne sais pas ce qui se passerait si vous essayiez de renommer ou de supprimer des /var/mount . Notez que vous ne pouvez rien monter à /var/mount sauf si il existe déjà un répertoire à l'adresse /var/mount .

17voto

manyk Points 51

En outre, ln -s survivrait à un redémarrage, alors que mount --bind ne le ferait pas, à moins que vous ne modifiiez /etc/fstab pour le rendre persistant.

2voto

Rodion V Points 181

En complément des autres réponses. Le système ne permet pas d'établir un lien direct avec l'annuaire :

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

La monture vous permet de créer un lien dur, c'est-à-dire deux noms ou plus pour un même nom. un inode :

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

(On peut le trouver utile pour les sauvegardes instantanées avec l'ancienne version de rsync).

Notez également que cette monture n'est pas complète :

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

Ainsi, le montage est toujours en lecture et écriture même si j'ai demandé l'option ro (read only).

Utilisation supplémentaire :

Dans le cas où le système d'exploitation ne permet pas de modifier les permissions d'un répertoire ou qu'une application ne respecte pas les permissions, voir la solution suivante concernant SSH :

OpenSSH a refusé le répertoire .ssh avec un lien symbolique

2voto

CristiFati Points 121

Outre les différences conceptuelles entre les 2 (bien expliquées par les réponses existantes), il y a une chose fonctionnelle qui peut créer un peu de confusion, car l'une ne se comporte pas comme on s'y attendrait de prime abord (c'était mon cas). Il s'agit des répertoires.

Mise en place

Créer un lien symbolique et un point de montage sur le même dir :

[cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> uname -a
Linux cfati-5510-0 4.19.128-microsoft-standard #1 SMP Tue Jun 23 12:58:10 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> cat /etc/lsb-release | grep LTS
DISTRIB_DESCRIPTION="Ubuntu 20.04.2 LTS"
[cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> echo $-
himBHs
[cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]>
[cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ll
total 0
drwxrwxrwx 1 cfati cfati 4096 Feb 26  2021 ./
drwxrwxrwx 1 cfati cfati 4096 Feb 26  2021 ../
[cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ln -s /mnt/e/Work/Dev/Utils/cup-vm/test0 ln
[cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> mkdir mnt
[cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> sudo mount --bind /mnt/e/Work/Dev/Utils/cup-vm/test0 mnt
[cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> # Check the 2
[cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ll
total 0
drwxrwxrwx 1 cfati cfati 4096 Feb 26  2021 ./
drwxrwxrwx 1 cfati cfati 4096 Feb 26  2021 ../
lrwxrwxrwx 1 cfati cfati   34 Feb 26  2021 ln -> /mnt/e/Work/Dev/Utils/cup-vm/test0/
drwxrwxrwx 1 cfati cfati 4096 Feb 26  2021 mnt/
[cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ll ln
lrwxrwxrwx 1 cfati cfati 34 Feb 26  2021 ln -> /mnt/e/Work/Dev/Utils/cup-vm/test0/
[cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ll ln/
total 0
drwxrwxrwx 1 cfati cfati 4096 Feb 26  2021 ./
drwxrwxrwx 1 cfati cfati 4096 Feb 26  2021 ../
drwxrwxrwx 1 cfati cfati 4096 Feb 26  2021 dir0/
-rwxrwxrwx 1 cfati cfati    0 Feb 26  2021 file0.txt*
[cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ll mnt
total 0
drwxrwxrwx 1 cfati cfati 4096 Feb 26  2021 ./
drwxrwxrwx 1 cfati cfati 4096 Feb 26  2021 ../
drwxrwxrwx 1 cfati cfati 4096 Feb 26  2021 dir0/
-rwxrwxrwx 1 cfati cfati    0 Feb 26  2021 file0.txt*
[cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]>

Test

Tout s'est déroulé comme prévu. Voici le comportement du 2, lorsqu'on monte d'un niveau dans l'arbre :

  • Point de montage :

    [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ll mnt/..
    total 0
    drwxrwxrwx 1 cfati cfati 4096 Feb 26  2021 ./
    drwxrwxrwx 1 cfati cfati 4096 Feb 26  2021 ../
    lrwxrwxrwx 1 cfati cfati   34 Feb 26  2021 ln -> /mnt/e/Work/Dev/Utils/cup-vm/test0/
    drwxrwxrwx 1 cfati cfati 4096 Feb 26  2021 mnt/
    [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ll mnt/../
    ln/  mnt/
    [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ll mnt/../mnt/  # With TAB completion (previous line)
    total 0
    drwxrwxrwx 1 cfati cfati 4096 Feb 26  2021 ./
    drwxrwxrwx 1 cfati cfati 4096 Feb 26  2021 ../
    drwxrwxrwx 1 cfati cfati 4096 Feb 26  2021 dir0/
    -rwxrwxrwx 1 cfati cfati    0 Feb 26  2021 file0.txt*
  • lien symbolique :

    [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ll ln/..
    total 0
    drwxrwxrwx 1 cfati cfati 4096 Feb 26  2021 ./
    drwxrwxrwx 1 cfati cfati 4096 Feb 14 03:37 ../
    drwxrwxrwx 1 cfati cfati 4096 Feb 26  2021 test0/
    drwxrwxrwx 1 cfati cfati 4096 Dec 24  2019 windows/
    [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ll ln/../
    ln/  mnt/
    [cfati@cfati-5510-0:~/Work/Dev/AskUbuntu/q000557733]> ll ln/../ln  # With TAB completion (previous line)
    ls: cannot access 'ln/../ln': No such file or directory

    Comme on l'a vu, le parent dir est calculé par rapport à la cible. Cela peut avoir des résultats inattendus (et indésirables) lorsque l'on travaille avec des chemins relatifs qui ne sont pas contenus dans l'élément lien symbolique ed dir

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X