Ersetzen einer ausgefallenen Platte im ZFS-Root
Dieser Leitfaden erklärt, wie Sie unter Linux eine ausgefallene Festplatte in einem ZFS-Mirror-Pool ersetzen. Das Verfahren umfasst das Offline-Schalten der Festplatte, das Kopieren der Partitionstabelle auf die Ersatzfestplatte, das erneute Hinzufügen der Festplatte zum Pool und die Installation des Bootloaders nach Abschluss des Resilverings.
Voraussetzungen
Es sind Root-Rechte erforderlich. Die folgenden Beispiele gehen von einem Server mit zwei Festplatten aus: /dev/sda (funktionierend) und /dev/sdb (ausgefallen). Passen Sie die Gerätenamen an Ihre Konfiguration an.
Sichern Sie alle wichtigen Daten, bevor Sie fortfahren. Der Austausch einer Root-Festplatte ist ein Vorgang mit hohem Risiko. Ein Fehler in einem beliebigen Schritt kann zu Datenverlust oder dazu führen, dass das System nicht mehr bootfähig ist. Vermeiden Sie die Verwendung von /dev/sdX-Gerätenamen in ZFS-Befehlen. Gerätenamen können sich nach einem Neustart ändern. Verwenden Sie stattdessen stabile Bezeichner wie /dev/disk/by-id/. Die folgenden Beispiele verwenden /dev/sdX der Einfachheit halber bei der Arbeit mit Partitionierungswerkzeugen. ZFS-Befehle müssen immer /dev/disk/by-id/ verwenden.
Schritt 1: Status des Pools überprüfen
Überprüfen Sie vor allen Änderungen den aktuellen Zustand des Pools:
zpool status -v
Die Ausgabe zeigt, welche Festplatte fehlerhaft ist und welchen Bezeichner sie im Pool hat.
Schritt 2: Die ausgefallene Festplatte offline schalten
Wenn die Festplatte noch ONLINE ist, aber Fehler aufweist, schalten Sie sie vor dem physischen Austausch offline:
zpool offline rpool <failed-device>
ZFS beendet dadurch die Verwendung der fehlerhaften Festplatte, bevor sie physisch ausgetauscht wird. Ersetzen Sie <failed-device> durch den Bezeichner, der in zpool status -v angezeigt wird. Wenn die Festplatte bereits den Status FAULTED oder REMOVED hat, überspringen Sie diesen Schritt und fahren Sie direkt mit Schritt 3 fort.
Schritt 3: Festplatte physisch austauschen
Wenn Ihr Server Hot-Swap unterstützt, können Sie die Festplatte ohne Herunterfahren des Systems austauschen.
Andernfalls fahren Sie das System herunter:
poweroff
Starten Sie den Server nach dem Einbau der Ersatzfestplatte und überprüfen Sie, ob die neue Festplatte erkannt wird:
lsblk -o NAME,SIZE,MODEL ls -l /dev/disk/by-id/
Verwenden Sie in den folgenden Schritten den by-id-Bezeichner der neuen Festplatte.
Schritt 4: Typ der Partitionstabelle bestimmen
Installieren Sie gdisk, falls es noch nicht vorhanden ist:
apt install gdisk -y
Überprüfen Sie den Typ der Partitionstabelle auf der funktionierenden Festplatte:
gdisk -l /dev/sda
Suchen Sie in der Ausgabe nach dem Abschnitt Partition table scan. Bei MBR wird MBR: MBR only und GPT: not present angezeigt. Bei GPT wird MBR: protective und GPT: present angezeigt.
Schritt 5: Partitionstabelle für die neue Festplatte vorbereiten und kopieren
Die meisten ZFS-Root-Systeme verwenden eine GPT-Partitionierung. Die MBR-Methode ist für ältere Systeme enthalten.
GPT
Ermitteln Sie zunächst den /dev/sdX-Namen, der der neuen Festplatte entspricht, da Partitionierungswerkzeuge diesen benötigen:
lsblk -o NAME,SIZE,MODEL,SERIAL
Löschen Sie alle alten Signaturen von der Ersatzfestplatte, bevor Sie die Partitionstabelle kopieren:
wipefs -a /dev/disk/by-id/<new-disk>
wipefs -a entfernt dauerhaft alle Dateisystem- und Partitionssignaturen von der Festplatte. Stellen Sie sicher, dass vor der Ausführung dieses Befehls der richtige Festplattenbezeichner angegeben wurde.
Der folgende Befehl kopiert die Partitionstabelle von /dev/sda (Quelle) nach /dev/sdb (Ziel):
sgdisk -R /dev/sdb /dev/sda
Bei sgdisk -R ist das erste Argument die Zielfestplatte und das zweite die Quelle. Wenn Sie die Argumente vertauschen, wird die Partitionstabelle der funktionierenden Festplatte überschrieben.
Wenn die Ersatzfestplatte größer als die ursprüngliche Festplatte ist, erweitern Sie die GPT, damit der gesamte Speicherplatz verwendet wird:
sgdisk -e /dev/sdb
Weisen Sie der Ersatzfestplatte anschließend eine neue eindeutige UUID zu:
sgdisk -G /dev/sdb
sgdisk -G weist allen Partitionen auf der Ersatzfestplatte neue UUIDs zu. Wenn /etc/fstab UUID-basierte Einträge für eine dieser Partitionen enthält, kann das System möglicherweise nicht mehr booten. Überprüfen Sie nach Abschluss des Resilverings, dass /etc/fstab /dev/disk/by-id/-Bezeichner anstelle von UUIDs verwendet.
Laden Sie die Partitionstabelle neu, damit der Kernel das neue Layout übernimmt:
udevadm trigger udevadm settle
Wenn die Ersatzfestplatte zuvor in einem anderen ZFS-Pool verwendet wurde, löschen Sie alte ZFS-Metadaten, um Konflikte zu vermeiden:
zpool labelclear /dev/disk/by-id/<new-disk-partX> 2>/dev/null || true
Ersetzen Sie <new-disk-partX> durch den tatsächlichen ZFS-Partitionsbezeichner.
MBR
Der folgende Befehl kopiert die Partitionstabelle von /dev/sda (Quelle) nach /dev/sdb (Ziel):
sfdisk -d /dev/sda | sfdisk /dev/sdb
Wenn die neuen Partitionen nach dem Kopieren im System nicht sichtbar sind, laden Sie die Partitionstabelle neu:
udevadm trigger udevadm settle
Schritt 6: Festplatte zum Pool hinzufügen
Ersetzen Sie den ausgefallenen Festplatteneintrag im Pool durch die neue Festplatte. Überprüfen Sie zunächst den genauen Bezeichner der ausgefallenen Festplatte, wie er im Pool angezeigt wird:
zpool status rpool
Suchen Sie in der Ausgabe in der Geräteliste des Pools nach dem Eintrag der fehlerhaften Festplatte. Er wird als vollständiger Pfad angezeigt, beispielsweise /dev/disk/by-id/ata-WDC_WD10_12345-part3, mit dem Status FAULTED, UNAVAIL oder OFFLINE. Verwenden Sie diesen Pfad als <old-device> im Replace-Befehl:
zpool replace rpool <old-device> /dev/disk/by-id/<new-disk-part>
Ersetzen Sie <old-device> durch den Bezeichner der fehlerhaften Festplatte aus dem vorherigen Schritt. Ersetzen Sie <new-disk-part> durch den by-id-Bezeichner der Partition auf der Ersatzfestplatte. Verwenden Sie dabei dieselbe Partitionsnummer wie auf der funktionierenden Festplatte, beispielsweise -part3 oder -part4. Um den richtigen Bezeichner zu ermitteln, führen Sie ls -l /dev/disk/by-id/ aus.
Wenn die alte Festplatte vollständig nicht verfügbar ist (UNAVAIL) und zpool replace einen Fehler zurückgibt, fügen Sie das Flag -f hinzu, um den Austausch zu erzwingen:
zpool replace -f rpool <old-device> /dev/disk/by-id/<new-disk-part>
Überprüfen Sie nach der Ausführung von zpool replace, ob das Resilvering begonnen hat und die neue Festplatte als ONLINE angezeigt wird:
zpool status
Das Resilvering wird automatisch im Hintergrund fortgesetzt.
Schritt 7: Resilvering überwachen
Überwachen Sie den Fortschritt des Resilverings mit:
zpool status -v
Die Ausgabe zeigt den Fortschritt, die Geschwindigkeit und die geschätzte verbleibende Zeit. Warten Sie, bis der Status state: ONLINE anzeigt und das Resilvering vollständig abgeschlossen ist, bevor Sie fortfahren. Je nach Festplattengröße kann dies mehrere Stunden dauern.
Schritt 8: Boot-Dataset überprüfen
Überprüfen Sie vor der Installation des Bootloaders, ob für den Pool das richtige Boot-Dataset konfiguriert ist:
zpool get bootfs rpool
Die Ausgabe sollte einen Dataset-Pfad wie rpool/ROOT/debian anzeigen. Wenn der Wert none lautet oder auf das falsche Dataset verweist, legen Sie ihn manuell fest:
zpool set bootfs=rpool/ROOT/debian rpool
Ersetzen Sie rpool/ROOT/debian durch den tatsächlichen Namen des Root-Datasets auf Ihrem System. Um die verfügbaren Datasets aufzulisten, führen Sie zfs list aus.
Schritt 9: Bootloader installieren
Installieren Sie den Bootloader auf der Ersatzfestplatte, nachdem das Resilvering abgeschlossen ist. Während des Resilverings läuft das System weiterhin von der ursprünglichen Festplatte, sodass dieser Schritt sicher durchgeführt werden kann, sobald der Pool wieder fehlerfrei ist.
BIOS (Legacy)
grub-install /dev/disk/by-id/<new-whole-disk>
Auf einigen Systemen akzeptiert grub-install möglicherweise keinen by-id-Pfad. Ersetzen Sie in diesem Fall /dev/disk/by-id/<new-whole-disk> durch den entsprechenden Gerätenamen, beispielsweise /dev/sdb.
UEFI
Hängen Sie die EFI-Partition der Ersatzfestplatte in ein temporäres Verzeichnis ein, bevor Sie grub-install ausführen. Dadurch wird verhindert, dass die aktuell aktive EFI-Partition überlagert wird:
mkdir -p /mnt/new_efi mount /dev/disk/by-id/<new-disk-part1> /mnt/new_efi
Ersetzen Sie <new-disk-part1> durch den tatsächlichen EFI-Partitionsbezeichner (normalerweise -part1 oder -part2; Partitionstyp EF00). Überprüfen Sie bei Unsicherheit ls -l /dev/disk/by-id/.
Wenn die EFI-Partition leer ist, kopieren Sie den Inhalt der vorhandenen EFI-Partition, bevor Sie grub-install ausführen:
cp -r /boot/efi/* /mnt/new_efi/
Installieren Sie den Bootloader:
apt install grub-efi-amd64 efibootmgr -y grub-install --target=x86_64-efi --efi-directory=/mnt/new_efi --bootloader-id=debian --recheck /dev/disk/by-id/<new-whole-disk> update-grub update-initramfs -u -k all
Ersetzen Sie --bootloader-id=debian durch den Namen, der Ihrer Distribution entspricht, beispielsweise ubuntu oder debian. Ersetzen Sie /dev/disk/by-id/<new-whole-disk> durch den by-id-Bezeichner der gesamten Ersatzfestplatte, nicht einer Partition.
Durch die Ausführung von update-initramfs wird sichergestellt, dass das initiale RAM-Dateisystem die aktuellen ZFS-Module enthält und das neue Pool-Layout erkennt. Ohne diesen Schritt kann das System nach dem Austausch möglicherweise nicht mehr booten.
Hängen Sie die EFI-Partition nach der Installation wieder aus:
umount /mnt/new_efi
Überprüfen Sie die EFI-Booteinträge:
efibootmgr -v
Auf Systemen mit einem ZFS-Root kann grub-install je nach GRUB-Version und Systemkonfiguration fehlschlagen oder zusätzliche Optionen erfordern. Auf einigen Systemen muss GRUB beispielsweise mit ZFS-Unterstützungsmodulen installiert oder der Befehl aus einer chroot-Umgebung ausgeführt werden. Wenn der Befehl einen Fehler zurückgibt, konsultieren Sie die Dokumentation Ihrer Distribution zur ZFS-spezifischen GRUB-Installation.
Unter Proxmox VE ist grub-install deaktiviert. Verwenden Sie stattdessen proxmox-boot-tool. Das folgende Beispiel verwendet /dev/sdb2 – ersetzen Sie diesen Pfad durch die tatsächliche EFI-Partition Ihres Systems:
proxmox-boot-tool format /dev/sdb2 proxmox-boot-tool init /dev/sdb2
Fazit
Starten Sie den Server nach der Installation des Bootloaders neu und überprüfen Sie, ob er normal bootet. Führen Sie anschließend einen Scrub durch, um Lese-/Schreibfehler zu erkennen, die während des Resilverings aufgetreten sein könnten:
zpool scrub rpool
Überprüfen Sie anschließend den Pool-Status:
zpool status -v
Der Pool sollte online und ohne Fehler sein. Wenn während des Vorgangs Probleme auftreten, überprüfen Sie die Systemprotokolle mit journalctl -xe, um weitere Informationen zu erhalten.
Bevor Sie die in Schritt 3 entfernte ausgefallene Festplatte entsorgen, starten Sie den Server neu und überprüfen Sie, ob das System mit der Ersatzfestplatte normal bootet. Bewahren Sie die ausgefallene Festplatte als Fallback auf, bis der erfolgreiche Systemstart bestätigt wurde.