Linux Betriebssystem migrieren (remote & lokal)

Binär-Dump war gestern. Linux migrieren mit Rsync (remote und lokal).

Vorwort

Um ein Betriebssystem (Linux basiert) mit Daten auf einen anderen Host, oder eine andere Festplatte zu synchronisieren und wieder lauffähig zu machen, gibt es viele Herangehensweisen.
In dieser Anleitung soll dies Anhand eines Ubuntus und rsync veranschaulicht werden. Die folgenden Szenarien werden beleuchtet:

  • Ubuntu soll auf eine andere Festplatte kopiert und im Anschluss von dieser gebootet werden
  • eine lokal laufende Maschine soll auf einen Remote Host kopiert werden

In beiden Fällen wird die Migration mithilfe von GRML durchgeführt. Hierbei handelt es sich um eine Live-CD (auf Basis von Debian) die kostenfrei heruntergeladen und genutzt werden kann: https://grml.org/download/ Grundsätzlich funktioniert diese Anleitung aber auch mit Ubuntu, Arch Linux, oder anderen ISO.

Datenverlust

Alle hier gezeigten Schritte müssen mit Sinn und Verstand durchgeführt werden.
Beim verdrehen von Parametern oder falscher Anwendung droht Datenverlust! Ich schließe jegliche Haftung aus und rate dazu die offiziellen Dokumentationen der Software zu lesen um ein tieferes Verständnis für die Anwendung zu erlangen.

Kopieren einer lokalen Installation auf weitere Festplatte

Prinzipiell kann die Kopie auch im gebooteten Zustand des originalen Betriebssystems erfolgen. Ich rate hierbei allerdings davon ab, weil sich während des Betriebs Daten ändern können.
Eine saubere Übertragung erreicht man, wenn ein Live-System gebootet wurde und das Quellsystem nicht in Nutzung ist!

Die Festplatten werden wie folgt gemappt:

  • sda (alt)
  • sdb (neu)
neue Festplatte Partitionieren

Die Partitionstabelle kann kopiert und wieder eingespielt werden. Falls GPT verwendet wird, müssen die UUIDs ersetzt werden!

sfdisk -d /dev/sda > part_table
grep -v ^label-id part_table | sed -e 's/, *uuid=[0-9A-F-]*//' -i part_table | sfdisk /dev/sdb

In manchen Fällen kann die neue Platte auch größer, oder kleiner ausfallen.
In diesem Fall kann die Partitionierung auch manuell durchgeführt werden. Ob GPT oder MSDOS hängt vom persönlichen Geschmack ab.
Im Hinblick auf stetig größer werdende Speichermedien bietet sich die Verwendung von GPT aber an.

parted -s /dev/sdb mklabel gpt
parted -s /dev/sdb mkpart "EFI system partition" fat32 1MiB 261MiB
parted -s /dev/sdb set 1 esp on
parted -s /dev/sdb mkpart primary 261MiB 100%free
Dateisystem erzeugen und mounten

Hier wird davon ausgegangen, dass die zweite Partition der alten Festplatte das / (rootfs) bereitstellt.
Falls noch andere Mountpoints auf der Platte existieren, müssen diese im Nachgang eingegangen werden!

mkfs.ext4 /dev/sdb2

mkdir -p /mnt/{old,new}
mount /dev/sda2 /mnt/old
# optional (falls weitere Mountpoints!)
# mount /dev/sda3 /mnt/old/home
# mount /dev/sda5 /mnt/old/var
mount /dev/sdb2 /mnt/new
Dateien synchronisieren

Bitte unbedingt auf die abschließenden Slashes ("/") bei den Ordnern achten!

rsync -aHv --numeric-ids /mnt/old/ /mnt/new/
FStab korrigieren

Aufgrund der neuen UUIDs der Dateisysteme auf der neuen Platte, müssen diese in der FSTab hinterlegt werden. Die UUIDs ermittelt man wie folgt:

blkid

/dev/sda2: UUID="823779fc-3231-4189-8a64-eee8e2d616e0" BLOCK_SIZE="4096" TYPE="ext4"
/dev/sdb2: UUID="aa6c1ffb-c522-4620-b4a5-dc45da6f2613" BLOCK_SIZE="4096" TYPE="ext4"

Je nach Menge der Mountpoints kann die Liste deutlich länger sein.
Alle Einträge der FSTab müssen dann berücksichtigt werden.

# File-Name: /mnt/new/etc/fstab

# vor Änderung UUID=823779fc-3231-4189-8a64-eee8e2d616e0 (sda2) 
UUID=aa6c1ffb-c522-4620-b4a5-dc45da6f2613 /      ext4 rw,relatime 0 0
# hier ggf. die weiteren Mountpoints hinterlegen
UUID=00000000-0000-0000-0000-000000000000 /home  ext4 rw,relatime 0 0
Chroot, Installation von Grub

Für die Installation von Grub auf die neue Festplatte sind verschiedene Laufzeit-Ordner notwendig, die System-Dateien der Live-Umgebung, aber auch Block-Devices (z.B. /dev/sd*) bereitstellen.
Abschließend betritt man mit seiner Shell die Kopie des System auf der neuen Festplatte und installiert Grub auf selbiger.

# mounten der notwendigen Ordner
for i in proc sys dev run;do
  mount --bind /$i /mnt/new/$i
done

# Wechsel der Shell
chroot /mnt/new /bin/bash

# Grub Konfiguration generieren
update-grub

# Grub auf neuer Festplatte installieren
grub-install /dev/sdb

# Chroot verlassen
exit

# herunterfahren
shutdown -h now

Nach dem Herunterfahren kann die alte Festplatte abgeschlossen und von der neuen gebootet werden.

Kopieren einer lokalen Installation auf Remote Host

Grundsätzlich verhält sich das Kopieren auf einen Remote Host, wie die lokale Variante.
Aufgrund der Tatsache dass die UUIDs der Dateisysteme sich doppeln dürfen und diese nur lokal eindeutig sein müssen, kann die Einrichtung etwas vereinfacht werden.

Zunächst liest man die UUIDs der Quell-Partitionen aus, denn diese werden wiederverwendet, damit man die FStab auf dem Remote-Host nicht korrigieren muss (bei gleicher Partitionsstruktur):

blkid

/dev/sda1: UUID="fcfca092-1654-1094-affd-a0293affcdee" BLOCK_SIZE="4096" TYPE="ext4"
/dev/sda2: UUID="01938725-dfea-cddc-ffff-0582aefc3a1a" BLOCK_SIZE="4096" TYPE="ext4"
Partitionierung übertragen
sfdisk -d /dev/sda > part_table

# Die Ausgabe wird durch den StdOut-Kanal und mittels SSH auf den Remote-Host gesendet. Die Ausgabe wird mittels Pipe an sfdisk geleitet
grep -v ^label-id part_table | sed -e 's/, *uuid=[0-9A-F-]*//' -i part_table | ssh root@my.remote.host 'cat - | sfdisk /dev/sdb'
Dateisystem(e) anlegen
# Dateisystem mit der alten UUID auf Remote-Host anlegen
mkfs.ext4 -U fcfca092-1654-1094-affd-a0293affcdee /dev/sda1
mkfs.ext4 -U 01938725-dfea-cddc-ffff-0582aefc3a1a /dev/sda2
Dateisystem(e) mounten
mount /dev/sda2 /mnt/
mkdir /mnt/boot
mount /dev/sda1 /mnt/boot
# optional (falls weitere Mountpoints!)
# mount /dev/sda3 /mnt/home
# mount /dev/sda5 /mnt/var
Dateien synchronisieren
rsync -aHv --numeric-ids / root@my.remote.host:/mnt/
Chroot, Installation von Grub
# mounten der notwendigen Ordner
for i in proc sys dev run;do
  mount --bind /$i /mnt/$i
done

# Wechsel der Shell
chroot /mnt/ /bin/bash

# Grub Konfiguration generieren
update-grub

# Grub auf Festplatte installieren
grub-install /dev/sda

# Chroot verlassen
exit

# neu starten
reboot

https://wiki.archlinux.org/index.php/Parted#Partitioning