Ermitteln Sie, auf welchem ​​Gerät sich ein Verzeichnis befindet.

Ermitteln Sie, auf welchem ​​Gerät sich ein Verzeichnis befindet.

Wenn ich mache

# cd /
# ln -s /home test
# cd test
# mount --bind $PWD /mnt

der Eintrag in /proc/mountsist

/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, $PWDwelches ist /test. Wie kann ich im Allgemeinen feststellen, welches Gerät (z. B. /dev/sda2) angezeigt wird, /proc/mountswenn 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 dfBefehl 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 mountfolgenden 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/sda1wä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 findmntgenau util-linuxdas 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 duBefehl kann mit einem -xSchalter aufgerufen werden, um Inhalte von anderen gemounteten Dateisystemen zu ignorieren.

Der -kSchalter zeigt die Verzeichnisgrößen in KB an.

Zum Anzeigen von Verzeichnissen mit einer Größe von >~ 1 MB.

du -xk / | awk ' $1 > 1000000 { print } '

verwandte Informationen