device name unter Linux heraussuchen



  • Hallo zusammen,

    als Beispiel angenommen ich habe unter Linux das Verzeichnis "/var/" in eine seperate Partition verschoben. Dieses Verzeichnis ist nun auf "/dev/sda5" gemountet.

    Wenn ich nun ein Unterverzeichnis "/var/www/test1/test2" aufrufe, kann ich dann mit der C-API von Linux herausfinden auf welcher Partition dieses Verzeichnis liegt. So dass ich dann wieder "/dev/sda5" zurück geliefert bekomme?


  • Mod

    Das sollte mit dem guten alten stat gehen. Mit dem bekommst du die st_dev Nummer. Die kannst du mit den major und minor Makros zerlegen. Die major-Nummer gibt dir die Gerätenummer an und die Minor-Nummer die Nummer des Dateisystems auf diesem Gerät. Tja und dann wird's kompliziert 😃 . Soweit ich weiß, gibt es von diesen aus gesehen keinen direkten Weg zu den in /dev/ gemappten Geräten 😞 .
    Du kannst in /proc/partitions gucken, da stehen aber soweit ich weiß nur Geräte drin, um die sich der SCSI-Treiber kümmert (ich mag falsch liegen damit). Im schlimmsten Fall musst du mit readdir durch /dev/ gehen und alle Geräte mit diesen beiden Nummern vergleichen.

    Um zu verstehen was ich meine ein Beispiel auf der Konsole:

    [b]$>[/b] stat /usr/include/stdio.h
      File: `/usr/include/stdio.h'
      Size: 31109     	Blocks: 64         IO Block: 4096   regular file
    Device: 902h/2306d	Inode: 190951      Links: 1
    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2011-09-05 14:05:06.978587205 +0200
    Modify: 2011-01-21 23:19:15.000000000 +0100
    Change: 2011-02-02 12:53:39.725404754 +0100
    

    Die Datei liegt auf Gerät 902h, das ist 9 major und 2 minor (das kann ich noch im Kopf ausrechnen, ohne Makros 😉 ).
    Dann:

    [b]$>[/b] cat /proc/partitions 
    major minor  #blocks  name
    
       8        0  976762584 sda
       8        1     497983 sda1
       8        2    5855692 sda2
       8        3   48829567 sda3
       8        4          1 sda4
       8        5  897165958 sda5
       8        6   24410704 sda6
       9        0     497856 md0
       9        3   48821248 md3
       9        1   11711232 md1
       9        2   97658880 md2
       9        4  897165888 md4
       8       16  976762584 sdb
       8       17     497983 sdb1
       8       18    5855692 sdb2
       8       19   48829567 sdb3
       8       20          1 sdb4
       8       21  897165958 sdb5
       8       22   24410704 sdb6
       8       32  976762584 sdc
       8       33  976760001 sdc1
    

    Das heißt, /usr/include/stdio.h liegt auf /dev/md2.
    Ich hätte auch machen können:

    [b]$>[/b] ls -l /dev/md* /dev/sd* /dev/hd*
    ls: cannot access /dev/hd*: No such file or directory
    brw-rw---- 1 root disk 9,  0 2011-08-24 17:16 /dev/md0
    brw-rw---- 1 root disk 9,  1 2011-08-11 17:15 /dev/md1
    brw-rw---- 1 root disk 9,  2 2011-08-11 17:15 /dev/md2
    brw-rw---- 1 root disk 9,  3 2011-08-11 17:15 /dev/md3
    brw-rw---- 1 root disk 9,  4 2011-08-11 17:15 /dev/md4
    brw-rw---- 1 root disk 8,  0 2011-08-24 17:16 /dev/sda
    brw-rw---- 1 root disk 8,  1 2011-08-11 17:15 /dev/sda1
    brw-rw---- 1 root disk 8,  2 2011-08-11 17:15 /dev/sda2
    brw-rw---- 1 root disk 8,  3 2011-08-11 17:15 /dev/sda3
    brw-rw---- 1 root disk 8,  4 2011-08-11 17:15 /dev/sda4
    brw-rw---- 1 root disk 8,  5 2011-08-11 17:15 /dev/sda5
    brw-rw---- 1 root disk 8,  6 2011-08-11 17:15 /dev/sda6
    brw-rw---- 1 root disk 8, 16 2011-08-24 17:16 /dev/sdb
    brw-rw---- 1 root disk 8, 17 2011-08-11 17:15 /dev/sdb1
    brw-rw---- 1 root disk 8, 18 2011-08-11 17:15 /dev/sdb2
    brw-rw---- 1 root disk 8, 19 2011-08-11 17:15 /dev/sdb3
    brw-rw---- 1 root disk 8, 20 2011-08-11 17:15 /dev/sdb4
    brw-rw---- 1 root disk 8, 21 2011-08-11 17:15 /dev/sdb5
    brw-rw---- 1 root disk 8, 22 2011-08-11 17:15 /dev/sdb6
    brw-rw---- 1 root disk 8, 32 2011-08-24 17:16 /dev/sdc
    brw-rw---- 1 root disk 8, 33 2011-08-11 17:15 /dev/sdc1
    brw-rw---- 1 root disk 8, 48 2011-08-25 11:24 /dev/sdd
    

    So hätte ich es auch herausgefunden.

    Ziemlich kompliziert, aber soweit ich weiß geht es nicht einfacher.



  • SeppJ schrieb:

    Ziemlich kompliziert, aber soweit ich weiß geht es nicht einfacher.

    Ich halte für unwahrscheinlich, dass es etwas viel einfacheres gibt, einfach weil Netzwerkdateisysteme, FUSE, stacked filesystems, union file systems usw. eh schon dazu führen, dass Dateisysteme gemountet sein können ohne dass sie ein unterliegendes Gerät besitzen, das in /dev/ existiert.


Anmelden zum Antworten