Text-Datei füllen mit Größe von Partition

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.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

Hi,
ich hab nur ne kurze Frage wie würdet ihr das machen wenn ihr ne Partition habt von 640 mb und eine Textdatei haben wollt die anzeigt wo belegt ist?
die Datei soll gefüllt werden mit 0 und 1. 1 soll belegt heissen wie würdet ihr dies umsetzen?
ich hab mir überlegt das ich die Datei Zeilenweise mit 0 fülle bis net mehr geht und dann auslese wo welche gefüllten Daten liegen? Hoffe es kann mir jemand nen Tipp geben bin grad ratlos :/
BlackJack

@bluelagoon: Warum nicht einfach für jeden Block der belegt ist, eine 1 schreiben und jeden Unbelegten eine 0?
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

ja wäre auch ne Idee ich bin trotzdem am überlegen wie ich das hinbekomm. :/ dazu muss ich ja 2 Text-Dateien verwenden oder? ich hab mir Gedanken gemacht ob ich in die eine Text-Datei die Freien Blöcke reinschreib die dann ausles und dann in die Datei die mit 0 bis Größe der Partition gefüllt ist die dann überschreiben lasse mit 1 wo eben gefüllt ist ^^

genau das was du sagst will ich erreichen ich hab nur keine Lösung dafür bzw ich denke grad zu kompliziert..
BlackJack

@bluelagoon: Ich habe keinen Endzustand beschrieben sondern den Weg! Öffne die Datei und schreibe für jeden Block der Reihe nach eine 0 oder eine 1 in die Datei. Je nach dem ob der entsprechende Block belegt ist, oder nicht.

IMHO ist eine Textdatei ein ungeeignetes Format. Insbesondere wenn Du so vorgehen willst, dass Du erst eine 0 für jeden Block schreiben willst und dann mit 1en für die belegten Blöcke überschreiben möchtest. Dazu müsste man ja diese Stellen in der Datei direkt ansprechen können, was bei einer Textdatei schwierig wird. Denn entweder sind da Zeilenumbrüche drin — die muss man dann berücksichtigen — oder alle Ziffern stehen hintereinander weg — dann ist die Datei aber als Textdatei total unbrauchbar, weil man die mit kaum einem Texteditor vernünftig betrachten oder bearbeiten könnte. Insbesondere wenn man dort Belegungsinformationen speichert, die bei heutzutage üblichen Partitionsgrössen anfallen. Also ist es selbst mit den ASCII-Werten für '0' und '1' letztendlich eine Binärdatei beziehungsweise sollte wie eine behandelt werden.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

:K
keine Text-Datei sondern eine binärfile. ich les grad mit dumpe2fs aus wo die freien Blöcke liegen so.
Aber woher weis Python wo die belegten sind?
ich seh ja nur die Ausgabe (Beispiel):
Gruppe 91: (Blöcke 2981888-3014655) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
Prüfsumme 0x0b22, 8208 ungenutzte Inodes
Block bitmap in 2621451, Inode Bitmap in 2621467
Inode-Tabelle in 2627115-2627627
32768 freie Blöcke, 8208 freie Inodes, 0 Verzeichnisse, 8208 ungenutzte Inodes
Freie Blöcke: 2981888-3014655
Freie Inodes: 746929-755136
sprich ich weis wo die Blöcke liegen ich weis auch wo die freien liegen, aber mir geht das nicht ein wie sich das umsetzen lassen soll das Python weis wo Anfang is von Block wo Ende und wo ich sage hier 1 da 0 hier 1 da 0. Mein Vorschlag wäre auszulesen wo die Blöcke liegen mit ner if dann die freien herauslesen und dann in ne Datei schreiben?!
BlackJack

@bluelagoon: Tja und da sind wir dann wohl wieder an dem Punkt wo Du versuchen musst jemanden zu überzeugen für Dich zu programmieren, weil Du nicht den blassesten Schimmer von Datenstrukturen und dem Entwurf von Algorithmen hast — und anscheinend auch nicht lernen kannst oder willst.

Die belegten Blöcke sind alle die nicht frei sind. Und welche frei sind, steht in der Ausgabe. Von welcher Blocknummer bis zu welcher Blocknummer die Gruppe geht, über die man diese Informationen hat, steht auch in der Ausgabe. Damit hat man alle Informationen um entscheiden zu können ob ein Block in der Gruppe frei oder belegt ist.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

wieso soll ich jemand überzeugen wollen es für mich zu tun wenn ichs selber machen will?
ich habs nun verändert das zuerst die Gruppen angezeigt werden die Ausgabe muss ich noch splitten ich habe nun if mit and verknüpft aber Datei bleibt leer:

Code: Alles auswählen

  if line.startswith("Gruppe") and line.startswith("    Freie Blöcke:")
kanns sein das man sowas nicht zusammenfassen kann in if? das line das immer wieder überschreibt und dann dabei nichts herauskommt?
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Hallo,

wie kann eine Zeile denn gleichzeitig mit zwei unterschiedlichen Strings beginnen?

Gruß,

brb

P.S.:
Die Variante

Code: Alles auswählen

sudo debugfs  -R "find_free_block 999999999" /dev/sda1
hat zwar handfeste Nachteile (etwa, dass man imaginäre Maximal-Blockzahlen angeben muss), ist für dich aber für den Anfang vll. leichter zu verarbeiten.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

hey Danke für den Tipp :).
ich muss das ganze nur in Python setzen damit in ne Datei umleiten kann damit ich ne "Log" Datei davon habe.
Zuletzt geändert von bluelagoon am Mittwoch 28. September 2011, 08:41, insgesamt 2-mal geändert.
BlackJack

@Barabbas: Die Blockanzahl könnte man mit ``show_super_stats`` heraus bekommen. Die Frage ist, wie praktikabel das von der Geschwindigkeit ist, wenn man zum Beispiel eine neu formatierte 1 TiB-Partition so verarbeiten möchte. :-)

Edit: Und ich sehe gerade dass die Blocknummern ohne Zeilenumbrüche ausgegeben werden. Benötigter Arbeitsspeicher beziehungsweise eine eigene blockweise Lesefunktion müsste man auch berücksichtigen wenn das skalieren soll.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

ich hab mir grad iwie alles verhunzt

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
import os

os.system("dumpe2fs  /dev/sda3 > file.txt")
file = open("file.txt", 'r')
for line in file.readlines():
    if line.startswith("  Freie Blöcke: "):
        datei = open("bitmap.txt", "a")
        datei.write(line)
        datei.close()
textdatei geht nicht auf spinnt iwie?! o.o ah okay hat sich nur kurz aufgehängt.
Danke euch ich versuchs mal weiter zu kommen und meld mich später wieder.

was ist der Unterschied zwischen dem Befehl dumpe2fs /dev/sda2 und sudo debugfs -R "find_free_block 999999999" /dev/sda2
ich bekomm 2 unterschiedliche freie Blöcke?

eig benutzt man doch debugfs für Dateisysteme zum reparieren und dumpe2fs für Informatitionen oder lieg ich da falsch`
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Hallo,

grundsätzlich sollte es, was die freien Blöcke betrifft, keinen Unterschied geben, habe bisher auch keinen festgestellt. Über Einsatzzwecke und Funktionsweise von derartigen Tools gibt idR die Manpage ganz gut Auskunft. Kurz gesagt soll dumpe2fs Informationen ausspucken, während debugfs der Fehlerdiagnose- und Behebung gewidmet ist.

Habe aus Spaß mal so ein 1/0-Schema für meine 640GB HD erstellt. Die Datei ist direkt 170 MB groß (bei 177470055 Blöcken auch nicht anders zu erwarten). Als kleine Reminiszenz an alte Windows-Defragmentierer habe ich das Ganze mal grafisch aufbereitet: click Das JPEG zeigt etwa 41k Blöcke - und damit gerade mal einen winzigen Ausschnit von etwa 160 MB des Dateisystems. Insgesamt benötigt man etwa 4.000 derartiger Bilder, um das ganze Dateisystem abzubilden.

Wie gesagt: Erfüllt alles keinen wirklichen Zweck; aber ganz schön erschreckend, was da für Datenbergen zusammenkommen :)

lG

brb

//edit: Ab Bild 396 gewinnt Grün die Oberhand :)
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

also bei mir gabs unterschiede der letzte block laut debugfs hörte bei ca 5400000 auf bei dumpe2fs bei ca 6400000
nett dargestellt übrigens hehe ^^
ich habs jetz zwar so das ich ne Datei mit 0 füll aber das geht bis unendlich kann mans so irgendwie machen das das bei dem Ende der Partitionsgröße aufhört?

Code: Alles auswählen

a=open(bitmap, 'w+')
b=chr(0)
try:
  while True:
     a.write(b)
except:
    pass
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Du könntest beispiel mit dem Befehl

Code: Alles auswählen

sudo dumpe2fs -h /dev/sda4
die Superblock-Infos der Partition auslesen. Dort gibt es auch ein Feld "Block count" - damit hättest du also die Gesamtzahl der Blöcke. Jetzt musst du deine Endlosschleife nur noch so umbauen, dass maximal $BLOCK_COUNT Nullen geschrieben.

Gruß,

brb

//edit: Du hast geschrieben "Ende der Partitionsgröße" - eigentlich kannst du aber nur "Anzahl der Blöcke" meinen - um die geht es doch, oder?
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Was ist eigentlich damit: http://www.python-forum.de/viewtopic.php?f=1&t=27456
Wurden dir die Antworten zu unbequem und deswegen ein Thread mit anderer Fragestellung der eigentlich das gleiche Problem löst?

Zumindest wenn ich deine Code schnipsel lese sieht es mir nach dem gleichen Thema aus ;)
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

ja das meinte ich. Okay also die block-counts quasi in die Endlos-schleife dann hab ich die ganzen 0?

wie sollte ich eig die Ausgabe von 53504-53599, 53602-53607, 53658, 53696-53759, 58204-58367, 59648-59903, 60160-60415, 60672-60927, 61440-61695, 62720-62975 verarbeiten? das ist ja - dann wieder einzeln dann wieder von bis etc?!

Ausserdem hab ich wohl hier nen Fehler :/

Code: Alles auswählen

file = open("file.txt", 'r')
for gruppeline in file.readlines():
    if gruppeline.startswith("Block count: "):
        blockcount=re.split('^Block count\s*:\s*([0-9]+)', gruppeline.strip())[1]
        print gruppeline
    elif gruppeline.lower().strip().startswith("  Freie Blöcke: "):
        freeblockline=re.multiline('^Free blocks"\s*:\s*([0-9]+)', gruppeline.strip())[1]
a=open("bitmap.txt", 'a+')
b= 0
try:
  while true:
    ergebnis = blockcount * b
    a.write(ergebnis)
except:
    pass
file.close()
Zuletzt geändert von bluelagoon am Donnerstag 29. September 2011, 08:31, insgesamt 1-mal geändert.
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Nein, eine Endlosschleife endet ja nicht. Du möchtest aber, dass sie endet. Mit "umbauen" meinte ich daher: Du brauchst eine Schleife, die exakt so viele Durchläufe produziert, wie es Blöcke gibt. Da könnte man beispielsweise for in Kombination mit xrange nehmen. Oder ein Konstrukt wie "while a.tell() <= blockcount"... (wobei "a" hier deiner Benennung folgt) .
Und offensichtlich musst du Angaben wie "123-456" erst splitten und dann als Anfang bzw. Endwert eines gegebenen Zahlenbereiches interpretieren. Auch hier eignet sich xrange.

Ansonsten die üblichen Fehler: except ohne Angabe abzufangender Exceptions, open ohne with, Schleife ohne Abbruchbedingung, Beklagen über einen Fehler ohne Angabe des Fehlers. Ferner fragt man sich, warum bei jedem Schleifendurchlauf "ergebnis" berechnet wird - und zwar als Produkt der Zeichenkette "blockcount" und 0. Das macht doch überhaupt keinen Sinn?
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

ich muss erstma an die Angabe von den Freien Blöcken dran kommen das ich damit was machen kann aber richtig funktionieren tut das nicht der Fehler liegt sicher im elif Bereich. dann wäre es doch klüger erst die Freien Blöcke in ein xrange zu werfen und dann die einzutragen statt die ganzen Blöcke?
ich komm mit der 0 einfach nicht klar.
wenn ich angeb a.write(blockcount) dann geb ich ja das auch aus bis 640000 bla bla. warum kann ich net einfach sagen 0 * 640000 mach hin un fertig?!
Zuletzt geändert von bluelagoon am Donnerstag 29. September 2011, 08:37, insgesamt 1-mal geändert.
BlackJack

@bluelagoon: Ich würde sagen da ist mehr als ein Fehler drin. Und der Quelltext ist wieder mal ziemlich umständlich. Dass Du zum Beispiel mal davon wegkommen solltest `re.split()` auf diese Weise zum extrahieren von Werten zu verwenden, wurde Dir schon mindestens einmal nahegelegt.

Du liest mit `readlines()` unnötigerweise die gesamte Datei in den Speicher bevor Du anfängst mit den einzelnen Zeilen zu arbeiten.

Der Name `gruppeline` ist ungünstig gewählt, denn nicht jede Zeile hat etwas mit einer Gruppe zu tun. Die Mischung deutsch/englisch ist auch hässlich.

Die Ausgabe von ``dumpe2fs`` besteht aus zwei Teilen: Erst kommen ein paar Metadaten und dann im Verhältnis dazu *viele* Zeilen mit den Gruppeninformationen. Du liest die gesamte Datei ein und iterierst über *alle* Zeilen, nur um aus dem relativ kurzen Teil am Anfang *einen* Wert zu extrahieren. Es wäre deutlich sinnvoller die Datei zu öffnen und erst die Informationen vor den Gruppen zu verarbeiten und wenn die vorbei sind, dann zum Verarbeiten der Gruppen über zu gehen. Das Kriterium für den Übergang zwischen den beiden Abschnitten ist ja sehr einfach zu testen.

Der erste Teil des Programms mag ja noch halbwegs umständlich funktionieren, aber was dann kommt, da hast Du wieder nicht für 25¢ nachgedacht. Das ist semantisch dera@bluelagoon: Ich würde sagen da ist mehr als ein Fehler drin. Und der Quelltext ist wieder mal ziemlich umständlich. Dass Du zum Beispiel mal davon wegkommen solltest `re.split()` auf diese Weise zum extrahieren von Werten zu verwenden, wurde Dir schon mindestens einmal nahegelegt.

Du liest mit `readlines()` unnötigerweise die gesamte Datei in den Speicher bevor Du anfängst mit den einzelnen Zeilen zu arbeiten.

Der Name `gruppeline` ist ungünstig gewählt, denn nicht jede Zeile hat etwas mit einer Gruppe zu tun. Die Mischung deutsch/englisch ist auch hässlich.

Die Ausgabe von ``dumpe2fs`` besteht aus zwei Teilen: Erst kommen ein paar Metadaten und dann im Verhältnis dazu *viele* Zeilen mit den Gruppeninformationen. Du liest die gesamte Datei ein und iterierst über *alle* Zeilen, nur um aus dem relativ kurzen Teil am Anfang *einen* Wert zu extrahieren. Es wäre deutlich sinnvoller die Datei zu öffnen und erst die Informationen vor den Gruppen zu verarbeiten und wenn die vorbei sind, dann zum Verarbeiten der Gruppen über zu gehen. Das Kriterium für den Übergang zwischen den beiden Abschnitten ist ja sehr einfach zu testen.

Der erste Teil des Programms mag ja noch halbwegs umständlich funktionieren, aber was dann kommt, da hast Du wieder nicht für 25¢ nachgedacht. Das ist semantisch derartig unsinnig… Was bitte hast Du Dir dabei gedacht die Datei im 'a'-Modus zu öffnen? Warum gibst Du der 0 einen Namen? Was soll das ``try``/``except`` ohne konkrete Ausnahme welches einfach alle Ausnahmen ignoriert, zum Beispiel auch den `NameError` den Du da hast: Wo wird `true` an einen Wert gebunden!? Wie viel Daten werden wohl insgesamt geschrieben wenn man in einer Endlosschleife Daten in einer Datei schreibt? Nun ja, *wenn* man das tut. Was erwartest Du wie `ergebnis` aussieht!? Lass Dir das mal ausgeben.

Die Bitmap-Datei wird übrigens nicht geschlossen. Die ``with``-Anweisung wurde Dir auch schon gefühlte 1000 mal nahegelegt.
rtig unsinnig… Was bitte hast Du Dir dabei gedacht die Datei im 'a'-Modus zu öffnen? Warum gibst Du der 0 einen Namen? Was soll das ``try``/``except`` ohne konkrete Ausnahme welches einfach alle Ausnahmen ignoriert, zum Beispiel auch den `NameError` den Du da hast: Wo wird `true` an einen Wert gebunden!? Wie viel Daten werden wohl insgesamt geschrieben wenn man in einer Endlosschleife Daten in einer Datei schreibt? Nun ja, *wenn* man das tut. Was erwartest Du wie `ergebnis` aussieht!? Lass Dir das mal ausgeben.

Die Bitmap-Datei wird übrigens nicht geschlossen. Die ``with``-Anweisung wurde Dir auch schon gefühlte 1000 mal nahegelegt.

PS: Das ``elif`` war noch nicht da, als ich angefangen habe das hier zu schreiben, aber das ist ja auch wieder totaler Unsinn an der Stelle…
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

warum soll elif an der Stelle unsinn sein? ich brauch doch die freien Blöcke sowie die gesamte Blockzahl?! ja ich hab alles geändetr nun und funktioniert trotzdem nicht auch wenn Variablen-werte geändert sind. b=chr(0)
weil man keinen Integer in ne Datei schreiben kann weils Fehler wirft.
theoretisch kann ich Variable auch xyz nennen der Name is egal solang es keine Attribute enthält.
Zuletzt geändert von bluelagoon am Donnerstag 29. September 2011, 08:45, insgesamt 1-mal geändert.
Antworten