Ein vorhandenes Verzeichnis wird als Einhängepunkt benötigt .
$ ls
$ sudo mount /dev/sdb2 ./datadisk
mount: mount point ./datadisk does not exist
$ mkdir datadisk
$ sudo mount /dev/sdb2 ./datadisk
$
Ich finde es verwirrend, da es vorhandene Inhalte des Verzeichnisses überlagert. Es gibt zwei mögliche Inhalte des Mount-Point-Verzeichnisses, die möglicherweise unerwartet gewechselt werden (für einen Benutzer, der das Mount nicht ausführt).
Warum passiert das nicht mount
in einem neu erstellten Verzeichnis? Auf diese Weise zeigen grafische Betriebssysteme Wechselmedien an. Es wäre klar, ob das Verzeichnis gemountet (existiert) oder nicht gemountet (existiert nicht) ist. Ich bin mir ziemlich sicher, dass es einen guten Grund gibt, aber ich konnte es noch nicht entdecken.
udisksctl
. Warum benutzenmount
?better design than Unix!
[Zitieren benötigt]Antworten:
Dies ist ein Fall eines Implementierungsdetails, das durchgesickert ist.
In einem UNIX-System besteht jedes Verzeichnis aus einer Liste von Namen, die Inode- Nummern zugeordnet sind. Eine Inode enthält Metadaten, die dem System mitteilen, ob es sich um eine Datei, ein Verzeichnis, ein spezielles Gerät, eine Named Pipe usw. handelt. Wenn es sich um eine Datei oder ein Verzeichnis handelt, teilt sie dem System auch mit, wo sich der Datei- oder Verzeichnisinhalt auf der Festplatte befindet. Die meisten Inodes sind Dateien oder Verzeichnisse. Die
-i
Option zumls
Auflisten von Inode-Nummern.Beim Mounten eines Dateisystems wird ein Verzeichnis-Inode verwendet und in der In-Memory-Kopie des Kernels ein Flag gesetzt, das besagt: "Wenn Sie nach dem Inhalt dieses Verzeichnisses suchen, schauen Sie sich stattdessen dieses andere Dateisystem an" (siehe Folie 10 dieser Präsentation ). Dies ist relativ einfach, da ein einzelnes Datenelement geändert wird.
Warum wird kein Verzeichniseintrag erstellt, der auf den neuen Inode verweist? Sie können dies auf zwei Arten implementieren, die beide Nachteile haben. Eine besteht darin, ein neues Verzeichnis physisch in das Dateisystem zu schreiben - dies schlägt jedoch fehl, wenn das Dateisystem schreibgeschützt ist! Das andere ist, zu jedem Verzeichnislistenprozess eine Liste von "zusätzlichen" Dingen hinzuzufügen, die nicht wirklich vorhanden sind. Dies ist umständlich und kann bei jedem Dateivorgang zu einer geringen Leistungseinbuße führen.
Wenn Sie dynamisch erstellte Einhängepunkte wünschen, kann das
automount
System dies tun. Spezielle nicht-Disk - Dateisysteme können auch Verzeichnisse nach Belieben erstellen, zum Beispielproc
,sys
,devfs
und so weiter.Bearbeiten: Siehe auch die Antwort auf Was passiert, wenn Sie einen vorhandenen Ordner mit Inhalten überladen?
quelle
sudo mount --bind / /mnt ; ls /mnt/proc
-> leer. Ich frage mich, wie es funktioniert.fs/namespace.c
, denke ich; Ich kenne die Quelle nicht und wollte nicht zu lange mit dem Bohren bis ins Detail verbringen. Das "Flag on the Inode" habe ich aus der verlinkten Präsentation bekommen./var/cache
als es/var
nicht gemountet werden konnte.) Siehe auchpath_resolution(7)
. (Ältere Linux-Manpages hatten diese Manpage in Abschnitt 2, wie die.net) IDK, wie Linux tatsächlich intern arbeitet, um die Überprüfung jeder Verzeichniskomponente als möglichen Mount zu optimieren. Vielleicht diesen VFS-Eintrag im Cache anheften?fs/namei.c
ruft (Pfad -> Inode-Suche) trotzdem namespace.c auflookup_mnt()
. Auf dem Eintrag befindet sich ein Flag (Verzeichnis-Cache-Eintrag). Aber das ist nur eine Optimierung, auch als Implementierungsdetail bekannt. Es sagt Ihnen nicht, welches Dateisystem dort gemountet ist; Sie müssen in der Einfassungstabelle schauen. (Weitere Implementierungsdetails finden Sie unter m_hash (). Zumindest unter Linux werden zusätzliche Zeichenfolgenvergleiche vermieden, und AFAICS schafft es gleichzeitig, Dentrys über z. B. Bind-Mounts hinweg wiederzuverwenden, da sie von Assistenten geschrieben wurden.)man 8 mount
:mount --bind foo foo
. Der Bind-mount
Aufruf hängt nur (einen Teil) eines einzelnen Dateisystems an, nicht mögliche Submounts. Die gesamte Dateihierarchie einschließlich dermount --rbind olddir newdir
Wenn die Erstellung eines neuen Verzeichnisses als Einhängepunkt
mount(2)
erforderlich ist, können Sie unter einem schreibgeschützten Dateisystem nichts einhängen. Das wäre dumm, also können wir das ausschließen.Wenn mount optional ein neues Verzeichnis als Mountpoint erstellen würde, wäre das seltsam. Es ist nicht so, dass das Ein- und Aushängen ständig passiert. Daher wäre es keine wichtige Beschleunigung, zusätzliche Logik in den Kernel zu integrieren, um diese beiden Schritte mit einem einzigen Systemaufruf auszuführen. Überlassen Sie es einfach dem Benutzerraum, um einen
mkdir(2)
Systemaufruf zu tätigen , wenn dies gewünscht wird. Die Antwort von Dmitry weist darauf hin, dassmount(2)
es nicht atomar wäre , wenn man beide Dinge tun würde. Und würden Sie an ein zusätzliches Argument wollenmount(2)
mit Modus - Flags wieopen(2)
nimmt, fürO_CREAT
,O_EXCL
usw. Es wäre einfach albern sein im Vergleich zu lassen User-Space tun es.Oder haben Sie sich gefragt,
mount(8)
ob (das traditionelle Programm, dasmount(2)
Systemaufrufe ausführt) dies tun soll? Das wäre möglich, aber es gibt bereits ein perfektesmkdir(1)
Werkzeug für den Job, und im Design von Unix dreht sich alles um gute kleine Werkzeuge, die kombiniert werden können. Wenn Sie ein Tool suchen, das beides kann, ist es einfach, ein Shell-Skript zu schreiben, um dieses Tool aus zwei einfacheren Tools zu erstellen. (Oder, wie muru bemerkte,udisksctl
tut dies bereits, so dass Sie es nicht schreiben müssen.) Außerdemmount(8)
unterstützt Linuxs Standard von util-linux diemount -o x-mount.mkdir[=mode]
Verwendung seinerx-
Syntax für Optionen für den Benutzerbereich anstelle von Optionen, die an das Dateisystem übergeben werden sollen.Nun die interessantere Frage: Warum muss es überhaupt ein Verzeichnis im übergeordneten Dateisystem geben?
Wie die Antwort von pjc50 zeigt (keine Beziehung, obwohl er meine Initialen hat!), Würde es dann eine zusätzliche Überprüfung erfordern, wenn Mount-Punkte in Verzeichnislisten angezeigt werden
readdir()
.Mount-Punkte als Verzeichnisse in dem Verzeichnis zu haben, das sie enthält (auf dem übergeordneten FS), ist ein netter Trick.
readdir()
muss nicht bemerken, dass es sich überhaupt um einen Einhängepunkt handelt. Dies geschieht nur, wenn der Einhängepunkt als Pfadkomponente verwendet wird. Die Pfadauflösung muss natürlich die Mount-Tabelle für jede Verzeichniskomponente eines Pfades überprüfen.quelle
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
- Ich würde es schlauer finden: Aus der Sicht des Benutzers sollte sich ein schreibgeschütztes Dateisystem nicht ändern, aber das Zulassen von Mounts bedeutet, dass dies möglich istro
. Es gibt viele Anwendungsfälle für schreibgeschützte Dateisysteme, in denen Ihr Argument keinen Sinn ergibt.man 8 mount
:x-mount.mkdir[=mode]
Erlaubt das Erstellen eines Zielverzeichnisses (Mountpoint). Der optionale Argumentmodus gibt den Dateisystemzugriffsmodus an, dermkdir(2)
in der Oktalnotation verwendet wird. Der Standardmodus ist 0755. Diese Funktionalität wird nur für Root-Benutzer unterstützt./tmp
und/home
. Oder schreibgeschütztes NFS-Mounted/usr
mit einem lokalen/usr/local
Mounted. Oder allgemeiner gesagt, ein gemeinsames schreibgeschütztes Bild, über dem ein modifizierbarer Teil montiert ist. (Lokale Modifikationen an einem Nur-Lese-Image können auch auf Dateibasis mit benutzerdefinierten Dateisystemen wie Overlayfs oder anderen Union-Dateisystemen für Linux durchgeführt werden, die auf bootfähigen LiveCD- Images verwendet werden.) Ich habe anfangs an den Root-FS gedacht, auf dem RO ursprünglich installiert war booten, aber machen es rw kann vor anderen Reittieren passieren.Das Mounten in ein vorhandenes Verzeichnis ruft
mount
praktisch atomar auf: Zumindest aus Benutzersicht gelingt dies oder schlägt fehl. Wennmount
der Mountpunkt selbst erstellt werden müsste, hätte er zwei Fehlerquellen, sodass ein sauberes Rollback nicht garantiert werden kann. Stellen Sie sich folgendes Szenario vor:mount
erstellt den Mountpoint erfolgreichmount
versucht, ein neues Dateisystem in dieses Verzeichnis einzuhängen, schlägt jedoch fehlmount
versucht, den Mountpoint zu entfernen, schlägt jedoch fehlDas System hat die Nebenwirkung eines fehlgeschlagenen
mount
.Hier ist ein anderes:
umount
Hängt ein Dateisystem erfolgreich abumount
versucht, den Mountpoint zu entfernen, schlägt jedoch fehlNun sollte
umount
Erfolg oder Misserfolg zurückkehren?quelle
mount
hat 8 verschiedene Rückkehrcodes für Fehler, die auch kombiniert werden können. Es könnte einfach ein weiteres hinzufügen, wenn das Entfernen des Verzeichnisses fehlschlägt. man7.org/linux/man-pages/man8/mount.8.html#RETURN_CODESmount
Systemaufruf es nicht erstellt. Obwohl das vielleicht nur meine Interpretation / Erwartung dessen war, was das OP meiner Meinung nach fragen sollte, oder was ich gefragt hätte, wenn ich gefragt hätte.Ein weiterer Fall, der auftreten kann:
Beim Booten wird ein schreibgeschütztes Basisimage in das Stammverzeichnis geladen. Sie möchten es also überschreiben, wenn Sie eine echte Wurzel schlagen möchten. Sie können sich also vorstellen, dass mount syscall nur den
ro
Mountpoint zu vertauschtrw
.Stellen Sie sich vor, Sie haben ein Dateisystemproblem auf dem Root-Mountpoint und möchten versuchen, es zu reparieren. Mit Mount-Überlappung können Sie das Dateisystem aushängen und das
fsck
bereitgestellte Basis-Image zur Lösung verwenden.Diese Funktion kann auch in Systemen nützlich sein, die eine hohe Sicherheit benötigen, um Änderungen zwischen einer
ro
Partition und einer anderenrw
nachzuverfolgen.quelle
mount
Bedarf ein neues Verzeichnis am Speicherort des Mountpunkts erstellen und nichts über ein schreibgeschütztes Dateisystem mounten können? Der erste Absatz ist verwirrend: So funktioniert Linux initrd nicht. Es verwendet denpivot_root
Systemaufruf, um die Root-Fs zu ändern, und nicht nur, um mehr Daten darüber zu laden. Das machte es schwierig, Ihrer Logik in den nächsten Absätzen zu folgen, weil ich dachte, Sie sprachen darüberpivot_root(2)
.pivot_root
und dannumount
die Ramdisk. Aber initramfs ist rootfs: Sie können es wederpivot_root
rootfs noch aushängen . Löschen Sie stattdessen alles aus rootfsfind -xdev / -exec rm {} \;
, um Speicherplatz freizugeben ( ), hängen Sie rootfs mit dem neuen root (cd /newmount; mount --move . /; chroot .
) über, hängen Sie stdin / stdout / stderr an das neue / dev / console undexec
das neueinit
Das habe ich mich auch immer gefragt.
Ein einfacher Wrapper wie:
Das Speichern als ausführbares Skript mit dem Namen
mount
in einem Verzeichnis, das/bin
Ihren PATH überschreibt, sollte dies berücksichtigen, wenn es Sie zu sehr stört(Bevor die eigentliche
mount
Binärdatei ausgeführt wird, wird ein Verzeichnis erstellt, das nach dem letzten Argument von to benannt istmount
, sofern ein solches Verzeichnis noch nicht vorhanden ist.)Wenn Sie nicht möchten, dass fehlgeschlagene Aufrufe des
mount
Wrappers Verzeichnisse erstellen, können Sie Folgendes tun:quelle
mount
Befehl dann nicht das so erstellte Verzeichnis verwenden?mount /dev/foo /some/path
:? Ich nahm an, dass es so funktionieren würdeudisksctl
, also würden Sie rennenmount /dev/foo
.eval
zu erweitern$#
mit erhalten"${@:-1}"
. Ich habe dies mit DASH getestet, da ich denke, dass es nichts anderes unterstützt, als POSIX sh zu unterstützen./bin/dash -c 'echo ${@:-1}' foo bar
drucktbar
.man -o x-mount.mkdir
...