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?
-
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.