raid

The power of Linux

Heute mal etwas völlig anderes: man kennt das ja, da hat man eine externe Festplatte, die man unbedingt frei haben muss, um sie mit neuem Zeug zu füllen und muss sie mindestens für ein, zwei Tage auf dem eigenen Rechner speichern können. Auf der externen Festplatte sind vielleicht 300 GB an Daten und auf dem eigenen Rechner sind noch 350 GB an Plattenplatz frei. Dumm nur, dass sich diese 350 GB auf drei Festplatten verteilen und auf der ersten 200 GB frei sind, auf der zweiten 100 und der dritten ebenfalls.

Was also tun? Man könnte versuchen, den Inhalt von einer Platte auf die andere interne zu kopieren, um so zumindest auf einer genügend freien Platz zu schaffen – aber das dauert und besonders einfach ist das auch nicht immer. Nein.

Praktischer ist es dabei, sich ein billiges Raid-0 (Striping) über Loop-Devices zu basteln, deren Imagedateien auf den drei Festplatten liegen, das man dann mit einem beliebigen, geeigneten Dateisystem formatiert und die externe Festplatte wird darauf gesichert. Das geht standardmässig mit jedem einigermaßen, aktuellen Linux recht einfach.

Zuerst einmal fängt der Spaß damit an, dass man die Imagefiles auf den jeweiligen Festplatten als sog. Sparse File anlegt. Dies macht man praktischerweise mit dem netten Befehl dd:

dd if=/dev/zero of=file1.img bs=1k seek=128M

Das legt ein Sparsefile an, welches maximal 128 GB an Inhalt fasst. Man lege also so drei Sparse-Files auf den verschiedenen Festplatten an, nenne sie meinetwegen file1.img, file2.img und file3.img und passe natürlich auch die Größe an, meinetwegen 150 GB, 100 GB und 50 GB.

Als nächstes muss man dann Linux sagen, dass es diese Image-Files als Loopback-Device zur Verfügung stellt. Wer ein Loopback-Device nicht kennen sollte: damit tut der Kernel so, als sei das Image-File ein weiteres, physikalisches Gerät. Man kann diese Devices also z.B. nutzen, um ISO-Images direkt von der Festplatte zu mounten und auszulesen, eine praktische Sache.

Der Befehl, den wir dazu brauchen, ist losetup, und so sieht das dann auf:

losetup /dev/loop0 /file1.img
losetup /dev/loop1 /mnt/bla/file2.img
losetup /dev/loop2 /mnt/bla2/file3.img

Damit wird dem Device /dev/loop0 die Datei file1.img zugewiesen usw.

Als nächstes müssen wir dann aus den drei Devices ein Raid-0 basteln, was nichts anderes bedeutet als dass der Kernel aus dem Speicherplatz der drei Dateien einen einzigen, zusammenhängenden Bereich generiert, und das geht so:

md-adm --create /dev/md0 --level=0 --raid-devices=3 /dev/loop0 /dev/loop1 /dev/loop2

Damit wird der Kernel angewiesen, mit der Datei /dev/md0 ein Raid-0 zur Verfügung zu stellen, welches sich genau über die drei Loop-Devices erstreckt.

Als letztes formatiere man dann das Raid-Device md0 noch mit einem Dateisystem (hier: Ext4) seiner Wahl, beispielsweise so:

mkfs.ext4 /dev/md0

Und mounte es:

mount /dev/md0 /mnt/backup

Wenn man dann später das Backup nicht mehr braucht, kann man die Imagedateien einfach löschen und der Platz ist wieder frei, und fertig ist die Laube. Schön, nicht wahr?

Ach ja, und wenn man später mal die Dateien doch noch mal zusammen bauen will zum Raid-0, um nach einem Neustart wieder darauf zuzugreifen, muss man nur den Schritt mit losetup ausführen und danach das hier eintippen:

md-adm --assemble /dev/md0 /dev/loop0 /dev/loop1 /dev/loop2

Das ist alles.

PS: Für wen Linux und dessen Kommandozeile ein böhmisches Dorf ist, der sollte besser die Finger davon lassen, bevor er sich noch wichtige Daten zerschießt und ohnehin ist es sinnvoll, immer mindestens ein aktuelles Backup zur Hand zu haben! Ihr seid gewarnt!