Aktuelles Thema: ZFS-Root-Filesystem

Seit Update 6 (10/08) gibt es die Möglichkeit, ZFS für die Root-Partition zu verwenden. Höchste Zeit also, sich zwei Updates später ganz ernsthaft damit zu beschäftigen, zumal interne Hardware-RAIDs auf x86-Systemen in Verbindung mit Solaris nicht immer für stressfreie Handhabung stehen.

Die Installation | Ausfall einer Platte | Spielereien mit USB Devices | Ausfall beider Platten | Fazit | Anhang

Die Motivation

Getestet haben wir auf einem etwas angegrauten Pentium 4 mit zwei gleich großen IDE-Festplatten. In erster Linie interessierte uns selbstverständlich die Praktikabilität und Handhabung dieser Lösung im Vergleich zur Root-Spiegelung mit dem Solaris Volume Manager.

Die Installation

Wie vermutet, besteht die OS-Installation darin, eine DVD in den dafür vorgesehenen Einschub zu legen und die im interaktiven Dialog gestellten Fragen zu beantworten. Auf die erste Frage, nach der gewünschten Installationsart, antworten wir gewöhnlicherweise mit
"Installation per Text + Console"
(Nummer 4). Zwar wundern wir uns jedes Mal über die Mitteilung
"Starting Java",
nichtsdestotrotz resultiert diese Wahl in einer gefühlt schnelleren Installation. Wichtig ist die Wahl des Punktes
"Initiale Installation"
Nur für diesen Installationstyp ist eine explizite Auswahl des Root-FS möglich.
  [ ] UFS
  [x] ZFS
Da wir über zwei eingebaute Festplatten verfügen, wählen wir beide zur Installation. Damit wird vom Installer eine ZFS-Root-Spiegelung eingerichtet. (Sollte eine zweite Platte zu einem späteren Zeitpunkt eingebaut werden, bitte hier weiterlesen) Mit der Taste F4 entfernen wir etwaige Partitionen und sorgen dafür, dass der ZPool sich über die ganze Platte ausbreiten darf. Eigentlich hätte uns der Gedanke an zwei Partitionen - eine Root-Partition + eine Daten- Partition - sehr zugesagt, leider ist diese Möglichkeit in aktuellen OpenSolaris-Releases nicht mehr vorgesehen, was uns vermuten lässt, dass mehrere Partitionen in Solaris zukünftig nicht mehr unterstützt werden (könnten).

Laut Dokumentation müssen die Platten SMI-gelabelt sein. Platten mit EFI-Label werden nicht erkannt. In der Spalte "Available" (Verfügbarer Speicherplatz) wird für diese 0 MB angezeigt. EFI-gelabelte Platten müssen vor der Installation mit einem SMI-Label versehen werden.

Schlussendlich gibt es eine Übersicht über den gesamten ZPool. Hier wird die Größe der Swap- und Dump-Devices gewählt. Ebenso kann für /var ein eigenes Dataset konfiguriert werden. Die Größe der Devices (swap und dump) kann im Anschluss auch bei laufendem System angepasst werden.

Fehlerfall 1: Ausfall einer Platte

Zum Testen dieses Szenarios haben wir die Möglichkeit, diese Platten im BIOS abzuschalten. Tun wir dies, startet unser Betriebsystem normal. Erst auf Nachfrage erkennen wir, dass es Probleme gibt:
# zpool list
NAME    SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
rpool    74G  7.73G  66.3G    10%  DEGRADED  -
# zpool status rpool
  pool: rpool
 state: DEGRADED
status: One or more devices could not be opened.  Sufficient replicas exist for
        the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
   see: http://www.sun.com/msg/ZFS-8000-2Q
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       DEGRADED     0     0     0
          mirror    DEGRADED     0     0     0
            c1d0s0  UNAVAIL      0     0     0  cannot open
            c1d1s0  ONLINE       0     0     0

errors: No known data errors
Die Platte c1d0s0 scheint Probleme zu haben. In der Zeile "action:" stehen hilfreiche Kommentare zum weiteren Vorgehen. Da wir die Platte lediglich aus dem PC-BIOS entfernt haben, gibt es hier den Hinweis, die Platte wieder verfügbar zu machen und sie in den Zustand "online" zu versetzen.

Problembehebung
Nachdem die Platte wieder verfügbar ist, wird der Zustand beim nächsten reboot wie folgt aussehen:

# zpool status rpool
  pool: rpool
 state: ONLINE
status: One or more devices has experienced an unrecoverable error.  An
        attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
        using 'zpool clear' or replace the device with 'zpool replace'.
   see: http://www.sun.com/msg/ZFS-8000-9P
 scrub: resilver completed after 0h0m with 0 errors on Wed Dec  2 14:23:42 2009
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c1d0s0  ONLINE       0     0     2  9.40M resilvered
            c1d1s0  ONLINE       0     0     0

errors: No known data errors
Wir verfahren nach Empfehlung der "action: Zeile". Die Platte brauchen wir in unserem Fall nicht zu ersetzen, allerdings möchten wir den Fehlereintrag löschen.
# zpool clear rpool
# zpool status rpool
  pool: rpool
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Wed Dec  2 14:23:42 2009
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c1d0s0  ONLINE       0     0     0  9.40M resilvered
            c1d1s0  ONLINE       0     0     0

errors: No known data errors

Spielereien mit USB Devices

Erste Regel ist, volfs ausschalten:
# svcadm disable volfs
Der volfs sorgt für removable media dafür, dass diese Device-Einträge unter /vol/dev/dsk/... erhalten. Wir wünschen allerdings Einträge unter /dev/dsk/... Ohne volfs werden auch Geräteknoten für die gesamte Platte erzeugt sowie Einträge für Partitionen. Diese Geräteknoten werden im Anschluss vom ZPool benötigt.
# zpool attach rpool c1d0s0 /dev/dsk/c3t0d0p1
cannot attach /dev/dsk/c3t0d0p1 to c1d0s0: device is too small
Der zpool attach achtet natürlich auf die Devicegröße. Partition 1 ist in unserem Fall zu klein. Partition 2 ist groß genug. Probieren wir es einfach.
# zpool attach rpool c1d0s0 /dev/dsk/c3t0d0p2
Please be sure to invoke installgrub(1M) to make '/dev/dsk/c3t0d0p2' bootable.
Nach dem erfolgreichen attach beginnt das Resilvering.
# zpool status
  pool: rpool
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
 scrub: resilver in progress for 0h1m, 29.12% done, 0h3m to go
config:

        NAME          STATE     READ WRITE CKSUM
        rpool         ONLINE       0     0     0
          mirror      ONLINE       0     0     0
            c1d0s0    ONLINE       0     0     0
            c1d1s0    ONLINE       0     0     0
            c3t0d0p2  ONLINE       0     0     0  2.25G resilvered

errors: No known data errors

Fehlerfall 2: Ausfall beider IDE Platten

Schauen wir mal was passiert, wenn wir die 2 IDE-Platten im laufenden Betrieb abziehen (klar: dafür ist IDE nicht geeignet). Für ca. 10 Minuten ging nichts (timeout??). Kein ps -ef ging durch, kein zpool-status wurde fertig. Danach aber:
# zpool status rpool
  pool: rpool
 state: DEGRADED
status: One or more devices could not be opened.  Sufficient replicas exist for
        the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
   see: http://www.sun.com/msg/ZFS-8000-2Q
 scrub: resilver completed after 0h6m with 0 errors on Wed Dec  2 15:00:20 2009
config:

        NAME          STATE     READ WRITE CKSUM
        rpool         DEGRADED     0     0     0
          mirror      DEGRADED     0     0     0
            c1d0s0    UNAVAIL      5   186     2  cannot open
            c1d1s0    UNAVAIL      3   186     0  cannot open
            c3t0d0p2  ONLINE       0     0     0  7.73G resilvered

errors: No known data errors
Recht hat er. Die Platten sind weg. Solaris aber up and running. Leider können wir unseren Test-PC nicht von USB booten. Deshalb stecken wir die Platten wieder ein und rebooten von ihnen. Grub ist auch noch da und Solaris bootet. Sobald wir online sind, schauen wir auf den Pool. Wie erwartet, werden die Platten resilvered.
# zpool status
  pool: rpool
 state: ONLINE
status: One or more devices has experienced an unrecoverable error.  An
        attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
        using 'zpool clear' or replace the device with 'zpool replace'.
   see: http://www.sun.com/msg/ZFS-8000-9P
 scrub: resilver completed after 0h0m with 0 errors on Wed Dec  2 15:58:09 2009
config:

        NAME          STATE     READ WRITE CKSUM
        rpool         ONLINE       0     0     0
          mirror      ONLINE       0     0     0
            c1d0s0    ONLINE       0     0     0  3.26M resilvered
            c1d1s0    ONLINE       0     0     7  3.26M resilvered
            c3t0d0p2  ONLINE       0     0     0

errors: No known data errors
Mit einem "zpool clear" bereinigen wir diese Fehlermeldung (siehe oben). Prinzipiell sollten alle ZPool-Fehlermeldungen bereinigt werden, da bei mehreren nacheinander aufgetretenen Fehlern lediglich der letzte angezeigt wird und somit die Gefahr besteht, nicht gewünschte und schwer überschaubare Aktionen zu starten, welche später u. U. bereut werden.

Fazit

Anhand der durchgeführten Tests bleibt nur zu sagen: Es funktioniert. Setzt man gleich bei der Installation auf ZFS mit Rootspiegelung, so ist die Konfiguration besonders einfach. Aber auch beim nachträglichen Aufsetzen einer Rootspiegelung oder bei der Problembehebung zeigt sich ein positives Bild. Die Verwendung von ZFS als Rootfilesystem hinterlässt einen guten Eindruck und funktioniert nach dem jetzigen Kenntnisstand sehr gut. Hinsichtlich der Handhabung kann im Vergleich mit der eher aufwendigen SVM-Rootspiegelung (basierend auf UFS) nur eine Empfehlung für die Rootspiegelung mit ZFS ausgesprochen werden. Praktische Erfahrungen brauchen freilich reale Hardware-Ausfälle und damit Zeit, Zeit und nochmals Zeit.

Swap im laufenden Betrieb anpassen | ZFS-Root-Spiegelung nachträglich einrichten | GRUB-Einstellungen

Anhang: Swap im laufenden Betrieb anpassen

Im Rahmen der ZPool-Größe kann das Swap-Device im laufenden Betrieb wie folgt angepasst werden:
# swap -d /dev/zvol/dsk/rpool/swap
# zfs volsize=2G rpool/swap
# vi /etc/vfstab # Swap-Eintrag auskommentieren
# swap -a /dev/zvol/dsk/rpool/swap
# vi /etc/vfstab # Swap-Eintrag unkommentieren

Anhang: ZFS-Root-Spiegelung nachträglich einrichten

ZFS wird bereits als Root-FS benutzt, wir möchten lediglich die Root-Spiegelung nachträglich hineinbauen.
# zpool status rpool
  pool: rpool
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          c1d0s0    ONLINE       0     0     0

errors: No known data errors
Beim Hinzufügen der zweiten Platte c1d1s0 macht uns der zpool attach auf die GRUB- Problematik aufmerksam. Bei Ausfall von c1d0s0 werden wir nur dann erfolgreich booten können, wenn der GRUB auch im MBR der Platte c1d1s0 zu finden ist.
# zpool attach rpool c1d0s0 c1d1s0
Please be sure to invoke installgrub(1M) to make 'c1d1s0' bootable.
# installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c1d1s0 
stage1 written to partition 0 sector 0 (abs 16065)
stage2 written to partition 0, 272 sectors starting at 50 (abs 16115)
Schauen wir uns den momentanen Status des ZPools an:
# zpool status
  pool: rpool
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
 scrub: resilver in progress for 0h4m, 62.22% done, 0h2m to go
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c1d0s0  ONLINE       0     0     0
            c1d1s0  ONLINE       0     0     0  4.80G resilvered
Zwei Minuten müssen wir noch warten, dann ist der Resilvering-Prozess fertig. Im Anschluss können wir neu starten und die Root-Spiegelung testen.
# zpool status rpool
  pool: rpool
 state: ONLINE
 scrub: resilver completed after 0h9m with 0 errors on Wed Dec  2 12:55:39 2009
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c1d0s0  ONLINE       0     0     0
            c1d1s0  ONLINE       0     0     0  7.73G resilvered

errors: No known data errors

Anhang: GRUB-Einstellungen

Vornweg ist zu sagen: Es ist uns nie passiert! Aber besser man hat als man hätte. Es ist empfehlenswert, sich die aktuelle GRUB-Konfiguration an einem sicheren Ort zu merken, man weiß ja nie ...
# tail -12 /rpool/boot/grub/menu.lst
#---------- ADDED BY BOOTADM - DO NOT EDIT ----------
title Solaris 10 10/09 s10x_u8wos_08a X86
findroot (pool_rpool,0,a)
kernel$ /platform/i86pc/multiboot -B $ZFS-BOOTFS
module /platform/i86pc/boot_archive
#---------------------END BOOTADM--------------------
#---------- ADDED BY BOOTADM - DO NOT EDIT ----------
title Solaris failsafe
findroot (pool_rpool,0,a)
kernel /boot/multiboot kernel/unix -s
module /boot/x86.miniroot-safe
#---------------------END BOOTADM--------------------

zurück