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 ?
Réponses
Trop de publicités?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é.
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
.
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 :
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