Kategorien
Linux

Dateisystem “nachträglich” in RAID1 wandeln

Ich wurde im Februar 2015 bei einem erfolglosen Bewerbungsgespräch Zeuge, wie auf einem Arbeitsplatz-Computer das Dateisystem, welches ohne RAID-Verbund eingerichtet wurde, das System auf mittels mdadm in ein RAID 1 umgewandelt werden sollte.

Ich fand die Idee einen Arbeitsplatz Computer nachträglich, scheinbar direkt nach der Neuinstallation auf ein RAID zu verschieben überflüssig und umständlich.
Persönlich nutze ich lieber das Backup des Systems welches in jedem Fall vorhanden ist um nach einer Neuinstallation des Computers mit Einrichtung eines RAID Verbundes, zur Wiederherstellung der Daten.

Als Fingerübung fand ich die Idee jedoch interessant.
In meinen eigenen Überlegung gehe ich davon aus das im Notfall eine solche Nachträgliche Verschiebung der Daten in ein RAID die offline-Zeit eines Systems zugunsten einiger Arbeit und der zusätzlichen Chance das das System unerkannte Schäden enthält, reduziert werden. Daher ziehe ich auch in diesen Fällen eine saubere Neuinstallation vor.

Während des Bewerbungsgesprächs hörte ich nur ein paar Fetzen, ein Mitarbeiter fragte tatsächlich den Leiter seiner Abteilung wie mdadm und die Grub Installation erfolgreich durchzuführen seien. (Nein, es war ein fest eingestellter Mitarbeiter in der Administration, kein Azubi)

Nach nur zwei Versuchen, die beide erfolgreich waren, kann ich guten Gewissens berichten das die Umstellung eines Systems in ein RAID 1 ist tatsächlich so kompliziert nicht ist.

1.) Partitionierung klonen

Nach dem Einbau der zweiten Festplatte muss die Partitionierung der ersten Festplatte auf die neue Festplatte übertragen werden.

Auf der ersten Festplatte befinden sich 3 Partitionen, Boot, Swap und die eigentliche Datenpartition.

Der folgende Befehl liest die Partitionierung der Festplatte /dev/sda aus und schreibt diese auf die Festplatte /dev/sdb.

sfdisk -d /dev/sda | sfdisk /dev/sdb

“sfdisk -d” gibt die aktuelle Partitionstabelle der Festplatte /dev/sda aus und “sfdisk”, ohne Parameter, nimmt diesen Export und schreibt die Partitionen auf die Festplatte /dev/sdb.
Das die Übertragung der Partitionen erfolgreich war prüfe ich vor dem nächsten Schritt mit Hife der Eingabe von “sfdisk -l /dev/sdb”.

Im Anschluss wechseln wir die Partitions-ID von den für das RAID vorgesehenen Partitionen /dev/sdb1 und /dev/sdb3 auf fd (Linux raid autodetect).
Mit fdisk kann dies über das Kommando t, zum ändern der Partitions-ID, gefolgt von der Nummer der gewünschten Partition, zuerst 1 für die erste Partition später 3 für die dritten Partition, und in Folge die Eingabe der Zeichenfolge fd erfolgen.

fdisk /dev/sdb

Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): fd

Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): fd

Command (m for help): w
The partition table has been altered!

2.) Raid initialisieren

Anschließend erstellen wir das RAID 1 Arrays mit den neuen Partitionen und “mit fehlendem zweiten Datenträger”.
Hierbei ist missing der Platzhalter für die aktuell fehlenden, da “aktiven” und mit den Daten des Systems belegten Partitionen. “-l 1” steht für RAID 1, “-n 2” dafür daß das RAID 1 aus zwei Datenträgern bestehen wird.
(Bei einer minimal-Debian Installation muss mdadm zuvor mit dem Aufruf “apt install mdadm” installiert werden.)

# mdadm -C /dev/md0 -l 1 -n 2 missing /dev/sdb1 --metadata=0.90
mdadm: array /dev/md0 started

# mdadm -C /dev/md1 -l 1 -n 2 missing /dev/sdb3
mdadm: Note: this array has metadata at the start and
     may not be suitable as a boot device. If you plan to
     store '/boot' on this device please ensure that
     your boot-loader understamds md/v1.x metadata, or use
     --metadata=0.90
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
msads: array /dev/md1 started.

3.) Daten übertragen

Nach dem Anlegen der beiden neuen RAID 1 Arrays erzeuge ich ein ext3-Dateisystem auf den neuen Partitionen und erzeuge die neue swap-Partition.:

mkfs.ext3 /dev/md0
mkfs.ext3 /dev/md1
mkswap /dev/sdb2

Nach dem anlegen des Dateisystems können die Datenträger eingehängt werden…

mount /dev/md1 /mnt
mkdir /mnt/boot
mount /dev/md0 /mnt/boot

…und im Anschluss die Daten auf den neuen Datenträger kopieren:

cp --no-dereference --preserve --recursive --one-file-system / /mnt
cp --no-dereference --preserve --recursive --one-file-system /boot/ /mnt/

4.) RAID ergänzen

Wie bereits im ersten Schritt, werden nun die Partitions-IDs angepasst. Diesmal jedoch für die Festplatte /dev/sda auf welcher zuvor noch unsere Nutzdaten gespeichert waren:

fdisk /dev/sda

Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): fd

Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): fd

Command (m for help): w
The partition table has been altered!

Im Anschluss muss in der Datei /etc/fstab für / den Eintrag /dev/md0 und für /boot den Eintrag /dev/md1 hinerlegt werden.

Anschließend kann der Computer neu gestartet werden.

Sobald der Grub2 Bootloader erscheint mit der Taste e den Editor für den Booteintrag atarten. In dem Booteintarg die Zeile “linux /vmlinux-3.3 root=UUID=” in das aktuell verwendete “linux /vmlinux-3.3 root=/dev/md1” korrigieren und im Anschluss mit F10 den Bootvorgang starten.

Das RAID mit den folgenden beiden Befehlen vervollständigen.:

mdadm --add /dev/md0 /dev/sda1
mdadm --add /dev/md1 /dev/sda3

Der erste Aufruf fügt dem RAID Array md0 den Fehlenden Datenträger sda1 hinzu. Nicht schwer zu erraten fügt zweite Aufruf den Datenträger sda3 dem RAID md1 hinzu.

5.) Grub für das neue RAID Installieren

Jetzt abschließend den Grub Bootloader für beide Festplatten konfiguriert und auf diese Installieren.

nur noch die Zeile “GRUB_TERMINAL=console” in der Datei /etc/default/grub auskommentieren und mit den folgenden Befehlen eine neue Grub Konfiguration schreiben.

grub-mkdevicemap -n
update-grub
grub-install /dev/sda
grub-install /dev/sdb

Jetzt kann der Computer auch mit nur einer einzelnen Festplatte, /dev/sda oder /dev/sdb, erfolgreich starten.

Kategorien
Linux

Linux Gedankenstützen

Ersetze <? durch <?php in allen php Dateien

find . -type f -name "*.php" -exec perl -i -pe 's#< \?$#<?php#' {} \;;

Große Dateien Suchen

ls -lahS $(find / -type f -size +10000k);

Dateien finden und löschen

find -name [DATEINAME] -exec rm '{}';

Dateien finden und löschen

find -name [DATEINAME] -exec rm '{}';

Superbloks eines ext2 oder ext3 Dateisystems finden

mkfs.ext2 -n /dev/[DEVICENAME]

Status eines Linux Raid herausfinden

mdadm -Q --scan /dev/md0

Details eines Linux Raid anzeigen

mdadm -Q --detail /dev/md0