home
erste Version am 01.10.2014
letzte Änderung am 11.10.2014

FillBD2


FillBD2 ist ein Tool, um eine Zusammenstellung von Dateien zu finden, deren Gesamtgröße möglichst nah unterhalb einer definierten Größe liegt.
Diese definierte Größe wird üblicherweise durch einen externen Datenträger wie etwa DVD oder BluRay vorgegeben und das Ziel ist es, diesen externen Datenträger möglichst maximal zu füllen bzw. eine Datei-Zusammenstellung zu finden, die keinen ungenutzten Speicherplatz übrig läßt.

FillBD2 ist die Weiterentwicklung von fillBD und erweitert dieses um ein grafisches Frontend.
Außerdem wurde die Berechnung des benötigten Speicherplatzes für die Datei- und Verzeichnis-Namen (im Directory) so implementiert, dass sie mit den Dateisystemen FAT32, UDF2.01 und ISO9660 mit Joliet und Rock Ridge sowie UDF1.02 umgehen kann.



Inhalt
  1. Voraussetzungen
  2. Das Programm und seine Bedienung
    1. Erstellung einer ISO-Datei mit UDF 2.01 Dateisystem
    2. Erstellung eines verschlüsselten Containers mit FAT32 Dateisystem
  3. Setup Profiles / Einstellungen

Ein paar Zusatzinfos bzgl. meiner Dateisystem-Analysen habe ich in ein eigenes Dokument ausgelagert.

Voraussetzungen

Es wird ein Python-Interpreter in der Version 2.7.x benötigt.
Für das GUI wird wxWidgets (bzw. wxPython) in der Version 2.8 benötigt.
Als Datenbank kommt sqlite3 zum Einsatz.

Für mkisofs wird benötigt:
    udftools-1.0.0b3-153.1.1.x86_64
Und genisoimage benötigt:
    genisoimage-1.1.11-8.1.2.x86_64
Verschlüsselte Container mit FAT32-Dateisystem können mit realcrypt erstellt werden:
    realcrypt-7.0a-3.80.x86_64

Und natürlich das Archiv mit den Programm-Files.



Das Programm legt zwei Dateien im Home-Verzeichnis an.
.fillBD.conf
In dieser Datei werden die Fenstergröße und Position, das zuletzt verwendetes Profil und weitere Einstellungen gespeichert.

.fillBD.conf.sqlite
In dieser Datei werden Profile gespeichert.


Das Programm und seine Bedienung

Ziel bei der Entwicklung von FillBD2 war es, zum einen fillBD mit seiner recht starren Konfiguration abzulösen und gleichzeitig spontane Zusammenstellungen von zu sichernden Dateien zuzulassen. Allerdings sollte sich der Bedienungs-Aufwand zu fillBD für den Standard-Fall nicht erhöhen - wobei den Standard-Fall "die Sicherung von Dateien in wenigen definierten Verzeichnissen" darstellt.
Das wurde dadurch erreicht, dass die zu sichernden Dateien entweder durch Drag&Drop (spontan) oder durch Profile (Standard-Fall) bestimmt werden können.
Innerhalb sog. Source-Profiles können Verzeichnisse definiert werden, in denen sich zu sichernde Dateien befinden.
Innerhalb sog. Target-Profiles kann je ein Verzeichnis mit einer Maximalgröße und einer Blockgröße definiert werden.
Siehe dazu das Kapitel Setup Profiles.

Nach Aufruf des Programms FillBD2.py öffnet sich folgendes Fenster (Bild zum Vergrößern anklicken):
mainWindow

Das Fenster besteht primär aus zwei Listen:
Als erster Schritt ist immer zunächst das Ziel-Medium (bzw. Target) auszuwählen, um darüber die zu verwendende Blockgröße für das Ziel-Dateisystem festzulegen. Die Blockgröße des Ziel-Dateisystems muss dem Programm deswegen so frühzeitig bekannt sein, weil die Größe der zu sichernden Dateien direkt bei deren Aufnahme in das Programm auf die Blockgröße des Ziel-Dateisystems umgerechnet wird.

Die Auswahl des Buttons "Choose Target" und darin Auswahl eines Ziel-Verzeichnisses (oder Mount-Points) führt z.B. zu folgendem Dialogfenster-Inhalt:
Fenster Profil-Anpassung

Ganz oben wird das Profil ausgewählt, darunter werden dessen Einstellungen angezeigt.
Nachdem ein "Target Folder" gewählt wurde, erscheinen im selben Bereich die Daten des zugehörigen Dateisystems (zur Info).
Im untersten Block wird definiert, welche Parameter für den Ziel-Datenträger gelten sollen.

Der Ok-Button ist erst dann auswählbar, wenn hinter "Select Target Folder" ein Verzeichnis eingestellt ist und ganz unten sowohl eine "Size" als auch eine "Blocksize" eingestellt sind.
Die farblich gekennzeichneten Felder für "Size" und "Blocksize" reagieren auf Doppelklick.
Dieser führt dazu, das der jeweilige Wert in das entsprechende Feld Target Size / Blocksize kopiert wird.

Über eine weitere farbliche Markierung werden Felder mit fehlerhaften Inhalten markiert.
In diesem Fall ist der Mauscursor über das Feld zu bewegen, um den Fehler angezeigt zu bekommen.
Fehlermeldung mit MouseOver

Nachdem die relevanten Daten für das Ziel (Verzeichnis bzw. Mountpoint, Kapazität, Blockgröße und ggf. Dateisystem) feststehen und das Dialogfenster mit Ok verlassen wurde, wird im Hauptfenster der linke große Bereich als Ziel für Drag&Drop von Dateien oder Verzeichnissen freigeschaltet.
Ebenfalls freigeschaltet wird die Auswahl-Liste "Source Profile".

Hauptfenster mit zu sichernden
        Dateien und Ordnern
Für die Dateien und Verzeichnisse im linken Bereich werden Pfad, Name, Größe und benötigter Speicherplatz auf dem eingestellten Zieldatenträger angezeigt.
Dieser benötigte Speicherplatz ist immer etwas größer, als die Dateigröße. Zum einen muss die Dateigröße auf die Blockgröße des Zieldatenträgers aufgerundet werden, zum anderen muss auch der Datei- oder Verzeichnis-Name im Directory Platz finden bzw. das Directory Blockgröße-weise vergrößert werden.

Vor den Verzeichnissen wird ein Icon dargestellt.
Icons Es gibt ein Icon für Dateien,
eins für Verzeichnisse und
eins für Verzeichnisse, in denen Dateien oder Unterverzeichnisse enthalten sind, die nicht gelesen werden können (entweder wegen Berechtigung oder wegen illegalem Encoding).
Beim Einfügen von Dateien oder Verzeichnissen via "Source Profile" oder via Drag&Drop wird zusätzlich eine Warnmeldung ausgegeben, wenn illegale Objekte eingefügt werden sollten.
Popup-Meldung mit fehlerhaften
        Dateinamen
Solche Dateinamen mit illegalem Encoding kommen gerne mal zustande, wenn Dateien von Windows-Rechnern kopiert wurden.

Werden Dateien auf dem Programmfenster fallen gelassen, die bereits [indirekt] enthalten sind, gibt es ebenfalls eine Fehlermeldung.
Indirekt enthalten meint: wenn beispielweise das Verzeichnis "/home/dede" bereits enthalten ist und dann die Datei "/home/dede/bin/bwm2.py" zugefügt werden soll, führt das zu einer Fehlermeldung und "/home/dede/bin/bwm2.py" wird nicht erneut zugefügt.
Umgedreht passiert das ebenfalls - aber etwas anders. Wenn "/home/dede/bin/bwm2.py" bereits enthalten ist und dann das Verzeichnis "/home/dede" zugefügt werden soll, wird "/home/dede/bin/bwm2.py" entfernt und stattdessen "/home/dede" aufgenommen.

Die letzte Fehlermeldungsart sind Dateien oder Verzeichnisse aus unterschiedlichen Quell-Verzeichnissen, die auf dem Zielmedium identische Namen haben würden.
Enthalten beispielsweise die Verzeichnisse "/ISOs/Downloads" und "/1.5TB/downloads" jeweils ein Unterverzeichnis mit dem Namen "python", kommt es dann zu einer Fehlermeldung, wenn der zweite Verzeichnisinhalt zugefügt wird. Schließlich können nicht zwei gleichnamige Verzeichnisse (auf gleicher Ebene) auf dem Zielmedium existieren.

Um Dateien und / oder Verzeichnisse auf die rechte Seite zu verschieben, kann entweder direkt die Automatik von "Fill Target" genutzt werden, es können aber auch zuvor einzelne Dateien mittels Kontextmenü + "move to destination list" manuell der Ziel-Liste zugefügt werden. Das ist z.B. dann sinnvoll, wenn einzelne zusammengehörige Dateien zusammen auf einem Datenträger gesichert werden sollen.
Zurückschieben von rechts nach links funktioniert analog.

Kontextmenü links
Kontextmenü rechts
Kontextmenü links
Kontextmenü
                rechts

Die Auswahl von "Fill Target" sucht nach einer Zusammenstellung, die das eingestellte Zielmedium maximal füllt.
Der Fortschritt dieser Suche wird in folgendem Fenster dargestellt:
Fenster Füll-Fortschritt
Pro Datei oder Verzeichnis wird ein Zeichen angezeigt, sortiert nach Größe (aufsteigend).
Das Minuszeichen bedeutet "nicht enthalten", das X steht für "wird der Zusammenstellung zugefügt".
Ganz rechts erscheint die jeweilige Restkapazität auf dem Zieldatenträger.
Eine neue Zeile wird immer dann ausgegeben, wenn eine Zusammenstellung mit kleinerer Restkapazität gefunden wurde.
Bei mehr als 100 zu analysierenden Dateien werden neue Zeilen (aus Performance-Gründen) nur dann ausgegeben, wenn interessante Änderungen zur vorigen Zeile vorliegen.

Nach Schließen des Status-Fensters mit dem Ok-Button werden die ausgewählen Dateien auf der rechten Seite angezeigt:
Hauptfenster mit ausgewählten
        Dateien und Ordnern
Im rechten Bereich kommen die Spalten "path" und "size(real)" nicht mehr vor. Sie werden hier nicht mehr benötigt.
Die Dateien und Verzeichnisse im rechten Bereich belegen hier zusammen 4.699.517.960 Byte, wodurch sich eine berechnete Restkapazität auf dem Zieldatenträger von 1.016 Byte ergibt.

Nach der Auswahl von "Export" erscheint folgendes Fenster, bei dem bereits "genisoimage" vorausgewählt ist (weil im Profil das "Target Filesystem" entsprechend eingestellt war):
Fenster Export

Weil "genisoimage" eingestellt war, erscheint vor dem eigentlichen Ausführungs-Dialog ein weiterer Dialog, in dem der Name der zu erstellenden ISO-Datei und der darin einzustellende Volume Label angepasst werden kann (Umlaute sind nicht erlaubt):
Fenster VolID-Einstellung

Nach Auswahl des Ok-Buttons öffnet sich der Ausführungs-Dialog, in dem der ISO-Erstellungs-Fortschritt angezeigt wird:
Fenster Image-Erstellung
Bzw. nach dessen Fertigstellung:
Fenster Image-Erstellung
        abgeschlossen

Die entstandene ISO-Datei hat 4.700.370.944 Byte, die Maximal-Größe in diesem Fall (DVD+R) war 4.700.372.992 Byte.
Somit also 2.048 Byte bzw. ein Block ungenutzte Kapazität.

Wird das entstandene Image nun gemountet, zeigt Thunar folgendes an:
Fenster Thunar mit Image-Inhalt
Und disktype zeigt an:
--- /dev/loop0
Block device, size 4.378 GiB (4700370944 bytes)
UDF file system
  Sector size 2048 bytes
  Volume name "my DVD label"
  UDF version 1.02
ISO9660 file system
  Volume name "my DVD label"
  Application "GENISOIMAGE ISO 9660/HFS FILESYSTEM CREATOR (C) 1993 E.YOUNGDALE (C) 1997-2006 J.PEARSON/J.SCHILLING (C) 2006-2007 CDRKIT TEAM"
  Data size 4.378 GiB (4700370944 bytes, 2295103 blocks of 2 KiB)


Weil ich davon ausgehe, dass jeder, der überhaupt auf die Idee kommt, ein Programm wie dieses einzusetzen, weiß, wie ein ISO-File auf DVD gebrannt wird, werde ich hier nicht darauf eingehen.


Erstellung einer ISO-Datei mit UDF 2.01 Dateisystem

Wird stattdessen ein leeres, beschreibbares UDF2.01-ISO mit folgender Prozedur erzeugt:
truncate -s 4700372992 /1.5TB/DVD+R.iso
mkudffs --vid="dede test" /1.5TB/DVD+R.iso
sudo mount /1.5TB/DVD+R.iso /mnt/
sudo chown dede /mnt/
sudo chgrp users /mnt/

# und optional noch:
sudo rmdir /mnt/lost+found/

# Unmount mit:
sudo umount /mnt/

...und unter "Choose Target" der entsprechende Eintrag für DVD+R UDF2.01 gewählt, erscheint nach Auswahl des Export-Buttons zunächst ein Export-Dialog, bei dem "genisoimage" deaktiviert ist:
Fenster Export ohne genisoimage

Direkt nach Auswahl des Ok-Buttons erscheint ein veränderter Fortschritts-Dialog, bei dem im oberen Bereich Status-Informationen angezeigt werden:
Fenster Image-Erstellung (per copy)

Nach dessen Fertigstellung liefert ein "df -h|grep /mnt":
/dev/loop0      4,4G    4,4G   16K  100% /mnt
Also 16KB Restkapazität bzw. 4 ungenutzte Blöcke (von 2.294.428 Blöcken).


Erstellung eines verschlüsselten Containers mit FAT32 Dateisystem

Nachdem über das RealCrypt-GUI ein Container mit z.B. 23.800 MB (für ein BluRay-Medium, das über NeroLinux4 mit UDF1.02 gebrannt werden soll) erstellt und gemountet wurde, kann es mit FillBD2 gefüllt werden. Der Mount sieht etwa folgendermaßen aus:
/dev/mapper/realcrypt1   24347128          8   24347120    1% /tc/Backup 903
Zuerst wird wieder das Zielmedium festgelegt.
Dazu ist unter "Target Profile" einfach das passende Profil auszuwählen.
Weil sich unterhalb von dem im Profil eingestellten Verzeichnis (/tc) nur genau ein Mount befindet, wird dieser automatisch als "Target Folder" eingestellt:
Profile Customization für FAT32

Nach Auswahl des Ok-Buttons kann der linke Bereich via Drag&Drop oder via "Source Profile" mit Dateien und Verzeichnissen gefüllt werden.
Solange (oder sobald) die Summe der Dateigrößen unterhalb der Kapazität des Zielmediums liegt, wird das Feld "sum(size(dest))" mit gelbem Hintergrund dargestellt.
Hauptfenster mit Testdaten
Nachdem ein paar Dateien zur Sicherung eingestellt wurden, kann mit "Fill Target" eine Datei-Zusammenstellung gesucht werden.
Dessen Fortschritt wird im Status-Fenster angezeigt (und braucht weniger als drei Sekunden zur Fertigstellung):
Status-Dialog

Danach sind die ausgewählten Dateien in die rechte Liste verschoben worden:
Beidseitig gefülltes Hauptfenster

Der Export-Dialog ist unspektakulär:
Export-Dialog

Das Kopieren von 25GB in den verschlüsselten Container braucht ein bis zwei Minuten:
Fortschritts-Dialog

Aber der Lohn ist ein randvoller Container, bei dem noch genau ein Block ungenutzt ist. Ein "df -h|grep /tc" liefert:
/dev/mapper/realcrypt1   24G     24G  8,0K  100% /tc/Backup 903


Setup Profiles / Einstellungen

Innerhalb des Setup-Fensters, das über den Button "Setup Profiles" erreicht werden kann, werden sog. Source- und Target-Profiles und eine maximale Rechenzeit festgelegt.
Beim erstmaligen Aufruf legt FillBD2 eine kleine Datenbank zur Aufnahme der Profil-Daten an und stellt bereits ein paar Target Profiles ein.
Setup-Dialog

Die Einträge in beiden Bereichen werden mittels Kontextmenü angelegt, verändert oder gelöscht.
Zum Anlegen eines neuen Source Profiles ist folglich mit der rechten Maustaste in die obere Liste zu klicken, "add new profile" auszuwählen und in dem daraufhin erscheinenden Fenster ein Profilname und mindestens ein Verzeichnis mittels Add-Button einzustellen:
Fenster Source Profile

Analog ist für ein Target Profile zu verfahren. Hier sind die o.a. Parameter des Zieldatenträgers einzustellen:
Fenster Target Profile
Die in diesem Dialog-Fenster eingestellten Werte stellen lediglich Voreinstellungen für den Dialog "Profile Customization" dar bzw. können dort noch angepasst werden.
Der unter "Size" angegebene Wert meint die formatierte Kapazität des Zieldatenträgers.
Durch Markierung einer der Auswahlfelder "Joliet + Rock Ridge", "UDF 1.02" oder "UDF 2.01" wird die Funktion zur Bestimmung des Platzbedarfs für eine Datei gesteuert.
Den Default stellt das Dateisystem "FAT32" dar.
"Joliet + Rock Ridge" und "UDF 1.02" können zusammen oder alleine ausgewählt werden, "UDF 2.01" hingegen nur alleine.
Der mittels "Select Folder" einzustellende Ordner muß existieren und schreibbar sein. Über "<Folder> is the..." wird gesteuert, ob das eingestellte Verzeichnis das endgültige Zielverzeichnis sein soll, oder ob unterhalb von diesem Verzeichnis (ggf. automatisch) das eigentliche Zielverzeichnis ausgewählt werden soll. Befindet sich genau ein gemountetes Dateisystem unterhalb des Verzeichnisses, wird es innerhalb des Dialoges "Profile Customization" automatisch ausgewählt.