Wenn ich mache
# cd /
# ln -s /home test
# cd test
# mount --bind $PWD /mnt
der Eintrag in /proc/mounts
ist
/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0
welches das Gerät ist, das gemountet ist /home
, und es lässt sich nicht leicht daraus ableiten, $PWD
welches ist /test
. Wie kann ich im Allgemeinen feststellen, welches Gerät (z. B. /dev/sda2) angezeigt wird, /proc/mounts
wenn man bedenkt, dass die Bind-Mount-Verbindung möglicherweise zu einem Verzeichnis/einer Datei erfolgt, das/die möglicherweise durch symbolische Links, andere Bind-Mounts usw. „verdeckt“ ist?
Antwort1
Wenn ich Ihre Frage richtig verstehe, möchten Sie wissen, welches Gerät für eine bestimmte Halterung verwendet wurde. Dazu können Sie den folgenden df
Befehl verwenden:
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/fedora_greeneggs-root 50G 21G 27G 44% /
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.8G 14M 3.8G 1% /dev/shm
tmpfs 3.8G 984K 3.8G 1% /run
tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup
tmpfs 3.8G 3.4M 3.8G 1% /tmp
/dev/sda1 477M 99M 349M 23% /boot
/dev/mapper/fedora_greeneggs-home 402G 184G 198G 49% /home
Um herauszufinden, auf welchem Gerät sich eine bestimmte Datei/ein bestimmtes Verzeichnis befindet, geben Sie die Datei als Argument an df
. In Ihrem Beispiel:
$ df -h /mnt
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 477M 99M 349M 23% /
Sie können auch den mount
folgenden Befehl verwenden:
$ mount | grep '^/dev'
/dev/mapper/fedora_greeneggs-root on / type ext4 (rw,relatime,seclabel,data=ordered)
/dev/sda1 on /boot type ext4 (rw,relatime,seclabel,data=ordered)
/dev/mapper/fedora_greeneggs-home on /home type ext4 (rw,relatime,seclabel,data=ordered)
Das für jedes Gerät bereitgestellte Verzeichnis ist das dritte Argument in der obigen Ausgabe. Für das Gerät /dev/sda1
wäre also /boot
. Die anderen Geräte verwenden LVM (Logical Volume Management) und müssten weiter abgefragt werden, um zu wissen, welches Gerät tatsächlich von LVM verwendet wird.
Antwort2
Unter Linux haben wir findmnt
genau util-linux
das gemacht
findmnt -n -o SOURCE --target /path/to/FILE
Der Vorteil anderer Lösungen besteht darin, dass sie auch dann noch funktionieren, wenn Pfade durch symbolische Links oder doppelte Bind-Mounts verdeckt sind.
Antwort3
Die genaueste Methode, die ich kenne, ist die Verwendung der Ausgabe des Systemaufrufs lstat(). Genauer gesagt des Felds st_dev. Es gibt ein Befehlszeilenprogramm, stat(1), mit dem diese Informationen angezeigt werden können. Beispielsweise die Ausgabe von „stat /etc/issue“ auf meinem Laptop:
File: ‘/etc/issue’
Size: 65 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 1610916043 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Beachten Sie die dritte Zeile, erstes Feld „Gerät“. Hier wird 801h aufgeführt. Dieser Wert kann in zwei Bytes aufgeteilt werden, 8 und 1. Das erste Byte wird als Hauptnummer bezeichnet, das zweite Byte als Nebennummer. Der nächste Schritt besteht also darin, herauszufinden, welches Gerät Hauptnummer 8, Nebennummer 1 ist.
Ich finde, dass das Konsultieren von /proc/partitions am schnellsten geht. In meinem Fall hat /proc/partitions den Inhalt:
major minor #blocks name
8 16 234431064 sdb
8 17 33554432 sdb1
8 18 200875608 sdb2
8 0 500107608 sda
8 1 500106584 sda1
Aus dieser Ausgabe geht ziemlich klar hervor, dass Major 8, Minor 1 sda1 ist. Wir können dies mit einem ls -l /dev/sda1 bestätigen.
brw-rw---- 1 root disk 8, 1 May 8 05:33 /dev/sda1
Beachten Sie die 8, 1 vor dem Datumsstempel.
Es ist wichtig zu verstehen/sich daran zu erinnern, dass der Name einer Gerätedatei wie /dev/sda1 nur eine Bezeichnung ist. Die Haupt- und Nebennummern sind die signifikanten, wichtigen Werte der Gerätedatei. Wenn Sie neugierig geworden sind, sehen Sie sich das Dienstprogramm mknod(1) an, das zum Erstellen von Gerätedateien verwendet wird. Ich könnte einen neuen /dev-Eintrag namens aardvark mit Hauptnummer 8 und Nebennummer 18 mit der folgenden Syntax erstellen:
mknod /dev/aardvark b 8 18
Dann könnte ich es einfach montieren:
mount /dev/aardvark /mnt
und wenn wir uns die Ausgabe des Mount-Befehls oder den Inhalt von /proc/mounts ansehen, sehen wir:
/dev/aardvark on /mnt type xfs (rw,relatime,attr2,inode64,noquota)
df -h zeigt:
/dev/aardvark 192G 154G 38G 81% /mnt
... Wie dem auch sei, der Sinn des Ganzen besteht darin, zu veranschaulichen, dass die wichtigen Details zur Identifizierung eines Blockgeräts die Haupt- und Nebennummern sind – nicht die Gerätedateibezeichnung – und dass die Verwendung des Systemaufrufs lstat() die beste Möglichkeit ist, diese Werte abzufragen.
Als letzten Kommentar: Ich habe Ihre Frage gerade noch einmal gelesen, um sicherzugehen, dass ich sie beantworte, und mir ist aufgefallen, dass Sie gefragt haben, welche Quellgerätebezeichnung in /proc/mounts für eine Bind-Einbindung angezeigt wird. Das wäre die gleiche Quellgerätebezeichnung, die im ursprünglichen mount(2)-Aufruf für die Dateisystem-Einbindungspunktquelle für die Bind-Einbindung verwendet wurde. Vielleicht hilft ein Beispiel:
Ich habe /dev/sdb2 und /dev/aardvark (dasselbe wie oben). Sie sind beide Major 8, Minor 18. Beachten Sie, dass ich dasselbe Dateisystem zweimal mounten werde. Ich gehe folgendermaßen vor:
mkdir /mnt1 /mnt2 /foo
mount /dev/aardvark /mnt1
mount /dev/sdb2 /mnt2
Beachten Sie, dass ich das Verzeichnis somedir in /mnt1 erstelle. Da /mnt1 und /mnt2 jedoch dasselbe Dateisystem gemountet haben, ist somedir auch über /mnt2 erreichbar.
mkdir /mnt1/somedir
mkdir /foo/left /foo/right
mount -o bind /mnt1/somedir /foo/left
mount -o bind /mnt2/somedir /foo/right
Wenn wir jetzt /proc/mounts überprüfen, sehen wir:
/dev/aardvark /mnt1 xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/sdb2 /mnt2 xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/aardvark /foo/left xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/sdb2 /foo/right xfs rw,relatime,attr2,inode64,noquota 0 0
Die Bezeichnung des Quellgeräts bei den /foo/...-Bind-Mounts ist derselbe wie der ursprünglich im Dateisystem-Mount(2)-Aufruf angegebene Wert. Denken Sie daran, dass /dev/aardvark und /dev/sdb2 in meinem Beispiel dasselbe Gerät sind.
Mir ist klar, dass ich gerade einen Roman getippt habe und die erste Hälfte Ihre Frage überhaupt nicht beantwortet, aber es schien mir eine solche Verschwendung, ihn zu löschen. Vielleicht hilft er jemand anderem.
Viel Glück.
PS: Bedenken Sie, dass einige Dateisysteme netzwerkbasiert sind – wie NFS oder CIFS – oder virtuell sind – wie procfs oder sysfs – und kein Quellblockgerät haben. Ich weiß nicht, was als Gerät in der Stat-Ausgabe zurückgegeben wird, nur so nebenbei.
Antwort4
Der du
Befehl kann mit einem -x
Schalter aufgerufen werden, um Inhalte von anderen gemounteten Dateisystemen zu ignorieren.
Der -k
Schalter zeigt die Verzeichnisgrößen in KB an.
Zum Anzeigen von Verzeichnissen mit einer Größe von >~ 1 MB.
du -xk / | awk ' $1 > 1000000 { print } '