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.
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.
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.
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
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
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.
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.
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
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
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--------------------