Un répertoire existant est nécessaire en tant que point de montage .
$ ls
$ sudo mount /dev/sdb2 ./datadisk
mount: mount point ./datadisk does not exist
$ mkdir datadisk
$ sudo mount /dev/sdb2 ./datadisk
$
Je trouve cela déroutant car il recouvre le contenu existant du répertoire. Il existe deux contenus possibles du répertoire du point de montage qui peuvent être modifiés de manière inattendue (pour un utilisateur qui n'effectue pas le montage).
Pourquoi ne se mount
passe- t-il pas dans un répertoire nouvellement créé? C'est ainsi que les systèmes d'exploitation graphiques affichent les supports amovibles. Il serait clair si le répertoire est monté (existe) ou non monté (n'existe pas). Je suis presque sûr qu'il y a une bonne raison mais je n'ai pas encore réussi à le découvrir.
udisksctl
. Pourquoi utilisermount
?better design than Unix!
[citation nécessaire]Réponses:
Il s’agit d’un détail de mise en oeuvre qui a filtré.
Dans un système UNIX, chaque répertoire est constitué d'une liste de noms mappés sur des numéros d' inode . Un inode contient des métadonnées qui indiquent au système s'il s'agit d'un fichier, d'un répertoire, d'un périphérique spécial, d'un canal nommé, etc. S'il s'agit d'un fichier ou d'un répertoire, il indique également au système où trouver le contenu du fichier ou du répertoire sur le disque. La plupart des inodes sont des fichiers ou des répertoires. L'
-i
option tols
listera les numéros d'inode.Monter un système de fichiers prend un inode de répertoire et définit un indicateur sur la copie en mémoire du noyau pour dire "réellement, lorsque vous recherchez le contenu de ce répertoire, regardez plutôt cet autre système de fichiers" (voir la diapositive 10 de cette présentation ). C'est relativement facile, car cela modifie un seul élément de données.
Pourquoi ne crée-t-il pas une entrée de répertoire pour vous pointant vers le nouvel inode? Vous pouvez mettre cela en œuvre de deux manières, qui présentent toutes deux des inconvénients. L'une consiste à écrire physiquement un nouveau répertoire dans le système de fichiers - mais cela échoue si le système de fichiers est en lecture seule! L'autre consiste à ajouter à chaque processus de liste de répertoires une liste d'éléments "supplémentaires" qui ne sont pas réellement présents. Cela est fastidieux et risque potentiellement d’entraîner une petite perte de performances lors de chaque opération de fichier.
Si vous souhaitez créer des points de montage créés dynamiquement, le
automount
système peut le faire. Spéciaux non-systèmes de fichiers disque peuvent également créer des répertoires à volonté, par exempleproc
,sys
,devfs
et ainsi de suite.Éditer: voir aussi la réponse à Que se passe-t-il lorsque vous «montez» sur un dossier existant avec du contenu?
la source
sudo mount --bind / /mnt ; ls /mnt/proc
-> vide. Je me demande comment ça marche.fs/namespace.c
, je pense; Je ne connais pas la source et je ne voulais pas passer trop de temps à percer jusqu'au détail. Le "drapeau sur l'inode" que j'ai obtenu de la présentation liée./var/cache
exploitation racine à un moment ou un autre/var
n'a pas pu être monté.) Voir aussipath_resolution(7)
. (Les anciennes pages de manuel linux-man avaient cette page de manuel dans la section 2, comme die.net) IDK comment Linux fonctionne réellement en interne, afin d’optimiser la vérification de chaque composant du répertoire comme montage possible. Peut-être épingler cette entrée VFS dans le cache?fs/namei.c
(path -> inode lookup) appelle cependant dans namespace.clookup_mnt()
. Il y a un drapeau sur le dentry (entrée de cache de répertoire). Mais ce n'est qu'une optimisation, c'est-à-dire une implémentation. Il ne vous dit pas quel système de fichiers est monté là-bas; vous devez regarder dans la table de montage. (Voir m_hash (), pour plus de détails sur l'implémentation. Linux évite au moins les comparaisons de chaînes supplémentaires, et AFAICS parvient en même temps à réutiliser des dentry dans des montages de liaisons, par exemple, car il est écrit par des assistants).man 8 mount
::mount --bind foo foo
. L'mount
appel de liaison attache seulement (une partie de) un système de fichiers unique, pas de sous-montages possibles. Toute la hiérarchie des fichiers, y compris les sous-montages, est attachée à la deuxième place en utilisant :mount --rbind olddir newdir
Si
mount(2)
nécessaire la création d'un nouveau répertoire pour être le point de montage, on ne pouvait pas monter quoi que ce soit dans un système de fichiers en lecture seule. Ce serait stupide, alors nous pouvons l'exclure.Si mount créait éventuellement un nouveau répertoire comme point de montage, ce serait étrange. Ce n'est pas comme si le montage / démontage se produisait tout le temps, donc ajouter une logique supplémentaire dans le noyau pour effectuer ces deux étapes avec un seul appel système ne constituerait pas une accélération importante. Il suffit de laisser à l’espace utilisateur le pouvoir de faire un
mkdir(2)
appel système s’il le souhaite. La réponse de Dmitry indique qu'avoirmount(2)
fait les deux choses le rendrait non atomique. Et vous voulez un argument supplémentaire pourmount(2)
avec des drapeaux de mode commeopen(2)
prend, pourO_CREAT
,O_EXCL
etc. Il serait tout simplement ridicule par rapport à laisser l'espace utilisateur le faire.Ou peut-être demandez-vous si
mount(8)
(le programme traditionnel qui effectue desmount(2)
appels système) le fait? Ce serait possible, mais il y a déjà un très bonmkdir(1)
travail, et la conception d'Unix est basée sur de bons petits outils pouvant être combinés. Si vous voulez un outil qui fait les deux, il est facile d'écrire un script shell pour le construire à partir de deux outils plus simples. (Ou, comme le dit muru, le faitudisksctl
déjà, vous n'avez donc pas à l'écrire.) De plus, Linux utilise normalement la syntaxemount(8)
d'util-linuxmount -o x-mount.mkdir[=mode]
avec sax-
syntaxe pour les options de l'espace utilisateur, plutôt que les options à transmettre au système de fichiers.Maintenant la question la plus intéressante: pourquoi faut-il un répertoire sur le système de fichiers parent?
Comme le souligne la réponse de pjc50 (aucune relation, même s'il a mes initiales!), L'affichage des points de montage dans les listes de répertoires exigerait un contrôle supplémentaire à chaque passage
readdir()
.Disposer de points de montage en tant que répertoires dans le répertoire qui les contient (sur le système de fichiers parent) est une bonne astuce.
readdir()
ne doit pas remarquer que c'est un point de montage du tout. Cela ne se produit que si le point de montage est utilisé comme composant de chemin. La résolution du chemin doit bien sûr vérifier la table de montage pour chaque composant de répertoire d'un chemin.la source
If mount(2) required the creation of a new directory to be the mount point, you couldn't mount anything under a read-only filesystem. That would be dumb
- Je dirais plus intelligemment: du point de vue de l'utilisateur, un système de fichiers en lecture seule ne devrait pas changer, mais autoriser les montages signifie qu'il le peutro
. Il existe de nombreux cas d'utilisation de systèmes de fichiers en lecture seule pour lesquels votre argument n'a pas de sens.man 8 mount
:x-mount.mkdir[=mode]
Permet de créer un répertoire cible (point de montage). L'argument optionnel mode spécifie le mode d'accès au système de fichiers utilisé pour lamkdir(2)
notation octale. Le mode par défaut est 0755. Cette fonctionnalité est prise en charge uniquement par les utilisateurs root./tmp
et/home
. Ou monté en NFS en lecture seule/usr
avec un local/usr/local
monté dessus. Ou plus généralement, toute image partagée en lecture seule avec une partie modifiable montée dessus. (Les mods locaux d'une image en lecture seule peuvent également être effectués fichier par fichier avec des systèmes de fichiers personnalisés tels que les superpositions ou d'autres systèmes de fichiers d'union pour Linux, utilisés sur des images de démarrage LiveCD.) boot, mais le faire rw peut arriver avant d’autres montages.Monter sur un répertoire existant appelle
mount
pratiquement atomique: il réussit ou échoue, du moins du point de vue de l'utilisateur. S'ilmount
devait créer le point de montage lui-même, il aurait deux points de défaillance, rendant impossible la garantie d'un retour en arrière propre. Imaginez le scénario suivant:mount
crée avec succès le point de montagemount
tente de monter un nouveau système de fichiers dans ce répertoire, mais échouemount
tente de supprimer le point de montage, mais échoueLe système finit par avoir un effet secondaire d'échec
mount
.En voici un autre:
umount
démonte avec succès un système de fichiersumount
tente de supprimer le point de montage, mais échoueMaintenant, faut-il
umount
retourner le succès ou l'échec?la source
mount
a 8 codes de retour différents pour les erreurs qui peuvent également être combinés. Il pourrait simplement en ajouter un autre lorsque la suppression du répertoire échoue. man7.org/linux/man-pages/man8/mount.8.html#RETURN_CODESmount
appel système ne le crée pas. Bien que cela soit peut-être juste mon interprétation / attente de ce que je pensais que le PO voulait dire, ou ce que j’aurais demandé si j’avais demandé.Un autre cas qui peut se produire:
Lorsque vous démarrez, une image de base en lecture seule est chargée dans le répertoire racine. Vous souhaitez donc le remplacer lorsque vous souhaitez créer une racine réelle. Vous pouvez donc imaginer que mount syscall permute simplement le
ro
point de montagerw
.Ici, imaginons que vous ayez un problème de système de fichiers sur le point de montage racine, vous voudriez pouvoir essayer de le réparer. Avec le montage en chevauchement, vous pouvez démonter le système de fichiers et utiliser
fsck
l’image fournie dans l’image de base pour le résoudre.Cette fonctionnalité peut également être utile dans les systèmes nécessitant une sécurité renforcée pour pouvoir suivre le changement entre une
ro
partition et unerw
autre.la source
mount
nécessaire, en créant un nouveau répertoire à l'emplacement du point de montage, vous ne pouvez rien monter sur un système de fichiers en lecture seule? Le paragraphe d'ouverture est déroutant: ce n'est pas comme ça que initrd Linux fonctionne. Il utilise l'pivot_root
appel système pour changer le fs racine, pas seulement monter plus de choses dessus. Cela vous empêchait de suivre votre logique dans les paragraphes suivants, car je pensais que vous en parliezpivot_root(2)
.pivot_root
, puisumount
le disque mémoire. Mais initramfs est rootfs: vous ne pouvez nipivot_root
rootfs, ni le démonter . Au lieu de tout supprimer de rootfs pour libérer de l'espace (find -xdev / -exec rm {} \;
), superposez les rootfs avec la nouvelle racine (cd /newmount; mount --move . /; chroot .
), attachez stdin / stdout / stderr à la nouvelle / dev / console, et àexec
la nouvelleinit
Je me suis toujours demandé cela aussi.
Un simple emballage tel que:
sauvegardé en tant que script exécutable nommé
mount
dans un répertoire remplaçant/bin
dans votre PATH devrait s'en occuper s'il vous dérange trop(Avant d'exécuter le
mount
binaire réel , il crée un répertoire nommé d'après le dernier argument demount
, si ce répertoire n'existe pas déjà.)Alternativement, si vous ne voulez pas que les invocations échouées du
mount
wrapper créent des répertoires, vous pouvez faire:la source
mount
commande ne devrait-elle pas alors utiliser le répertoire ainsi créé?mount /dev/foo /some/path
:? J'ai supposé que cela fonctionnerait commeudisksctl
si, alors vous courriezmount /dev/foo
.eval
développer$#
, en utilisant"${@:-1}"
. J'ai testé cela avec DASH, car je pense qu'il ne supporte rien de plus que ce que POSIX sh est requis de supporter./bin/dash -c 'echo ${@:-1}' foo bar
impressionsbar
.man -o x-mount.mkdir
...