Schlagwort-Archive: überschreiben

Squasher – Bash shell script zur Erstellung von Festplatten-Abbildern unter Linux

In den letzten Tagen habe ich meine Bash Shell Scripting Kenntnisse erweitert, sodass ich mir endlich eine schöne Applikation aufsetzen konnte, die das Erstellen von Festplattenabbildern via Linux-Kommandozeile möglichst erleichtert. Dazu genutzt wird dd, welches ja der Alleskönner unter Linux zum Thema Datei/Gerätesicherung, insbesondere von ganzen Festplatten, ist. Da die entstehende Datei dann allerdings genau so groß ist wie die Festplatte und das unter Umständen viel zu groß ist, habe ich noch das Squash-Komprimierungssystem benutzt, welches die Daten nicht nur komprimiert, sondern auch noch on-the-fly mountbar ist, sodass man jeder Zeit auf seine Daten zugreifen kann. Eine genaue Anleitung zur Datensicherung/Auslesung inkl. meines Squasher-Scriptes folgt nun:

1. Wiping empty space

Ein wenig zur Praxis: Werden Dateien/Daten auf einer Festplatte gelöscht, werden sie nicht gleich richtig „gelöscht“, sondern nur deren Dateiindex in der logischen Sektion der Festplatte, in der die Positionen aller Dateien auf der Festplatte stehen. Das ganze läuft unter dem Motto: ich kenne deinen Namen nicht, also kenne ich dich nicht mehr. Aus den Augen, aus dem Sinn. Die Datei existiert praktisch weiter. Zumindest solange, bis die Platte neue Daten darüber schreibt. Da diese Dateien aber bei einer kompletten Plattensicherung mit gesichert werden, aber ja eigentlich nicht mehr gebraucht werden, können wir sie praktisch überschreiben. Optimalerweise mit Daten, die sich viel besser komprimieren lassen, also 0-en. Dann wird das Festplattenabbild um so kleiner. Man nehme also das Zielgerät, welches man sichern möchte, und binde es ein:

sudo mount device zielpfad

Zum Beispiel:

sudo mount /dev/sda1 /mnt

Sollte das ganze ohne Fehler ablaufen, findet ihr den gesamten Platteninhalt nun im Zielpfad, oder in meinem Beispiel unter /mnt.
Dorthin verfrachten wir nun eine Datei, welche ausschließlich 0-en enthält und den gesamten freien Speicher der Platte belegen wird, sodass wirklich alle gelöschten Daten vernichtet sind. Dazu nutzen wir, oh Wunder, dd:

dd if=/dev/zero of=/mnt/tmp.zero bs=4M

Das ganze zeigt praktisch keine Ausgabe und blockiert die Konsole solange, bis die Platte restlos voll ist. Dann gilt es nur noch, die tmp.zero-Datei zu löschen (siehe Plattenstrategie oben):

rm /mnt/tmp.zero

Jetzt noch die Platte aushängen:

sudo umount /mnt

Noch ein wenig zur Erklärung der obigen Vorgänge: /dev/zero ist ein von Linux bereitgestelltes Gerät, welches ausschließlich 0-en ausgibt, egal, wie lange man daran nuckelt. Daher ist es sehr praktisch zur Befüllung von Speicher mit 0-en. Zur Anwendung von dd betrachte man sich bitte das dd-manual, welches beispielsweise direkt vom Ubuntu-Wiki und vielen Anderen zur Verfügung gestellt wird.

2. Saving harddrive

Jetzt greift mein squasher ein: sämtliche Kompression und Sicherung an einen frei wählbaren Ordner übernimmt der squasher. Und das sogar mit einer hübschen Fortschrittsanzeige. Klingt praktisch, oder?
Ladet euch ersteinmal mein Wunderwerk herunter: Squasher
Das ganze jetzt in einen Ordner eurer Wahl gelegt und ausführbar gemacht, beispielsweise mit:

chmod 755 squasher.sh

Um das Script zu nutzen, muss allerdings noch etwas nachinstalliert werden, nämlich die für das eigentliche squashing und das Auslesen des Squash-Systems nötigen Tools:

sudo apt-get update
sudo apt-get install squashfs-tools

Und außerdem, falls nicht sowieso längst vorhanden, die Bash shell:

sudo apt-get install bash

Jetzt sollte alles funktionieren :).
Das Script nimmt als ersten Parameter das Gerät, von welchem ein Backup erstellt werden soll. Der zweite Parameter, welcher optional ist, nimmt die Zieldatei an. Wird keine Zieldatei angegeben, wird die Ausgabe in squasher.squash gespeichert. Wir führen das Script also folgendermaßen aus:

sudo ./squasher.sh /dev/sda2 festplatte.squash

Wichtig dabei ist, dass das Script mit root-Rechten ausgeführt wird, denn sonst wird dd nicht korrekt arbeiten. Aber keine Angst, dass Script warnt euch, falls es nicht als root ausgeführt wird. Es erwartet euch nach kurzem eine wunderhübsche Fortschrittsanzeige, die wie folgt aussieht:

dd: xxx MB, ab,cd MB/s; squashed: ef,ghI

Beispiel:

dd: 250 MB, 65,0 MB/s; squashed: 235M

Die Erklärung dazu: Die dd-Ausgabe im ersten Teil des Fortschrittsbalkens gibt an, wie viel Daten dd schon kopiert hat und wie schnell dd gerade arbeitet. Die squashed-Angabe gibt dazu an, wie groß das squash-Archiv gerade ist. Optimalerweise sind die dd-Werte mit denen der Squash-Ausgabe nicht kompatibel, squash müsste eigentlich immer kleiner sein.
Hinweis: Man kann nicht nur einzelne Partitionen sichern, sondern problemlos auch ganze Festplatten auf einen Rutsch. Dazu einfach die gesamte Platte zum Sichern angeben, also:

sudo ./squasher.sh /dev/sda

Einzig und allein das Auslesen macht hinterher den Unterschied.

3. Reading through treasures

Und beim Auslesen sind wir auch schon angekommen. Wir haben nun ein optimalerweise schön kleines squash-Archiv (im Vergleich zur Originalplatte!) und wollen Daten auslesen, ohne das Archiv erst wieder auf eine physikalische Platte zu schreiben? In voller Größe? Keine Sache:

sudo mount festplatte.squash /mnt

Über die „read-only“-Ausgabe beschweren wir uns nicht weiter. Ja, das System kann im Nachhinein nicht mehr verändert werden, aber das wollen wir ja auch nicht, wir wollen nur Lesen, also was solls. im Ordner /mnt finden wir jetzt das dd-Image, welches von unserem zu sichernden Ziellaufwerk/unserer zu sichernden Partition erstellt wurde.

3.1 Reading partitions

Fangen wir mit dem einfachen an: Das Auslesen von Partitionen. Das ist nämlich ein Witz:

sudo mount /mnt/festplatte.squash.img /mnt2

Fast trivial, findet ihr nicht?
Unter /mnt2 findet ihr jetzt alle gesicherten Daten. Na dann viel Spaß damit :).

3.2 Reading through (hard)drives

Das Auslesen von ganzen partitionierten und gesicherten Platten dagegen erfordert die Installation eines extra Werkzeugs:

sudo apt-get install kpartx

Dieses Werkzeug erlaubt es uns, ein dd-Image mit mehreren Partitionen in seine Ursprungspartitionen zu zerlegen und diese einzubinden. Dazu führen wir aus:

sudo kpartx -a /mnt/festplatte.squash.img

Dieses Kommando bietet uns nun im Ordner /dev/mapper eine Liste von loopback-Geräten an, also unserer Festplatte, beispielsweise loop0 mit einer Partition dahinter, beispielsweise p1. Um nun eine in festplatte.squash.img enthaltene Partition einzubinden, genügt Folgendes:

sudo mount /dev/mapper/loop0p1 /mnt2

Und ihr findet alles, was ihr braucht, in /mnt2

4. Finished!

So, dass wars. Ich hoffe das Tool hilft euch etwas. Nur zur Demonstration, was man beim Sichern einer Platte eigentlich eingeben müsste:

mksquashfs empty_dir festplatte.squash -p 'festplatte.squash.img f 444 root root dd if=/dev/sda1 bs=4M'

Dieses Kommando würde aber auch keine ordentliche Ausgabe liefern, sondern nur eine mksquashfs Ausgabe, die angibt, wieviel bereits gesquashed wurde und welche Kompressionsstärke gerade anliegt. Die dd-Ausgabe sieht man gar nicht. Dazu müsste man ein weiteres Terminal-Fenster öffnen und dort folgendes eingeben:

sudo kill -USR1 $(pidof dd)

Dann wieder zurück in das squash-Fenster, wo auf magische Weise, mitten in der squash-Ausgabe, ein dd-Statusbericht erschienen ist. Nicht gerade schön, oder?
Davon mal abgesehen bietet mein Script auch jederzeit die Möglichkeit zum Abbruch mittels ctrl+c. Dieser Vorgang löscht dann sämtliche Spuren des nicht abgeschlossenen squash-Vorgangs und kehrt wieder in die Konsole zurück, als wäre nichts gewesen. Ein Luxus, wie ich finde…
So, und jetzt viel Spaß beim squashen. Und habt ihr Ideen, Korrekturen oder Wünsche, nutzt die allgegenwärtige Kommentar-Funktion.