Wie kann man das verwendete Dateisystem ermitteln?



  • Die Frage sagts schon: Wie kann man das verwendete Dateisystem mit dem eine Festplatte, Diskette oder was auch immer formatiert ist, ermitteln? Beispielsweise habe ich eine Festplatte und möchte wissen ob da, ext2 oder ext2, xfs drauf ist.



  • nicht mit c++ mitteln, dass gehört in das entsprechende OS-Forum



  • Hallo,

    dixidix schrieb:

    Die Frage sagts schon: Wie kann man das verwendete Dateisystem mit dem eine Festplatte, Diskette oder was auch immer formatiert ist, ermitteln? Beispielsweise habe ich eine Festplatte und möchte wissen ob da, ext2 oder ext2, xfs drauf ist.

    Siehe http://linux.die.net/man/3/getmntent

    MfG,

    Probe-Nutzer



  • ich habe das hier gefunden.
    http://www.linuxmanpages.com/man2/statfs.2.php

    Wie kann man das dann zurückgeben? Etwa so?

    unsigned long getFsType(const char *mountpoint)
    {
    	struct statfs s;
     	statfs(mountpoint, &s);
    
    	unsigned long type=s.f_type;
    	return type;
    }
    


  • dixidix schrieb:

    ich habe das hier gefunden.
    http://www.linuxmanpages.com/man2/statfs.2.php

    Auch ok.

    dixidix schrieb:

    Wie kann man das dann zurückgeben? Etwa so?

    unsigned long getFsType(const char *mountpoint)
    {
            struct statfs s;
            statfs(mountpoint, &s);
    
            unsigned long type=s.f_type;
            return type;
    }
    

    Ja, so geht das, würde ich aber noch kürzer schreiben, wenn da nichts weiter getan wird (aber müsste type (s.f_type) nicht vom Typ long sein (warum unsigned?)):
    :

    long getFsType(const char *mountpoint)
    {
            struct statfs s;
    
            statfs(mountpoint, &s);
            return s.f_type
    }
    

    MfG,

    Probe-Nutzer



  • Ja, so geht das, würde ich aber noch kürzer schreiben, wenn da nichts weiter getan wird (aber müsste type (s.f_type) nicht vom Typ long sein (warum unsigned?)):

    Mit unsinged, war das nur so dahin getippt, aber danke für den Tipp.

    wenn da nichts weiter getan wird

    Ich will eigentlich nur eine Ausgabe haben, die mir den Namen des Dateisystems zurückgibt.
    Das müsste ich dann wohl irgendwie hiermit verknüpfen.

    File system types:
    
       ADFS_SUPER_MAGIC      0xadf5
       AFFS_SUPER_MAGIC      0xADFF
       BEFS_SUPER_MAGIC      0x42465331
       BFS_MAGIC             0x1BADFACE
       CIFS_MAGIC_NUMBER     0xFF534D42
       CODA_SUPER_MAGIC      0x73757245
       COH_SUPER_MAGIC       0x012FF7B7
       CRAMFS_MAGIC          0x28cd3d45
       DEVFS_SUPER_MAGIC     0x1373
       EFS_SUPER_MAGIC       0x00414A53
       EXT_SUPER_MAGIC       0x137D
       EXT2_OLD_SUPER_MAGIC  0xEF51
       EXT2_SUPER_MAGIC      0xEF53
       EXT3_SUPER_MAGIC      0xEF53
       HFS_SUPER_MAGIC       0x4244
       HPFS_SUPER_MAGIC      0xF995E849
       HUGETLBFS_MAGIC       0x958458f6
       ISOFS_SUPER_MAGIC     0x9660
       JFFS2_SUPER_MAGIC     0x72b6
       JFS_SUPER_MAGIC       0x3153464a
       MINIX_SUPER_MAGIC     0x137F /* orig. minix */
       MINIX_SUPER_MAGIC2    0x138F /* 30 char minix */
       MINIX2_SUPER_MAGIC    0x2468 /* minix V2 */
       MINIX2_SUPER_MAGIC2   0x2478 /* minix V2, 30 char names */
       MSDOS_SUPER_MAGIC     0x4d44
       NCP_SUPER_MAGIC       0x564c
       NFS_SUPER_MAGIC       0x6969
       NTFS_SB_MAGIC         0x5346544e
       OPENPROM_SUPER_MAGIC  0x9fa1
       PROC_SUPER_MAGIC      0x9fa0
       QNX4_SUPER_MAGIC      0x002f
       REISERFS_SUPER_MAGIC  0x52654973
       ROMFS_MAGIC           0x7275
       SMB_SUPER_MAGIC       0x517B
       SYSV2_SUPER_MAGIC     0x012FF7B6
       SYSV4_SUPER_MAGIC     0x012FF7B5
       TMPFS_MAGIC           0x01021994
       UDF_SUPER_MAGIC       0x15013346
       UFS_MAGIC             0x00011954
       USBDEVICE_SUPER_MAGIC 0x9fa2
       VXFS_SUPER_MAGIC      0xa501FCF5
       XENIX_SUPER_MAGIC     0x012FF7B4
       XFS_SUPER_MAGIC       0x58465342
       _XIAFS_SUPER_MAGIC    0x012FD16D
    

    Die Funktion gibt ja nur Nummern aus, also müsste ich das dann noch umbiegen. Also das z.B nicht

    0xEF53
    

    sondern

    EXT2_SUPER_MAGIC
    

    rauskommmt.

    Was mich nur wundert, dass die hier gleich sind?

    EXT2_SUPER_MAGIC      0xEF53
       EXT3_SUPER_MAGIC      0xEF53
    


  • dixidix schrieb:

    Ich will eigentlich nur eine Ausgabe haben, die mir den Namen des Dateisystems zurückgibt.
    Das müsste ich dann wohl irgendwie hiermit verknüpfen.

    Ja, wenn der Name benötigt wird, müsste man das noch in "Klartext übersetzen".

    dixidix schrieb:

    Was mich nur wundert, dass die hier gleich sind?

    Das bedeutet in der Tat, dass diese beiden Systeme nicht unterscheidbar sind. Wenn du es so genau benötigst, dann solltest du vielleicht doch getmntent verwenden, da soll der Name in mnt_fsname zurückgegeben werden.

    MfG,

    Probe-Nutzer



  • ext3 ist das selbe wie ext2, oder besser speichert und organisiert die daten auf exakter art und weise wie ext2. der einzigste unterschied besteht darin, dass ext3 noch ein journal auf der platte speichert und verwaltet. da es aber möglich ist ext3 auch als ext2 zu mounten und man auch mit dem ext2 treiber lesend und schreibend zugreifen kann haben sie die gleiche superblock identifikation. um also ext2 und ext3 zu unterscheiden müsstest auf existenz eines journals testen. wie dass aber im detail funktioniert kann ich auch nicht sagen, vielleicht mal in den sourcen von tune2fs stöbern 🙂



  • du kannst die ext3-journal-datei unter /.journal finden. allerdings wird die normalerweise von dem system versteckt, wenn das ganze als ext3 gemountet ist. bei einem mount für ext2 bin ich mir sicher. die datei ist aber auf alle fälle vorhanden, wenn es ext3 ist.



  • Aha, danke, mal schauen.

    edit: erst mal noch etwas als Grundlage, funktionieren tut das zwar, aber egal was man für einen Mountpoint angibt, es kommt immer das gleiche raus und nicht mal das was in der Liste steht.
    es wird nur diese Zahl ausgegeben:

    16914836
    

    müsste dann dies hier sein

    0x1021994
    

    Muss hier noch was beachtet werden?

    #include <sys/statfs.h>
    #include <iostream>
    
    long getFsType(const char *mountpoint)
    {
            struct statfs s;
    
            statfs(mountpoint, &s);
            return s.f_type;
    }
    
    int main( int argc, char **argv)
    {
    	const char *mp = "/dev/sda";
    	cout<<"Found system "<< getFsType(mp)<<" at " << mp <<endl;
        return 0;
    }
    

Anmelden zum Antworten