it-swarm.com.de

Bestimmen 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/mounts lautet

/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0

dies ist das Gerät, das an /home montiert ist und sich nicht leicht von $PWD ableiten lässt, das /test ist. Wie kann ich bestimmen, welches Gerät (dh/dev/sda2) im Allgemeinen in /proc/mounts Angezeigt wird, da sich der Bind-Mount möglicherweise in einem Verzeichnis/einer Datei befindet, das möglicherweise durch andere Symlinks "verdeckt" wird? Halterungen binden, etc?

53
StrongBad

Wenn ich Ihre Frage verstehe, möchten Sie wissen, welches Gerät für eine bestimmte Halterung verwendet wurde. Dazu können Sie den Befehl df 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. Anhand Ihres Beispiels:

$ df -h /mnt
Filesystem                         Size  Used Avail Use% Mounted on
/dev/sda1                          477M   99M  349M  23% /

Sie können auch den Befehl mount 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. Also für Gerät /dev/sda1 wäre /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.

54
slm

Unter Linux haben wir findmnt von util-linux genau dafür gemacht

findmnt -n -o SOURCE --target /path/to/FILE

Der Vorteil anderer Lösungen besteht darin, dass sie immer noch funktionieren, wenn Pfade durch Symlinks oder doppelte Bindungsbereitstellungen verdeckt werden.

35
rudimeier

Die genaueste mir bekannte Methode ist die Verwendung der Ausgabe des Systemaufrufs lstat (). Insbesondere das Feld st_dev. Es gibt ein Befehlszeilenprogramm, stat (1), mit dem diese Informationen angezeigt werden können. Zum Beispiel 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 listet es 801h auf. Dieser Wert kann in zwei Bytes, 8 und 1, getrennt werden. Das erste Byte ist als Hauptzahl bekannt, das zweite Byte ist die Nebenzahl. Der nächste Schritt besteht also darin, herauszufinden, welches Gerät Major 8, Minor 1 ist.

Ich finde Beratung/Proc/Partitionen am schnellsten. 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 Dur 8, Moll 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 Datenstempel.

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 Nebenzahlen sind die signifikanten, wichtigen Werte der Gerätedatei. Wenn Sie neugierig werden, lesen Sie das Dienstprogramm mknod (1), mit dem Gerätedateien erstellt werden. Ich könnte einen neuen/dev-Eintrag namens aardvark mit Dur 8, Moll 18 mit der folgenden Syntax erstellen:

mknod /dev/aardvark b 8 18

Dann könnte ich es leicht montieren:

mount /dev/aardvark /mnt

und wenn wir uns die Ausgabe des Befehls mount oder den Inhalt von/proc/mounts ansehen und sehen:

/dev/aardvark on /mnt type xfs (rw,relatime,attr2,inode64,noquota)

df -h zeigt:

/dev/aardvark   192G  154G   38G  81% /mnt

... Wie auch immer, all dies soll veranschaulichen, dass die wichtigen Details für die Identifizierung eines Blockgeräts die Haupt- und Nebennummern sind - nicht die Bezeichnung der Gerätedatei - und dass die Verwendung des Systemaufrufs lstat () der beste Weg ist, dies zu tun Fragen Sie diese Werte ab.

Als letzten Kommentar habe ich Ihre Frage noch einmal gelesen, um sicherzustellen, dass ich sie beantwortet habe, und mir wurde klar, dass Sie gefragt haben, welches Quellgeräteetikett in/proc/mounts für ein Bind-Mount angezeigt werden würde. Dies wäre die gleiche Bezeichnung für das Quellgerät, die im ursprünglichen Aufruf von mount (2) für die Mountpoint-Quelle des Dateisystems für den Bind-Mount verwendet wurde. Vielleicht würde ein Beispiel helfen:

Ich habe/dev/sdb2 und/dev/aardvark (das gleiche wie oben). Sie sind beide Dur 8, Moll 18. Hinweis: Ich werde dasselbe Dateisystem zweimal mounten. Ich mache folgendes:

mkdir /mnt1 /mnt2 /foo

mount /dev/aardvark /mnt1
mount /dev/sdb2 /mnt2

Beachten Sie, dass ich das Verzeichnis irgendwann in/mnt1 mache. Da in/mnt1 und/mnt2 dasselbe Dateisystem bereitgestellt ist, 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 nun/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 auf den Bind-Mounts/foo/... entspricht dem Wert, der ursprünglich im Aufruf des Dateisystem-Mount (2) angegeben wurde. Denken Sie daran, dass/dev/aardvark und/dev/sdb2 in meinem Beispiel dasselbe Gerät sind.

Mir ist klar, dass ich gerade einen Roman geschrieben habe und die erste Hälfte Ihre Frage überhaupt nicht wirklich beantwortet, aber es schien eine solche Verschwendung zu sein, ihn zu löschen. Vielleicht hilft es jemand anderem.

Viel Glück.

P.S. Beachten Sie, dass einige Dateisysteme netzwerkbasiert sind - wie NFS oder CIFS - oder virtuell - wie procfs oder sysfs - und kein Quellblockgerät haben. Ich weiß nicht, was als Gerät in der stat-Ausgabe zurückgegeben wird, nur für das, was es wert ist.

13
etherfish

Bei folgenden typischen Mountpunkten:

$ df --output=target
Mounted on
/
/dev
/run
/sys/fs/cgroup
/run/lock
/run/shm
/run/user

stat --format %m <path> druckt nur den Mountpoint auf runde Weise (obwohl Sie den Exit-Code überprüfen müssen, um einen Berechtigungsfehler eindeutig zu erkennen; Mount-Table-Ansätze gewinnen hier):

$ stat --format %m /
/
$ stat --format %m /tmp
/
$ stat --format %m /proc
/proc
$ stat --format %m /run
/run
$ stat --format %m /run/mount
/run
$ stat --format %m /run/user
/run/user
$ stat --format %m /run/user/1000/dconf
/run/user
$ stat --format %m /run/user/1000/gvfs
/run/user/1000/gvfs

Symlinks sind wie gewohnt vorsichtig:

$ ls -lh ~/.gvfs
/home/cwillu/.gvfs -> /run/user/1000/gvfs
$ stat --format %m ~/.gvfs
/run/user/1000/gvfs
$ stat --format %m ~/.gvfs
/

Und denken Sie natürlich daran, beim Erstellen von Skripten Anführungszeichen zu verwenden. Betrachten Sie einen Mountpoint-Pfad mit Leerzeichen und dergleichen:

$ mkdir /tmp/Something\ Like\ This\!
$ Sudo mount none /tmp/Something\ Like\ This\! -t tmpfs
$ stat --format %m /tmp/Something\ Like\ This\!
/tmp/Something Like This!
$ touch /tmp/Something\ Like\ This\!/pretend-I\'m-big
$ ls /tmp/Something\ Like\ This\!
pretend-I'm-big

Wie groß sind du?

$ du $(stat --format %m /tmp/Something\ Like\ This\!/)
du: cannot access /tmp/Something: No such file or directory
du: cannot access Like: No such file or directory
du: cannot access This!: No such file or directory

$ du "$(stat --format %m /tmp/Something\ Like\ This\!/)"
0   /tmp/Something Like This!

Die Tab-Vervollständigung meiner Distribution macht dies nicht einmal richtig, daher werden wir diesen Beispiel-Mountpoint nur mit Wagenrückläufen und Zeilenvorschüben und Leerzeichenfolgen als Platzhalter versehen:

$ stat --format %m /tmp/Something*
/tmp/Something   
Like   This!

$ a="$(stat --format %m /tmp/Something*)"
    # the above assignment is actually the one place you don't need quotes, 
    # but `export a=...` or similar _would_ need them, so we'll just put them in;
    # they don't change the behaviour in this form of assignment.

$ stat "$a"
  File: ‘/tmp/Something   \r\n\rLike   This!’
  Size: 40          Blocks: 0          IO Block: 4096   directory
Device: 7bh/123d    Inode: 1279171     Links: 2
Access: (1777/drwxrwxrwt)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-09-30 11:43:17.933467344 -0600
Modify: 2016-09-30 11:43:17.933467344 -0600
Change: 2016-09-30 11:43:17.933467344 -0600
 Birth: -
2
Carey Underwood