Virtuelles File System in C schreiben



  • Mechanics schrieb:

    Was willst du denn überhaupt schreiben? Ein richtiges "Dateisystem", also einen Treiber, der dein Dateisystem dann allen Programmen zur Verfügung stellt (z.B. wie True Crypt) oder eine Containerdatei, auf die nur dein Programm zugreifen direkt kann?

    Wo ist der Unterschied? *

    Mit betriebssystemspezifischen Mitteln kann diese Containerdatei auch als echtes Dateisystem gemounted werden. Gibt zwar etwas Extra-Code, aber der ist unabhängig von der restlichen Logik. Grundsätzlich ist es das gleiche.

    * Der Unterschied ist, dass TrueCrypt ein vorhandenes Dateisystem wrappt, aber darauf wolltest du (nach meinem Verständnis) nicht heraus.

    @SeppJ: Bin ich wohl zu jung für deine rhetorische Antwort. Das mit dem Backuparchiv hatte ich aus "./vdv ARCHIVE create SIZE" abgelesen.



  • databasa schrieb:

    Mechanics schrieb:

    Was willst du denn überhaupt schreiben? Ein richtiges "Dateisystem", also einen Treiber, der dein Dateisystem dann allen Programmen zur Verfügung stellt (z.B. wie True Crypt) oder eine Containerdatei, auf die nur dein Programm zugreifen direkt kann?

    Wo ist der Unterschied?

    Das ist ein gewaltiger Unterschied. Es gibt keine "Containerdateien", die ein Betriebssystem von Haus aus mounten könnte, schon gar nicht Windows. Du kannst höchstens ein Image von einem Datenträger, das ein dem Betriebssytem bekanntes Dateisystem enthält mounten. Du könntest aber nicht mit Betriebssystemmitteln eine Zip Datei als Dateisystem einhängen. Würde unter Linux mit fuse zwar recht einfach gehen, gehört aber nicht zum Betriebssystem.
    Was der TE machen will, ist mir eben nicht klar. Unter einem "virtuellen Dateisystem" würde ich mir erstmal irgendwas vorstellen, was man auch über eine Dateisystem API ansprechen könnte, z.B. Onlinespeicher. Vielleicht will der TE ja sowas schreiben. Oder er hat einfach keine Ahnung, wie er Daten in seinem Programm speichern kann und meint, er bräuchte ein "virtuelles Dateisystem".



  • Mechanics schrieb:

    Es gibt keine "Containerdateien", die ein Betriebssystem von Haus aus mounten könnte, schon gar nicht Windows. Du kannst höchstens ein Image von einem Datenträger, das ein dem Betriebssytem bekanntes Dateisystem enthält mounten.

    Ich kann aber Windows einen Datenträger vorgaukeln 💡

    Bsp: https://www.eldos.com/cbfs/



  • databasa schrieb:

    Mechanics schrieb:

    Es gibt keine "Containerdateien", die ein Betriebssystem von Haus aus mounten könnte, schon gar nicht Windows. Du kannst höchstens ein Image von einem Datenträger, das ein dem Betriebssytem bekanntes Dateisystem enthält mounten.

    Ich kann aber Windows einen Datenträger vorgaukeln 💡

    Bsp: https://www.eldos.com/cbfs/

    Ja, aber eben nicht mit Bordmitteln. Und das läuft ja darauf hinaus, was ich sagen wollte. Ob man den Datenbanktreiber selber schreibt, oder so ein Callback FS benutzt, ist relativ egal (letzteres ist aber einfacher zu implementieren).


  • Mod

    Dann abstrahiert man eben (ich hätte gedacht, das hat der TE so vor): Man schreibt den Kernel des Dateisystems so, als würde er auf einem allgemeinen Blockdevice laufen. Für die virtuelle Testimplementierung wird über die Schnittstelle auf die Datei zugegriffen.



  • C_Mond schrieb:

    Hallo,
    ich möchte ein virtuelles Dateiverwaltungssystem in C schreiben.

    Das ist gut. Sinnvollerweise hast Du eine gute Datenstruktur als Kern im Gedanken. Bayer-Bäume natürlich. Oder erweiterbare Hashtables. Oder noch besser.

    C_Mond schrieb:

    Allerdings ist mein Kenntnisstand nicht so umfangreich. Ich habe gute Grundkenntnisse in C also könnte jede einfachere Programmieraufgabe wohl lösen unter Zuhilfenahme von google.

    Dann wäre es interessant, um was es überhapt geht. Für das Game kannste alle Dateinamen als integer haben und die ersten 4k als Tabelle an due Dateianfänge benutzen und fertig.

    C_Mond schrieb:

    Hierfür fehlt mir noch ein bisschen die Vorstellungskraft.
    Also: ich möchte eine Datei haben, in der meine Inhalte stehen und eine Datei, die die Inhalte verwaltet.

    Sehtr gut. Besser ist das, es zu trennen. In zwei Dateien oder sogar mehr.

    C_Mond schrieb:

    Die ersten beiden Fragen, die sich für mich hier ergeben sind:
    Wie lege ich meine virtuellen Inhaltsdatei an? Angenommen, ich möchte, dass die Datei 4096 Byte groß ist (für den Anfang).
    Wie lege ich so eine Datei an, dass sie eine bestimme Größe hat? Und selbst wenn es ein virtuelles Verwaltungssystem ist, dann werden die Inhalte doch letzendlich doch auf der Festplatte abgelegt oder?

    Klar. Das ist der Sinn der Veranstalung.

    C_Mond schrieb:

    Zweite Frage: Wie erstelle ich eigene Befehle in C? Also nehmen wir mal an mein Programm heißt "vdv" (virtuelle Dateiverwaltung) und ich möchte einen Befehl haben wie: ./vdv ARCHIVE create SIZE

    Dieser Befehl soll dann die beiden Dateien im angegebenen ARCHIVE erstellen. Wo muss dann der Code stehen also woher weiß die Konsole, was create für ein Befehl ist?

    Versteht ihr ein bisschen was ich meine?
    Würde mich über eure Tipps sehr freuen

    Uih, das sind große Pläne. Kanns nicht glöaiben, dass Du das willst. Wozu?



  • vielen Dank für eure rege Beteiligung
    Dazu, dass ich wenig weiß. Ich habe bereits einige Teile des Buches C von A bis Z durchgearbeitet, die ich für das erste Semester brauchte.

    Und das ist eine feste Aufgabenstellung, also Sinn hin oder her, ich muss diese Aufgabe lösen. Natürlich weiß ich, dass das ein großes Maß an Eigenengagement benötigt nichtsdestotrotz würde ich mich freuen, wenn ihr mir mit eurem Wissen weiterhelft.

    Also zu diesem Missverständnis zu den Archiven. Nein es soll kein Archivierungssystem sein man soll die Dateien schon löschen können (und noch ein paar andere Sachen).

    Außerdem soll die store-Datei immer gleichbleibend groß sein während die system-Datei je nach ausgeführter Operation wächst oder schrumpft.

    Und nun nochmal zu den Befehlen am Beispiel
    ./vdv ARCHIVE create SIZE
    Ich wusste zuerst nicht ob das einfach nur Parameter sind und dass ich dann in meinem C-Programm abprüfe ob der Parameter "create" ist und abhängig davon bestimmte Programmteile ausführe.

    In der Aufgabenstellung steht es so:
    Ihr Programm mit dem Namen vdv muss folgende Parameter akzeptieren:
    > ./vdv ARCHIVE OPERATION [Parameters]

    wobei ARCHIVE "der Pfad und Dateiname (ohne Endung) zu den Dateien ist, die das VDV enthalten/verwalten"

    Ich werde erstmal versuchen einfach nur die beiden Dateien zu erstellen.



  • Wenn es sich um eine konkrete Aufgabe handelt, dann poste die konkrete Aufgabe + Zeitrahmen. Dann kannst du auch konkrete Fragen bezueglich der Aufgabenstellung stellen.


  • Mod

    C_Mond schrieb:

    Ich habe bereits einige Teile des Buches C von A bis Z durchgearbeitet, die ich für das erste Semester brauchte.

    Offtopic: Gut, dass du es noch nicht ganz gelesen hast. Schmeiß es schnell weg und besorg dir ein Buch, mit dem du C lernst.
    http://www.c-plusplus.net/forum/272350



  • Amoeba/Sprite/Plan9 sind verteilte (experimentelle) Betriebssysteme mit verteilten Dateisystemen. Gibt es auf Citeseer oder sonstwo jede Menge akademische Dokumente darüber. Damit kannst du eine dir eine gewisse Ahnung vom Problemunfang einlesen. Apache Hadoop für Java ist ein verteiltes Dateisystem für Terra bis Petabyte. Da kannst dur dir auch etwas einlesen, um Ideen zu bekommen oder Problemfelder zu bekommen.

    Ich fürchte das Ganze dürfte eine Nummer zu groß werden. Du kannst vielleicht einen simplistischen Prototyp erstellen um das konzeptionell anzureißen, weil du das Themengebiet besser verstehen willst. Aber ob es das bringt ..

    -- Saxo



  • @Saxo: ich les jetzt nirgends raus, dass er ein komplexes verteiltes Dateisystem implementieren will. Ich les da immer noch eher raus, dass er einen trivialen Container bauen will.



  • Mechanics schrieb:

    @Saxo: ich les jetzt nirgends raus, dass er ein komplexes verteiltes Dateisystem implementieren will. Ich les da immer noch eher raus, dass er einen trivialen Container bauen will.

    Ach so, dann verstehe ich nicht wofür das ist ... 😉



  • Es geht bei der Aufgabe darum eine Konsolenanwendung zu schreiben, welche ein "VFS" erzeugt, in diesem Fall eine Datei fester größe in der die Daten gespeichert sind (Speicher) und eine Datei variabler Größe in der die Attribute stehen (Verwaltung) wie z.B. der Dateiname, die Stelle in der Speicherdatei an der die Daten stehen, Dateilänge etc.
    Es sollen mehrere Befehle möglich sein:
    Create soll ein solches VFS initialisieren, d.h. diese zwei Dateien erstellen
    Add soll den Inhalt einer Datei in die Speicherdatei schreiben und Attribute zu dieser Datei in die Verwaltungsdatei
    Free gibt den freien Speicherplatz wieder
    Used gibt den belegten Speicherplatz wieder
    Get soll bestimmte Daten aus der Speicherdatei auslesen und in eine einzelne Datei "output" schreiben
    Und noch einiges mehr.. Bin wie man vielleicht unschwer erkennen kann auch an dieser Aufgabe dran 😉 Die Befehle create,add, etc. musst du halt als Argument aus der Kommandozeile einlesen und in der main-Methode abfragen und die gewünschte Funktion ausführen. Hilfreich dazu ist vll http://openbook.galileocomputing.de/c_von_a_bis_z/013_c_kommandozeilenargumente_001.htm#mjf6a9e42fa3bc25b2b1e06270e7bf8f68
    Damit die Speicherdatei eine feste Größe hat hab ich einfach mit malloc einen Speicherplatz der eingegebenen Größe reserviert und in die Datei geschrieben, stoße da aber auf Probleme bei sehr großen Werten. Für die Funktionen free und used musst du halt die Größen der Dateien in der Verwaltungsdatei auslesen und zusammenrechnen, dazu könntest du dir vielleicht mal anschauen wie man Strings zerteilt dann sollte das auch klappen 😃


  • Mod

    Suchst du einfach nur tar?
    http://en.wikipedia.org/wiki/Tar_(computing)
    (Oder auch eine anderes Archiv? Siehe weiterführende Links)

    Kann man selber implementieren, sollte auch nicht zu schwer sein. Man kann natürlich auch den bequemen Weg gehen und den fertigen High-Tech-Reifen montieren, anstatt ein grob gehauenes Steinrad.

    Hilfreich dazu ist vll http://openbook.galileocomputing.de/c_von_a_bis_z/013_c_kommandozeilenargumente_001.htm#mjf6a9e42fa3bc25b2b1e06270e7bf8f68

    "Hilfreich" und "Galileo Computing" und erst recht "C von A bis Z" gehen nicht zusammen. Vergiss die Seite lieber ganz schnell, ebenso alle Bücher von dem Autor und die meisten Bücher von dem Verlag.
    Autor, Verlag und Seite sind bekannt als Ursache vieler Fehler, die hier im Forum auftauchen.



  • SeppJ schrieb:

    "Hilfreich" und "Galileo Computing" und erst recht "C von A bis Z" gehen nicht zusammen. Vergiss die Seite lieber ganz schnell, ebenso alle Bücher von dem Autor und die meisten Bücher von dem Verlag.
    Autor, Verlag und Seite sind bekannt als Ursache vieler Fehler, die hier im Forum auftauchen.

    Ach, das Buch ist doch recht erheiternd. Aus dem Link:

    /* 1.Zahl in einen Integer konvertieren*/
       erg = strtol(argv[1], NULL, 10);
       if( erg == 0 ) {
          printf("Keine gültige Ganzzahl ... \n");
          return EXIT_FAILURE;
       }
    

    Und der Witz ist, dass es sich bei diesem Programm um einen Taschenrechner handelt. Der leider nicht mit 0 rechnen kann 😃



  • Ich denke nicht das wir tar-Archive verwenden sollen, es ist angegeben die Speicherdatei mit der Endung .store anzulegen. Zu der Lektüre kann ich nicht allzu viel sagen, aber zum Teil hab ich dort schon gut brauchbare Infos erhalten.



  • filzstift schrieb:

    Ich denke nicht das wir tar-Archive verwenden sollen, es ist angegeben die Speicherdatei mit der Endung .store anzulegen.

    Ja und? Das ist dasselbe in grün. Ihr sollt also ein tar schlecht nachprogrammieren.



  • Mag sein, wie würde man denn da mit der Speicherung der Dateien vorgehen? In welchem Format kann ich die in dieser .store Datei abspeichern und nachher auch wieder korrekt auslesen? Die Struktur ist in Blöcke fester Größe an Bytes aufgeteilt



  • @filzstift: wer bist du denn? scheint wir sind grad an derselben aufgabe 🙂

    @alle anderen: es wäre wohl etwas zu umfangreich die ganze aufgabenstellung hier zu posten, da sie knapp 8 seiten lang ist.

    Ich würde lieber einzelne Fragen posten, mit denen ich nicht weiterkomme.
    Der Zeitrahmen geht bis 14. Oktober allerdings möchte ich es schon beim ersten Termin abgeben und das ist der 7.7.

    im Moment habe ich das Problem, dass ich Microsoft Visual Studio C++ Express installiert habe und darauf meine Anwendung nicht läuft leider.

    Der Code sieht im Moment so aus:
    [code="c"]#include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <io.h>
    int create(char *pfad, int size, int count);
    int add(char *pfadVFS, char *source, char *target);

    int main(int argc, char *argv[]) {
    int rueckgabe = 0;

    printf("Kommt in der main an");
    // Eingabefunktion überprüfen
    if(strcmp(argv[2], "CREATE")) {
    printf("Erkennt den CreateBefehl");
    rueckgabe = create(argv[1], atoi(argv[3]), atoi(argv[4]));
    }
    if(strcmp(argv[2], "ADD")) {
    rueckgabe = add(argv[1], argv[3], argv[4]);
    }
    else {
    rueckgabe = 1;
    }
    scanf("Beliebige Taste drücken für weiter");
    return rueckgabe;
    }
    [/code="c"]

    Ich bin so vorgegagen:
    Neues Projekt >> Win32-Projekt >> Name eingeben >> OK >>
    Dann kommt so ein Text: "Dies sind die aktuellen Projekteinstellungen:
    Windows-Anwendung
    Klicken Sie auf Fertig stellen in einem beliebigen Fenster, um die aktuellen Einstellungen zu bestätigen. "

    > Zusätzliche Optionen: Leeres Projekt

    neue Quelldatei erzeugen: code einfügen

    rechtsklick auf das Projekt >> Einstellungen >> Debuggen >> Befehlsargumente mitgeben: pfad CREATE zahl zahl

    Dann wollte ich das Programm laufen lassen aber es kommt folgende Meldung:

    1>MSVCRTD.lib(crtexew.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_WinMain@16" in Funktion "___tmainCRTStartup".
    1>c:\test\eigene dateien\visual studio 2010\Projects\VFS\Debug\VFS.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    Anscheinend stimmt was bei den Einstellungen nicht. Aber was??
    Habe auch schon versucht mainCRTStartup als Einstiegspunkt mitzugeben. Funktioniert nicht.



  • ich habe gerade versucht unter
    Linker >> System >>Subsystem von /SUBSYSTEM:WINDOWS auf /SUBSYSTEM:CONSOLE umzustellen

    dann kommt er zwar bis zur main aber nicht weiter:
    "VFS.exe": "C:\test\Eigene Dateien\Visual Studio 2010\Projects\VFS\Debug\VFS.exe" geladen, Symbole wurden geladen.
    "VFS.exe": "C:\WINNT\system32\ntdll.dll" geladen, Cannot find or open the PDB file
    "VFS.exe": "C:\WINNT\system32\kernel32.dll" geladen, Cannot find or open the PDB file
    "VFS.exe": "C:\WINNT\system32\msvcr100d.dll" geladen, Symbole wurden geladen.
    Das Programm "[3372] VFS.exe: Systemeigen" wurde mit Code -858993460 (0xcccccccc) beendet.


Anmelden zum Antworten