filesystem mounten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

hallo!

ich habe mir gedacht, man koennte ja ein file-object (``gzip.GzipFile`` oder ``bz2.BZ2File``) in dem sich der inhalt einer partition befindet (laufwerk im raw-mode ausgelesen - wie mit 'dd'), als laufwerk einbinden. am wichtigsten ist eine moeglichkeit unter windows, aber ich nehme natuerlich auch vorschlaege fuer linux entgegen. hat vielleicht die 'win32api' funktionen dafuer?

ist, wenn ja, wie, das moeglich?

lg
roschi
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

roschi hat geschrieben:ich habe mir gedacht, man koennte ja ein file-object (``gzip.GzipFile`` oder ``bz2.BZ2File``) in dem sich der inhalt einer partition befindet (laufwerk im raw-mode ausgelesen - wie mit 'dd'), als laufwerk einbinden.
Prinzipiell ja, da würde man einen "Dateisystem-Treiber" (ist allerdings kein richtiger Treiber sondern ein Userspace-Programm, womit du dann auch Python nutzen könntest) schreiben und die Datei mit FUSE einbinden. Dieser Treiber würde den Inhalt der Datei (da wäre ja nur eine Datei) als Block-Device darstellen, was man dann mit ``mount`` einbinden könnte. In der Theorie klingt das zumindest machbar.
roschi hat geschrieben:hat vielleicht die 'win32api' funktionen dafuer?
Puh! Ich denke unter Windows geht das nicht so einfach. Du könntest versuchen herauszufinden wie SftpDrive & Co das machen - vielleicht wird das dort über einen echten Treiber abgewickelt. Wird allerdings wohl wesentlich schwerer zu implementieren sein.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

hallo!

erstmal vielen dank fuer die schnelle antwort.
Leonidas hat geschrieben:Prinzipiell ja, da würde man einen "Dateisystem-Treiber" (ist allerdings kein richtiger Treiber sondern ein Userspace-Programm, womit du dann auch Python nutzen könntest) schreiben und die Datei mit FUSE einbinden. Dieser Treiber würde den Inhalt der Datei (da wäre ja nur eine Datei) als Block-Device darstellen, was man dann mit ``mount`` einbinden könnte. In der Theorie klingt das zumindest machbar.
und in der praxis?
Leonidas hat geschrieben:Puh! Ich denke unter Windows geht das nicht so einfach. Du könntest versuchen herauszufinden wie SftpDrive & Co das machen - vielleicht wird das dort über einen echten Treiber abgewickelt. Wird allerdings wohl wesentlich schwerer zu implementieren sein.
ich hab mir gedacht, ich schau mir das mal bei 'TrueCrypt' an. das ist ja opensource. gesagt - getan: source-code geladen und in den 'driver'-ordner geschaut... ich versteh gar nichts! kannst du mir nicht ein paar infos darueber geben, wie man einen solchen treiber schreibt? geht das ueberhaupt in python? ein paar grundlagen und denkanstoeße waeren nicht schlecht. es muss eben, wie gesagt, vorrangig unter windows laufen.

lg
roschi
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Man kann unter GNU/Linux mithilfe des "Loop" Devices Dateien wie Block Devices behandeln lassen. Wird beispielsweise bei dem Dateisystem "cramfs" benutzt, mitunter bei sogenannten "initrd" Dateien (diese werden genutzt um den Kernel Module zugänglich zu machen beim Booten. Distributionen verlassen sich oftmals auf initrd's, um den Kernel Dateisystem Treiber zugänglich zu machen, ohne die er nicht auf die Platte zugreifen könnte, auf der die Module eigentlich liegen). Das sollte sich mit Gzip Dateien auch machen lassen, aber cramfs existiert bereits, ist frei und hat Datenkompression integriert.

Unter Windows könnte die Sache sich natürlich schwieriger gestalten, aber bei cramfs hast du wohl noch die besten Chancen.
BlackJack

Also erst einmal eignen sich mit gzip oder bzip2 komprimierte Abbilder nicht wirklich zum "mounten" weil man nicht wahlfrei auf die Daten zugreifen kann, sondern das ganze Abbild entpacken muss, mindestens bis zu dem Block auf den zugegriffen werden soll. Also muss die Partition komplett in den Arbeitsspeicher passen.

Ansonsten gibt's unter Linux eine Python-Anbindung an `FUSE`, womit man "Dateisystemtreiber" in Python implementieren kann.
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

BlackJack hat geschrieben:Also erst einmal eignen sich mit gzip oder bzip2 komprimierte Abbilder nicht wirklich zum "mounten" weil man nicht wahlfrei auf die Daten zugreifen kann, sondern das ganze Abbild entpacken muss, mindestens bis zu dem Block auf den zugegriffen werden soll. Also muss die Partition komplett in den Arbeitsspeicher passen.
stimmt - :evil:
kannst du mir dann eine andere art empfehlen, partitionen zu komprimieren und in eine datei zu speichern, um sie von dort dann zu mounten oder sie wiederherzustellen?
BlackJack hat geschrieben:Ansonsten gibt's unter Linux eine Python-Anbindung an `FUSE`, womit man "Dateisystemtreiber" in Python implementieren kann.
das habe ich gesehen. ich habe mir gerade mal 'gmailfs' angeschaut, und finde, das das schon ein bisschen in diese richtung geht. allerdings wird dort ja irgendwas an google gesendet, um die aktionen auszufuehren, und nicht in einer datei rumgeschrieben.
str1442 hat geschrieben:Man kann unter GNU/Linux mithilfe des "Loop" Devices Dateien wie Block Devices behandeln lassen. Wird beispielsweise bei dem Dateisystem "cramfs" benutzt, mitunter bei sogenannten "initrd" Dateien (diese werden genutzt um den Kernel Module zugänglich zu machen beim Booten. Distributionen verlassen sich oftmals auf initrd's, um den Kernel Dateisystem Treiber zugänglich zu machen, ohne die er nicht auf die Platte zugreifen könnte, auf der die Module eigentlich liegen). Das sollte sich mit Gzip Dateien auch machen lassen, aber cramfs existiert bereits, ist frei und hat Datenkompression integriert.

Unter Windows könnte die Sache sich natürlich schwieriger gestalten, aber bei cramfs hast du wohl noch die besten Chancen.
geht aber auch nur unter linux und ich moechte ja am liebsten selber machen :)
trotzdem vielen dank.

lg
roschi
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

roschi hat geschrieben:
Leonidas hat geschrieben:In der Theorie klingt das zumindest machbar.
und in der praxis?
Also sofern man via FUSE Dateien erstellen kann, die ``mount`` als loop-Dateisysteme akzeptiert, und davon gehe ich ja mal aus dann sollte das gehen.
roschi hat geschrieben:ich hab mir gedacht, ich schau mir das mal bei 'TrueCrypt' an. das ist ja opensource. gesagt - getan: source-code geladen und in den 'driver'-ordner geschaut... ich versteh gar nichts! kannst du mir nicht ein paar infos darueber geben, wie man einen solchen treiber schreibt? geht das ueberhaupt in python? ein paar grundlagen und denkanstoeße waeren nicht schlecht. es muss eben, wie gesagt, vorrangig unter windows laufen.
In Python unter Windows? Schätze gar nicht, denn der Treiber müsste im Kernel-Mode laufen und das wird man keinen Python-Interpreter nutzen können.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

roschi hat geschrieben:kannst du mir dann eine andere art empfehlen, partitionen zu komprimieren und in eine datei zu speichern, um sie von dort dann zu mounten oder sie wiederherzustellen?
Partitionen mit dd sind schon ok (vorrausgesetzt die Partitionen haben keine Fehler, dann sollte man etwas anderes als das normale dd verwenden), du brauchst eben ein Kompressionsverfahren mit Random Access. Vielleicht hilft der Artikel ja weiter.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

Leonidas hat geschrieben:
roschi hat geschrieben:kannst du mir dann eine andere art empfehlen, partitionen zu komprimieren und in eine datei zu speichern, um sie von dort dann zu mounten oder sie wiederherzustellen?
Partitionen mit dd sind schon ok
aber da wird doch auch nicht-belegter speicher mitkopiert. wenn ich eine partition mit 20 GB habe, aber nur 5 GB belegt sind, dann kopiert er 20 GB. das will ich ja gerade vermeiden.

zu deinem artikel:
ja, sowas suche ich, aber dafuer gibt es ja keine implementation in python. und um eine zu schreiben, habe ich es noch nicht genau genug verstanden. außerdem nuetzt mir das ja noch nichts, wenn ich unter windows keinen treiber schreiben kann, mit dem ich dann das laufwerk einbinden kann.

lg
roschi
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

roschi hat geschrieben:
Leonidas hat geschrieben:
roschi hat geschrieben:kannst du mir dann eine andere art empfehlen, partitionen zu komprimieren und in eine datei zu speichern, um sie von dort dann zu mounten oder sie wiederherzustellen?
Partitionen mit dd sind schon ok
aber da wird doch auch nicht-belegter speicher mitkopiert. wenn ich eine partition mit 20 GB habe, aber nur 5 GB belegt sind, dann kopiert er 20 GB. das will ich ja gerade vermeiden.
Mit Kompression sollte das kein so großes Problem sein. Unter Linux kann man es eben deswegen so einfach mounten, weil man Partionen direkt aus Dateien einbinden kann. Wenn es dir nur um die Daten geht und du auf sonderliche Metadaten keinen Wert legst, dannst du auch alles in eine Zipdatei schreiben (Zip, da man in Nicht-Solid Zip-Archiven direkt Dateien rausholen kann) und via GVFS einbinden und dann via FUSE mounten, so dass auch Applikationen die kein GVFS unterstützen darauf zugreifen können. Dann hast du dein Problem mit Null Zeilen Python-Code gelöst (na wenn ein 0 Zeilen langes Programm nicht pythonisch ist), weil alles schon implementiert ist.
roschi hat geschrieben:außerdem nuetzt mir das ja noch nichts, wenn ich unter windows keinen treiber schreiben kann, mit dem ich dann das laufwerk einbinden kann.
Die Lösung ist ganz einfach. Windows-Support vergessen. Spaß beiseite, aber ich bezweifle dass du unter Windows mit Python da irgendetwas erreichen kannst. Kannst ja gucken wie SftpDrive das macht, denn möglich ist es ja durchaus. Aber eben nicht platformunabhängig.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

@Leonidas:
plattformunabhaengig muss es ja auch nicht sein.
ich koennte fuer beide systeme verschiedene varianten implementieren.
wie soll ich nachschauen, wie 'sftpdrive' das macht? das ist doch closed-source.
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

roschi hat geschrieben:wie soll ich nachschauen, wie 'sftpdrive' das macht? das ist doch closed-source.
Es gibt Debugger mit denen du feststellen kannst welche API-Calls da verwendet werden - oder fragst einfach die Entwickler. Ansonsten suchst du dir ein Programm mit offenen Quellen, vielleicht macht TrueCrypt das so ähnlich, weiß ich nicht. SftpDrive bindet jedenfalls SFTP-Freigaben als Festplatte im Explorer ein und das schaut auch nach dem besten Weg aus.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lunar

str1442 hat geschrieben:Wird beispielsweise bei dem Dateisystem "cramfs" benutzt
cramfs ist ein normales Dateisystem, das man auf jeder Art von Blockgerät erzeugen kann, sei es ein Loopback-Gerät oder ein "echtes" Gerät. cramfs hat mit dem Loopback-Gerät erstmal nichts zu tun.
mitunter bei sogenannten "initrd" Dateien
Initrds werden nicht als Loop-Gerät angesprochen, sondern als Ramdisk. Der Kernel könnte das gar nicht, da die initrd beim Laden des Kernels bereits im Speicher liegt. Loopback-Geräte werden lediglich dazu genutzt, die initrd zu erzeugen. Allerdings sind initrds veraltet, moderner ist initramfs. Das sind dann normale cpio-Archive.

Die win32api bietet für Dateisystemtreiber mit Sicherheit keine Funktionen an, da Dateisystemtreiber unter Windows im Kernelspace laufen, während win32api der Userspace-Teil von Windows ist. Mit Python ist da unter Windows wenig zu machen.
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

Leonidas hat geschrieben:
roschi hat geschrieben:wie soll ich nachschauen, wie 'sftpdrive' das macht? das ist doch closed-source.
Es gibt Debugger mit denen du feststellen kannst welche API-Calls da verwendet werden - oder fragst einfach die Entwickler. Ansonsten suchst du dir ein Programm mit offenen Quellen, vielleicht macht TrueCrypt das so ähnlich, weiß ich nicht. SftpDrive bindet jedenfalls SFTP-Freigaben als Festplatte im Explorer ein und das schaut auch nach dem besten Weg aus.
na wer sagts denn:
http://chitchat.at.infoseek.co.jp/vmware/vdk.html#top

ich habe es mit floppy-images getestet - und das klappt einwandfrei!
ich verstehe zwar den quellcode des drivers nicht (er ist ja auch in C geschrieben :(), aber wenigstens habe ich jetzt schonmal was quelloffenes! mein ziel ist es ja, das so umzubauen, dass ich eine gute kompression nutzen kann, die aber trotzdem 'random access' erlaubt. koenntet ihr mir eventuell sagen, wie ich das hinbekommen koennte? das o.g. tool ist ja auf jeden fall schon fast das, was ich suche. es fehlt eben nur noch die kompression.

lg
roschi
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Würde es nicht reichen, die NTFS-Kompression einzuschalten?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lunar

Gute Kompression widerspricht wahlfreiem Zugriff. Je größer das Wörterbuch eines Kompressionsalgorithmus, d.h. je mehr Daten der Algorithmus auf einmal in die Kompression einbezieht, desto effizienter ist die Kompression. Das führt aber im Umkehrschluss dazu, dass man auch nur größere Dateienblöcke entpacken kann. Dazu kommt bei den heute verbreiteten Verfahren wie deflate, dass sie bei sich wiederholenden Datenblöcke mit Referenzen arbeiten. Man muss also zwangsläufig größere Teile entpacken, um einen bestimmten Teil der Datei zu lesen.

Am einfachsten wäre es wohl, einfach zip zu nutzen. Das ermöglicht zwar auch keinen wahlfreien Zugriff, aber im Gegensatz zu GNU Tar werden die Dateien erst komprimiert und dann archiviert. Man kann also eine Datei allein auslesen.
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

Leonidas hat geschrieben:Würde es nicht reichen, die NTFS-Kompression einzuschalten?
nein, das soll ja nicht unbedingt auf ntfs-partitionen gespeichert werden.

lg
roschi

[edit]
@lunar:
ich wollte das eigendlich vermeiden...
aber wenn es nicht anders geht...
dann brauche ich noch eine moeglichkeit unter windows gzip/zip-files zu mounten - aber das wird es ja wohl geben, zumal ich bestimmt nicht der erste bin, der danach sucht.
[/edit]

[edit]
gibt es eine quelloffene alternative zu 'Pismo File Mount'?
außerdem: wie kann ich das unter linux bewerkstelligen? sollte ich dort 'AVFS' nutzen? wie mache ich das?
[/edit]
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
farid
User
Beiträge: 95
Registriert: Mittwoch 8. Oktober 2008, 15:37

Wie schon erwaehnt, kann man unter Linux loop benutzen. Unter FreeBSD, kann man sowas mit mdconfig machen:

http://www.freebsd.org/cgi/man.cgi?quer ... ormat=html

Das erzeugt in beiden Faellen ein block device, das man entweder direkt (wenn das OS es unterstuetzt) oder mittels FUSE (das weitere Filesysteme in user space realisiert) mounten kann.

Danach kann man das gemountete Verzeichnis per Samba exportieren und in Windows einhaengen.

Es gibt sicher auch Moeglichkeiten, virtuelle Laufwerke in Windows zu erzeugen. Aber das ist etwas fuer (Windows-)Treiberprogrammierer. Vielleicht gibt's Beispiele im WDK? (C Programmierung erforderlich!)

http://www.microsoft.com/whdc/devtools/wdk/default.mspx
lunar

farid hat geschrieben:Das erzeugt in beiden Faellen ein block device, das man entweder direkt (wenn das OS es unterstuetzt) oder mittels FUSE (das weitere Filesysteme in user space realisiert) mounten kann.
Fuse Treiber laufen im Userspace und haben folglich wie jedes andere Userspace-Programm auch normalen Zugriff auf das Dateisystem. Daher ist für FUSE kein Loopback-Device erforderlich.
farid
User
Beiträge: 95
Registriert: Mittwoch 8. Oktober 2008, 15:37

lunar hat geschrieben:Fuse Treiber laufen im Userspace und haben folglich wie jedes andere Userspace-Programm auch normalen Zugriff auf das Dateisystem. Daher ist für FUSE kein Loopback-Device erforderlich.
Du hast recht: der Umweg ueber ein block device / loopback device um auf eine image Datei zuzugreifen, muss nicht unbedingt sein. FUSE braucht bloss ein Kernel-Modul als hook ins VFS.

Gibt's eigentlich ein FUSE-Modul/Treiber fuer Windows? Das waere sicher ganz praktisch.
Antworten