Virtuelles File System in C schreiben



  • Hallo,

    ich möchte ein virtuelles Dateiverwaltungssystem in C schreiben.

    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.

    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.

    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?

    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



  • 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

    Schau dir mal an, was deiner main so übergeben wird.


  • Mod

    C_Mond schrieb:

    Hierfür fehlt mir noch ein bisschen die Vorstellungskraft.

    Du möchtest etwas programmieren, von dem du nicht weißt, wie es ungefähr geht? 😕 Wenn's den sein soll. Aber erwarte nicht, dass man dir alles erklären wird, du musst auch vieles selber erarbeiten, wofür wir nur Stichwörter liefern können.

    Also: ich möchte eine Datei haben, in der meine Inhalte stehen und eine Datei, die die Inhalte verwaltet.

    Wieso die Trennung? Ein richtiges Dateisystem arbeitet doch auch in einem einzigen, zusammenhängenden Bereich. Das ist doch viel einfacher.

    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?

    😕 Indem du genau diese Menge Daten reinschreibst?

    Und selbst wenn es ein virtuelles Verwaltungssystem ist, dann werden die Inhalte doch letzendlich doch auf der Festplatte abgelegt oder?

    Das liegt gänzlich in deinem Ermessen, was du mit deinen Daten machst. Abspeichern liegt irgendwie nahe, aber du darfst sie gerne auch ausdrucken, als Bild anzeigen oder einfach verwerfen.



  • SeppJ schrieb:

    Wieso die Trennung? Ein richtiges Dateisystem arbeitet doch auch in einem einzigen, zusammenhängenden Bereich. Das ist doch viel einfacher.

    Keine Ahnung, wie heute die modernen Filesysteme arbeiten, aber früher gab es mal ein Dateisystem, dass ein File-Allocation-Table (neben den eigentlichen Daten-Dateien) gepflegt hat.


  • Mod

    Belli schrieb:

    SeppJ schrieb:

    Wieso die Trennung? Ein richtiges Dateisystem arbeitet doch auch in einem einzigen, zusammenhängenden Bereich. Das ist doch viel einfacher.

    Keine Ahnung, wie heute die modernen Filesysteme arbeiten, aber früher gab es mal ein Dateisystem, dass ein File-Allocation-Table (neben den eigentlichen Daten-Dateien) gepflegt hat.

    Das war aber ein fester Bereich im Gesamtbereich (der Partition). Die Verwaltungsdaten und die richtigen Daten waren untrennbar verbunden. Das ist gerade eine Technik, die ich empfehlen würde.

    Was ich aber unbedingt nicht machen würde ist, die Verwaltungsdaten und die Datendaten zu trennen. Ich sehe darin keinen Vorteil, bloß Nachteile in der Handhabung.



  • SeppJ schrieb:

    Was ich aber unbedingt nicht machen würde ist, die Verwaltungsdaten und die Datendaten zu trennen. Ich sehe darin keinen Vorteil, bloß Nachteile in der Handhabung.

    Ich schon, wenn die Daten persistent sind. Am besten geht das, wenn das Dateisystem nur die Operationen DATEI_HINZUFÜGEN und DATEI_ANSCHAUEN unterstützt (ein Backuparchiv z.B., sieht für mich auf den ersten Blick so aus, als wolle der OP so etwas).

    Dann können die Dateien an einem Stück geschrieben werden und die Verwaltungsdaten beschränken sich auf Dateipfad+Lesestart+Grösse)

    DATEI_HINZUFÜGEN verändert die Verwaltungsdaten ein bisschen (die im Idealfall im Arbeitsspeicher gehalten werden) und fügt den "Datendaten" die Datei an.

    DATEI_ANSCHAUEN kennt sofort Start und Grösse und muss genau einmal seeken um die Datei zu lesen.

    Vorteile: Einfach umzusetzen und effizient.
    Nachteile 😕
    (Es skaliert auch: selbst wenn die Verwaltungsdaten nicht mehr in den Arbeitsspeicher passen ist es besser, sie kompakt zu haben und nicht über mehrere Terabytes verteilt)

    Selbst wenn manchmal Dateien gelöscht werden können überwiegen hier mMn die Vorteile dieser Technik.

    In einem Allzweck-Filesystem mögen die Nachteile überwiegen, aber wer sagt, dass der OP das möchte?


  • Mod

    databasa schrieb:

    In einem Allzweck-Filesystem mögen die Nachteile überwiegen, aber wer sagt, dass der OP das möchte?

    Der OP, der ein Dateisystem schreiben möchte, kein Archivierungstool.

    Nachteile 😕

    Du musst als Nutzer beides beisammen halten.

    Wie oft hattest du schon bin-Dateien, zu denen dir das cue sheet fehlte?
    (Das ist vielleicht eher eine (rhetorische) Frage für die Älteren, mir fällt gerade kein aktuelleres Beispiel ein)



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



  • 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 😃


Anmelden zum Antworten