Viele Leute sagen immer wieder, dass Linux keine Informationen über Bindungs-Mounts speichert, daher gibt es keine Möglichkeit, eine Liste von ihnen und ihren Quellen zu erhalten. Hier sind einige Beispiele:
aus einem der Kommentare hier :
IIRC Diese Informationen werden nirgendwo aufbewahrt: Nachdem
mount --bind
die beiden Kopien gleichwertig sind, gibt es keine, die „origineller“ ist als die andere. Schließlich könnte es kein Original geben, wenn Sie bereits abgemeldet wären/mnt
.von einer Antwort auf dieser Seite :
Die einzige Möglichkeit, sich daran zu erinnern, welche Mounts Bindungs-Mounts waren, ist das Protokoll der verbleibenden Mount-Befehle
/etc/mtab
. Eine Bind-Mount-Operation wird durch die Bind-Mount-Option angezeigt (wodurch der Dateisystemtyp ignoriert wird). Mount hat jedoch keine Option, nur Dateisysteme aufzulisten, die mit einem bestimmten Satz von Optionen gemountet wurden.aus einem Debian-Fehlerbericht :
Dies ist beabsichtigt. Beide Mount-Punkte sind in jeder Hinsicht vollständig gleich, sodass der Kernel keine Flags behält, um sie zu unterscheiden.
Das obige ist jedoch Unsinn. Das Tool findmnt
kann die Quellpfade von Bindungs-Mounts auflisten (in Form von device[source-path]
; ich versuche auch, es dazu zu bringen, nur den Quellpfad und nicht das Gerät aufzulisten). Wenn der Linux-Kernel einen Bind-Mount verwalten soll, müssen diese Informationen irgendwo gespeichert werden , andernfalls konnte er nicht wissen, dass sie /home
gebunden sind /users
. Wo sind diese Daten? Wird es in einem dunklen Bereich im RAM gespeichert? Hat findmnt
Blick in /proc
irgendwo?
quelle
findmnt
läuft und welche Optionen geben Sie ihr? Meins druckt es nicht so aus und schaut sich den Quellcode an, den es zu verwenden scheint ,_PATH_PROC_MOUNTINFO
der aussieht,/proc/self/mountinfo
der diese Informationen auch nicht enthält./proc/self/mountinfo
relativ kurzer Zeit wurde umstrukturiert. Ich war auf meinem RHEL6-Computer, auf dem zuvor keine Pfadinformationen vorhanden waren, aber auf meinem RHEL7-Computer und wie in Ihrem Link erwähnt, auch auf Wheezy./dev/A
bei/B
und Sie gemountet sindmount --bind /B /C
, erinnern sich ältere Kernel nur an/B → /dev/A
und/C → /dev/A
sie erinnern sich an keine Beziehung zwischen/B
und/C
. Das Abhängen/B
hat also natürlich keine Auswirkung auf/C
. Neuere Kernel erinnern sich, dass dies/C
ein Bind-Mount von war/B
, aber auf eine Weise, die nicht verhindert, dass sie weiterarbeiten,/C
wenn sie nicht gemountet sind ,/B
weiß ich nicht genau, wie.Antworten:
Sie haben ein wenig falsch verstanden; die beiden Bereitstellungspunkte sind gleich in Bezug auf die Berechtigungen, Fahnen, etc , weil die Bindung effektiv Zugriff von einem Pfad zum anderen leitet. Aber sie sind immer noch verschieden .
Wenn Sie sich das ansehen, sehen
/proc/self/mountinfo
Sie die Kernelansicht der Mount-Welt für diesen Prozess (Namespaces machen die Dinge komplizierter; es gibt nicht nur eine Ansicht der Mount-Tabelle).man 5 proc
wird das Format dieser Datei erklären, aber Sie können die Baumhierarchie sehen und sehen, wo Bindungs-Mounts ihre "Eltern" haben. Dies ist die Datei, diefindmnt
analysiert wird.quelle
Linux speichert nicht die Informationen darüber, welches Mount ein Bind-Mount war . Es werden Informationen zu allen Mounts einschließlich Bind-Mounts gespeichert .
Es ist ziemlich ähnlich zu harten Links. Mounts verknüpfen mit Dateisystemen wie Dateinamen mit Inodes. Die einzigen Unterschiede bestehen darin, dass Mounts auch Mount-Flags haben und sich möglicherweise auf ein Unterverzeichnis des Zieldateisystems anstelle des Dateisystemstamms beziehen.
Wenn Sie einen festen Link erstellen, speichert das Dateisystem nicht, welcher Dateiname der ursprüngliche und welcher der feste Link war. Beide beziehen sich einfach auf dieselbe Inode. Wenn Sie die Verknüpfung der Originaldatei aufheben, ist die Situation nicht zu unterscheiden, wenn Sie die Datei direkt mit dem zweiten Dateinamen erstellt haben.
Zurück zum Binden von Mounts: Der Kernel verwaltet eine Tabelle, die das Dateisystem (gekennzeichnet durch ein Paar aus Major: Minor-Nummern), den Mountpoint, den Pfad relativ zum Dateisystemstamm und einige Flags enthält. Sie können auf diese Liste zugreifen, indem Sie auf schauen
/proc/self/mountinfo
. (Es wird komplizierter, wenn Namespaces beteiligt sind, wie @ stephen-harris erwähnt hat).findmnt
analysiert diese Liste.Wenn Ihre Wurzel
/dev/sda1
mit dem Dur: Moll ist8:1
und Sie ausführenmount --bind /a /b
/proc/self/mountinfo
, enthält es ähnliche Zeilen:Wenn Ihr
/home
ist/dev/sda2
mit der Haupt: minor8:2
und führen Siemount --bind /home /users
es wie folgt aussehen:Die relevanten Spalten für Ihre Frage sind die dritte, die vierte und die fünfte. Dies ist die Dateisystem-ID (für reale Dateisysteme ist sie dieselbe wie für das Gerät major: minor; für virtuelle Dateisysteme wie tmpfs ist es [0: counter ]), der Pfad relativ zum Dateisystemstamm, der an den Mountpoint gebunden ist (normalerweise / für normal) Mounts, kann alles für Bind-Mounts sein) und den Mountpoint.
Die Bedeutung der verbleibenden Spalten finden Sie in der Dokumentation zum Linux-Kernel .
findmnt
ruft den Quellpfad relativ zum Dateisystemstamm "FSROOT" auf. Sie können es verwendenfindmnt -o TARGET,FSROOT
, um es zu bekommen. Wenn Sie den absoluten Quellpfad möchten, müssen Sie ihn wahrscheinlich/proc/self/mountinfo
selbst analysieren und die Informationen zu den Bereitstellungen für dasselbe Dateisystem kombinieren.Weitere Informationen finden Sie in meiner Antwort auf "Liste nur Bindungshalterungen" .
quelle
/proc/self/mountinfo
enthalten können Zeilen wie2 1 8:1 /a /b rw - ext4 /dev/sda1 rw,errors=remount-ro
, dann die meisten Linux sicherlich tut zu binden Halterungen einige Informationen halten.mount --bind /home/melab /mnt
die resultierende Linie könnte wie eine der folgenden aussehen , je nachdem , welche/home
und/home/melab
ist ein Mount - Punkt:3 1 8:1 /home/melab /mnt rw - ext4 /dev/sda1 rw
,3 1 8:2 /melab /mnt rw - ext4 /dev/sda2 rw
,3 1 8:3 / /mnt rw - ext4 /dev/sda3 rw
/
in der vierten Spalte häufig auf ein Bind-Mount hinweist. Es könnte sich aber auch um ein Btrfs-Subvolumen handeln./dev/sda3
an montiert werden/home/melab
?/dev/sda1
als/
,/dev/sda2
als/home
und/dev/sda3
als/home/melab