CD-ROM Treiber schreiben für virtuelles Laufwerk?
-
Hi,
da ich jetzt eine Bibliothek zum lesen von .iso und .mdf/.mds bzw. .cue/.bin Dateien geschrieben habe (in Java, platformunabhängig), möchte ich jetzt für Linux einen Treiber schreiben, welches ein virtuelles Laufwerk wie z.B. mit Daemon Tools erstellt. Ich möchte aber kein loop-back device, sondern dass das Laufwerk bei mir im SuSE 10.1 im Arbeitsplatz angezeigt wird.
Wüsste wer wie ich das realisieren kann?
mfg, thomas
-
Hallo,
virtuelle Laufwerke macht man heute am Besten mit FUSE. Einen JNI Wrapper musst du dir wahrscheinlich selber bauen, allzu groß dürfte der aber eh nicht werden.
Deine Bibliothek finde ich übrigens eine super Idee! Standardkonforme ISOs kann man in Linux ja schon seit Jahren bequem per Loopback einbinden, aber gerade bei MDF oder sonstigen propietären Mistformaten ärgere ich mich immer, wenn ich Windows dafür laden muss.
-
Ja, derzeit kann ich die Image Dateien lesen das heißt Dateien extrahieren, ich hab das ganze so programmiert, dass man es Platformunabhängig in Java durch ein von mir selbstgeschriebenen ISO9660 Treiber laden kann, oder über JNI eben ein Virtuelles Laufwerk erstellen kann. Da ich aber in C/C++ gerade in der Schule erst begonnen habe, wäre es einfacher, wenn ich wüsste, was ich dazu genau brauche, um Virtuelle Laufwerk zu erstellen, die wirklich im Arbeitsplatz als Laufwerk angezeigt werden.
mfg, thomas
-
Hallo,
wenn du nur Java verwendest wirst du es schwer haben an systemnahe Funktionen ranzukommen.
Entweder nutzt du JNI (inklusive native C/C++ Wrapper für Systemfunktionen), oder du benutzt was Linux schon hat.
Du sagstest, dass du die Daten irgendwie im ISO9660 Format aufbereitest? Kannst du nicht ein device node erstellen, welches Daten von deinem Javaprogramm im Hintergrund bekommt und per loop-back device gemountet werden kann?
So müsstest du kein C schreiben, ich bin mir aber leider nicht so sicher wie/ob das geht.Alternativ erstellst du dir mittels Fuse (Filesystem Userspace Utilities) ein virtuelles Laufwerk. Lese- und Schreibzugriffe auf dieses fängst du ab und leitest du an dein Javaprogramm weiter. Das ganze ist recht schmerzfrei machbar - zumindestens vom C Teil.
-
Gut danke für die Antworten. Ich werd mich mal über FUSE schlau machen. Über JNI sollte das ganze dann realisibar und ich denke von der Geschwindigkeit (obwohl es über JNI läuft) auch brauchbar sein.
Mhm, allerdings eine Frage hätt ich schon noch. Ich habe meine Library doch so programmiert, dass es die Sectoren eines Disk Images interpretieren kann (und für den Java Teil auch die Daten die sich drauf befinden). Könnte ich nicht einfach ein stinknormales Kernel Modul für ein Laufwerk verwenden und die Daten die sich in einem Image befinden werden dann vom Linux Kernel (bzw. vom Linux ISO bzw. UDF Treiber) interpretiert? Also wenn der Linux Kernel z.b. Sector 16 anfordert dann brauch ich ihm im Prinzip doch nur diesen auslesen. Das wäre dann find ich einfacher als sich mit FUSE zu plagen, welches anscheinend für Dateisysteme gedacht ist? Ein CD Image ist nämlich im Prinzip eine 1:1 Kopie der originale CD, nur dass die einzelnen Programme diese unterschiedlich abspeichern.
mfg, thomas
-
Hallo,
wie liefert dein Programm die Daten? Werden MDF Dateien on the fly nach ISO konvertiert und abrufbar gestellt? Oder konvertierst du zuerst das ganze Image?
Bei letzterem Fall kannst du das Image mit "mount -o loop image.iso /mnt/cd" in dein System einbinden..
-
hi,
Naja ich hab bei meinem Programm 2 Module:
- Das erste Modul verhält sich wie ein normales CD-ROM Laufwerk und vereinheitlicht alle Disk Images sodass man direkt bei einem Image die Sektoren so ansprechen kann, als würde man Sektoren einer echten CD/DVD ansprechen. Wenn man es so will könnte man sagen, die Daten werden "on-the-fly" interpretiert mit allem was dazugehört: Lead-In, Lead-Out etc. Die Funktionen dieses Modules will ich über JNI Wrappen, damit ich Platformunabhänging nurmehr das Kernel Modul für Windows und für Linux anpassen muss - die Logik bleigt dabei immer gleich (wegen Java).
- Das zweite Modul ist nur für Java gedacht. Es beinhaltet unter anderem den Treiber für das ISO Dateisystem. Man braucht dieses Modul für ein Virtuelles Laufwerk wie man es von Deamon Tools kennt nicht, da der Linux Kernel die Funktion dieses Modules übernehmen soll. Im Prinzip kann man sich dieses Modul wie einen eigenen kleinen Kernel vorstellen, da ich mit 100% Java Images lesen kann.
thx, thomas
-
Hallo,
warum möchtest du ein Kernelmodul bauen?
Du kannst Javacode nicht im Kernelmode ausführen, dein (neues) Modul müsste also dauernd Daten aus dem Userspace in den Kernelspace schieben. Das ist langsam und fehleranfällig.
Wenn du trotzdem auf dem Modul bestehst, suche mal nach Block Devices programmieren.FUSE im Gegenzug dazu arbeitet im Userspace und ist recht schmerzfrei zu verwenden. Diesen Weg würde ich dir empfehlen.
Allerdings nochmal die Frage: Was spricht dagegen, ein MDF File nach ISO zu konvertieren? Dann kannst du schon existierende Mittel ausnutzen und musst das Rad nicht neu erfinden..