eine defekte Platte im zroot-RAID1-Pool austauschen

Yoda

[Linux|FreeBSD] - User
Hallo Leute,

ich habe dieses Problem jetzt schon seit man FreeBSD nativ auf ZFS installieren kann und bis jetzt habe ich nicht rausgefunden wie man in dem zroot-RAID1-Pool eine Platte tauscht.

Mein Pool besteht aus ada4, ada5 und mittlerweile auch noch ada10.
ada5 ist die letzte verbliebene Platte, auf der FreeBSD damals noch installiert wurde, sie besitzt als einzige auch noch die GPart-Partitionen und den Boot-Kode.

Die zweite Platte von damals ist bereits defekt.
Mit ada10 experimentiere ich rum...
Code:
  > gpart backup ada5
  GPT 128
  1   freebsd-boot         34       1024 gptboot0
  2   freebsd-swap       1058   16777216 swap0
  3    freebsd-zfs   16778274 1936746861 zfs0

Code:
> gpart backup ada5 | gpart restore ada10

Das erste Problem taucht schon auf, wenn ich auf der neuen Platte diese Partitionen anlegen will, dann meckert er, dass "34" nicht geht.
Wenn ich das mit "40" statt mit "34" mache, dann geht es.
Code:
  > gpart backup ada10
  GPT 128
  1   freebsd-boot         40       1024 gptboot0
  2   freebsd-swap       1064   16777216 swap0
  3    freebsd-zfs   16778280 1936746848 zfs0
Wenn ich die ada10 zu Pool hinzufühge:
Code:
  > zpool attach zroot ada5 ada10

Dann sind die GPT-Partitionen weg und ich kann den Boot-Kode nicht mehr aktualiseren:
Code:
  > gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada10
  gpart: No such geom: ada10.
Kann mir bitte einer sagen, wie ich das richtig mache, so dass das System dann von der neuen Platte auch booten würde?
Danke!

Gruß
Yoda
 
Zuletzt bearbeitet:
Eigentlich sind es ja zwei Fragen. :) Also:

Das erste Problem taucht schon auf, wenn ich auf der neuen Platte diese Partitionen anlegen will, dann meckert er, dass "34" nicht geht.
Wenn ich das mit "40" statt mit "34" mache, dann geht es.
Das liegt daran, dass der Kernel die neue Platte als eine Platte mit 4k Sektoren erkennt und daher verweigert Partitionen mit einem 512 Byte Alignement anzulegen. Vielleicht könnte man ihn irgendwie zwischen, aber eine gute Idee wäre das nicht. Die meisten Platten werden bei falschem Alignement extrem langsam. Allerdings ergibt sich dadurch das Problem, dass ada5p3 um 19 Byte länger als ada10p3 ist. Dadurch wird sich ada10p3 nicht in den Pool einfügen lassen. Die eleganteste Lösung wäre, von der davor liegenden Swap-Partition ein paar Kilobyte zu klauen.

Überhaupt ist genau das der Grund, das richtet sich jetzt eher an die Ungläubigen und nicht so sehr an dich, warum man beim Partitionieren am Ende immer ein paar Megabyte freilassen sollte. Damit man Platz hat, falls neue Platten anderes Alignement verlangen oder schlicht kleiner sind.

Wenn ich die ada10 zu Pool hinzufühge:
> zpool attach zroot ada5 ada10

Dann sind die GPT-Partitionen weg und ich kann den Boot-Kode nicht mehr aktualiseren:
> gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada10
gpart: No such geom: ada10.
Du fügst ja nur ada10 hinzu, also die ganze Platte. Nicht die oben angelegten Partitionen. Daher krallt ZFS sich auch korrekterweise die ganze Platte und killt deine Partitionen wieder. Gebe uns mal ein 'zpool status' vom Ist-Zustand. Damit könnte man sicher besser helfen.
 
Danke für die ausführliche Antwort.
Hier der Status:
Code:
> zpool status zroot
  pool: zroot
state: ONLINE
  scan: resilvered 304G in 0 days 01:09:40 with 0 errors on Mon Feb  4 13:21:01 2019
config:

        NAME                                            STATE     READ WRITE CKSUM
        zroot                                           ONLINE       0     0     0
          mirror-0                                      ONLINE       0     0     0
            gptid/3d5a4e6c-14c4-11e4-bc13-bcaec58cba70  ONLINE       0     0     0
            diskid/DISK-WD-WMC6M0H02SPU                 ONLINE       0     0     0
            ada10                                       ONLINE       0     0     0

Code:
ada5 =      gptid/3d5a4e6c-14c4-11e4-bc13-bcaec58cba70
ada4 =      diskid/DISK-WD-WMC6M0H02SPU
 
Zuletzt bearbeitet:
Und hier der komplette, auch mit den nicht relevanten Pools:

Code:
# zpool status
  pool: extern02
 state: ONLINE
status: One or more devices are configured to use a non-native block size.
        Expect reduced performance.
action: Replace affected devices with devices that support the
        configured block size, or migrate data to a properly configured
        pool.
  scan: resilvered 298K in 0 days 00:00:01 with 0 errors on Fri Nov  2 18:03:38 2018
config:

        NAME                            STATE     READ WRITE CKSUM
        extern02                        ONLINE       0     0     0
          mirror-0                      ONLINE       0     0     0
            ada3                        ONLINE       0     0     0
            diskid/DISK-PL1331LAGG7GKH  ONLINE       0     0     0  block size: 512B configured, 4096B native

errors: No known data errors

  pool: extern03
 state: ONLINE
  scan: scrub repaired 0 in 1 days 03:36:05 with 0 errors on Wed Jun 27 12:25:45 2018
config:

        NAME                      STATE     READ WRITE CKSUM
        extern03                  ONLINE       0     0     0
          mirror-0                ONLINE       0     0     0
            diskid/DISK-7JJKANEC  ONLINE       0     0     0
            diskid/DISK-7JJK1DBC  ONLINE       0     0     0

errors: No known data errors

  pool: extern04
 state: ONLINE
  scan: scrub repaired 36,2M in 1 days 08:16:15 with 0 errors on Wed Jun 27 17:06:33 2018
config:

        NAME                             STATE     READ WRITE CKSUM
        extern04                         ONLINE       0     0     0
          mirror-0                       ONLINE       0     0     0
            diskid/DISK-WD-WX21D7453SY1  ONLINE       0     0     0
            diskid/DISK-WD-WXB1HB4H9AHF  ONLINE       0     0     0

errors: No known data errors

  pool: home
 state: ONLINE
  scan: resilvered 963G in 0 days 03:44:53 with 0 errors on Mon Apr 16 13:09:31 2018
config:

        NAME                             STATE     READ WRITE CKSUM
        home                             ONLINE       0     0     0
          mirror-0                       ONLINE       0     0     0
            ada8                         ONLINE       0     0     0
            diskid/DISK-WD-WCAZAJ471182  ONLINE       0     0     0

errors: No known data errors

  pool: zroot
 state: ONLINE
  scan: resilvered 304G in 0 days 01:09:40 with 0 errors on Mon Feb  4 13:21:01 2019
config:

        NAME                                            STATE     READ WRITE CKSUM
        zroot                                           ONLINE       0     0     0
          mirror-0                                      ONLINE       0     0     0
            gptid/3d5a4e6c-14c4-11e4-bc13-bcaec58cba70  ONLINE       0     0     0
            diskid/DISK-WD-WMC6M0H02SPU                 ONLINE       0     0     0
            ada10                                       ONLINE       0     0     0

errors: No known data errors
 
Überhaupt ist genau das der Grund, das richtet sich jetzt eher an die Ungläubigen und nicht so sehr an dich, warum man beim Partitionieren am Ende immer ein paar Megabyte freilassen sollte. Damit man Platz hat, falls neue Platten anderes Alignement verlangen oder schlicht kleiner sind.
Der ;) *zwinker* hier könnte in dem Fall gerne größer sein. Bei Systemplatten definitiv fullack!

@Yoda
Ich blicke da gerade nicht wirklich durch mit dem id-wirrwarr und meine, dass du die Partitionen nicht genommen hast.

Evtl. hilft das zum besseren Verständnis:
Code:
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada10
'-i 1' sagt, erste Partition auf ada10, '-i 2' sagt zweite auf ada10 usw.

Code:
zpool attach zroot ada5 ada10
Das hier nimmt wie yamagi schon sagte, die ganze Platte ada10 und überschreibt die Partitionen wieder. Wenn ich davon ausgehe, dass die Partitionen von ada5 richtig sind, dann sollte
Code:
zpool attach zroot ada5p3 ada10p3
der richtige Befehl sein (um die Partition 3 anzusprechen!).
Bitte, bitte, bitte!!!! vorher genau nachprüfen, nicht dass Daten den Hades langsschwimmen! :(

Und check dann nochmal hier:
Code:
1   freebsd-boot         40       1024 gptboot0
  2   freebsd-swap       1064   16777216 swap0
  3    freebsd-zfs   16778280 1936746848 zfs0

gptboot0, swap0 und zfs0 sollten dann auf der nächstfolgenden Platte in gptboot1, swap1, zfs1 umbenannt werden, sonst hast du das doppelt und die Verwirrung ist maximal.
 
Hallo mr44er,

ich habe das mal so gemacht:

Code:
# zpool attach zroot gptid/3d5a4e6c-14c4-11e4-bc13-bcaec58cba70 ada10p3
Make sure to wait until resilver is done before rebooting.

If you boot from pool 'zroot', you may need to update
boot code on newly attached disk 'ada10p3'.

Assuming you use GPT partitioning and 'da0' is your new boot disk
you may use the following command:

        gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0

Weil ich angenommen habe, dass die Partition im Pool, ja die "p3" sein müsste, denn die hat ja im Partitionsnamen bereits "zfs" drin.
Demnach leite ich davon ab, dass die "p1" nur den Bootcode enthält und die "p2" als SWAP-Partition, nicht synchronisiert wird.
...liege ich damit richtig?

Jetzt sieht es auf ada10 so aus:
Code:
=>        40  1953525088  ada10  GPT  (932G)
          40        1024      1  gptboot3  (512K)
        1064    16777216      2  swap3  (8.0G)
    16778280  1936746848      3  zfs3  (924G)

Also müsste es, um die Erläuterungen "bereinigt", in Kurzform so aussehen:
Code:
# swapon /dev/gpt/swap3
# swapinfo
Device          1K-blocks     Used    Avail Capacity
/dev/gpt/swap0    8388608    50040  8338568     1%
/dev/gpt/swap3    8388608    11848  8376760     0%
Total            16777216    61888 16715328     0%


# zpool attach zroot gptid/3d5a4e6c-14c4-11e4-bc13-bcaec58cba70 ada10p3
# zpool status zroot
  pool: zroot
 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.
  scan: resilver in progress since Mon Feb  4 18:18:05 2019
        304G scanned at 467M/s, 1,28G issued at 36,4M/s, 304G total
        1,27G resilvered, 0,42% done, 0 days 02:22:07 to go
config:

        NAME                                            STATE     READ WRITE CKSUM
        zroot                                           ONLINE       0     0     0
          mirror-0                                      ONLINE       0     0     0
            gptid/3d5a4e6c-14c4-11e4-bc13-bcaec58cba70  ONLINE       0     0     1
            diskid/DISK-WD-WMC6M0H02SPU                 ONLINE       0     0     0
            ada10p3                                     ONLINE       0     0     0


# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada10
partcode written to ada10p1
bootcode written to ada10

Also, ich habe es mal so gemacht und es gab keine Fehlermeldungen... :-)
 
ada5 ist die letzte verbliebene Platte, auf der FreeBSD damals noch installiert wurde
Ich hatte das so verstanden, dass du Anfangs mal einen Mirror über zwei Partitionen angelegt hattest. In der Folge konnte ich gar nicht verstehen, was überhaupt schief geht, denn alle Pools zeigten keinen Fehler an. Es war keiner Degraded, was eigentlich dann der Fall sein sollte, wenn eine Platte (bzw Partition) fehlt.
Ich verstehe das noch immer nicht richtig und auch nicht, warum nun eine Platte resilvered wird. Hattest du vielleicht zuvor die defekte Platte nicht aus dem Pool entfernt? Und wenn eine defekt ist, dann replaced man die normalerweise und legt keinen neuen Pool an. Zumindest kenne ich das so. Und wenn man zusätzlich eine Platte hinzufügen möchte (ich meine hier immer Platte oder Partition), dann attached man die doch. Lies dazu vielleicht mal hier nach: https://www.freebsd.org/doc/de_DE.ISO8859-1/books/handbook/zfs-zpool.html

Was das Einrichten der Platten angeht:
Du musst nicht alle Platten im Spiegel gleich einrichten. Besser ist es schon, aus diversen Gründen. Aber es langt zB, auf einer Platte den Bootcode zu haben und auf einer Platte SWAP anzulegen. Im BIOS wählst du, von welcher Platte gebootet werden soll. Dort brauchst du den Bootcode. Hast du einen Mirror aus zwei Partitionen auf unterschiedlichen Platten, aber nur auf einer den Bootcode, dann bootet das System eben nicht mehr, wenn diese Platte mit dem Bootcode ausfällt.
SWAP kann man auf allen Platten einrichten und entweder summieren oder auch in einem Spiegel betreiben (schnellere Zugriffszeiten). Beides muss man dem System mitteilen, es wird nicht automatisch alle Partitionen benutzen, die als SWAP angelegt wurden.
im Partitionsnamen bereits "zfs"
das ist natürlich klug, aber der Name ist tatsächlich nur ein Name. Ob in dieser Partition ein NTFS angelgt wird, oder ob sie für ein ZFS benutzt wird, hat mit dem Namen nichts zu tun. Wichtiger ist, dass die Größe stimmt und das Allignement.

Ob das nun in deinem Beispiel wirklich alles richtig ist, erschließt sich mir nicht, weil ich bei der Mischung zwischen gptid, diskid und Partitionsnummer nicht ganz durchblicke. Ich würde auch versuchen, das einheitlich zu halten.
Ich dachte auch, dass diskid immer die komplette Platte meint, bin damit aber nicht sicher.
 
Hallo pit234a,

ich hoffe im folgenden, Deine Verwirrung auflösen zu können und werde jetzt mal etwas Detailreicher sein.

Vor langer Zeit, als es endlich möglich war FreeBSD auf ZFS zu installieren habe ich das dann auch mal gemacht und das aber natürlich auf einem RAID1-Spiegel (2x 1TB-HDDs).
Dann kam, was kommen musste, eine der beiden 1TB-Platten aus dem Pool war defekt und ich wollte sie austauschen.
Also habe ich die defekte Platte entfernt und eine andere dafür eingebaut. Wie mir von ZFS zu der Zeit bekannt war, konnte man die neue Platte mit "attach" dran packen. Das tat ich auch
Code:
zpool attach zroot gptid/3d5a4e6c-14c4-11e4-bc13-bcaec58cba70 ada10
Um die Verwirrung mit der GPTID aufzulösen, hatte ich den Namen des Laufwerkes angegeben, auf dem die Partition mit der gezeigten GPTID lag - ich wusste zu dem Zeitpunkt nicht, dass es nicht die ganze Platte ist, sondern nur die 3. Partition...
Code:
zpool attach zroot ada5 ada10
...alles war gut - dachte ich...

Dann gab es neue Hardware und alles wurde komplett umgebaut.
Danach wurde zufällig von der neueren Platte gebootet und das ging nicht, weil kein BootCode drauf war.
Zu dem Zeitpunkt habe ich erst bemerkt, dass hier mehr als nur ein "replace" oder "attach" nötig war.
Nur mir war absolut nicht klar wie das richtige Vorgehen in soeinem Fall ist, ich habe dazu auch in der Doku nichts gefunden...

Und so habe ich mir seit dem nicht getraut auch die erste Platte auszutauschen, obwohl die jetzt auch schon in der SMART-Ausgabe Fehler aufweist.

Aber wie das jetzt verstanden habe, werden alle drei Partitionen auf dem ROOT-Laufwerk separat betrachtet:
p1 - BootCode (ungespiegelt)
p2 - SWAP (ungespiegelt)
p3 - ZFS-Pool für das BS

Aus dem Grund sollte es im Idealfall so gehen (jetzt aber die Partition und nicht die ganze Platte, beim attach, angegeben):
Code:
# gpart backup ada5 > /tmp/g.txt
# vi /tmp/g.txt
# cat /tmp/g.txt | gpart restore ada10
# swapon /dev/gpt/swap3
# zpool attach zroot gptid/3d5a4e6c-14c4-11e4-bc13-bcaec58cba70 ada10p3
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada10


@mr44er
Danke für die entscheidenden Hinweise! :-)


Gruß
Yoda
 
Weil ich angenommen habe, dass die Partition im Pool, ja die "p3" sein müsste, denn die hat ja im Partitionsnamen bereits "zfs" drin.
Demnach leite ich davon ab, dass die "p1" nur den Bootcode enthält und die "p2" als SWAP-Partition, nicht synchronisiert wird.
...liege ich damit richtig?

Jep.

Normalerweise ist das so (wie es ursprünglich bei dir installiert wurde) und sollte danach auch wieder so eingerichtet werden:
platte1 = ada0, jeweils 3 Partitionen(ada0p1 bis ada0p3) und dann entsprechend erste Partition gptboot0, swap0 und zfs0
platte2 = ada1, jeweils 3 Partitionen(ada1p1 bis ada1p3) und dann entsprechend erste Partition gptboot1, swap1 und zfs1

usw.

Erste Verwirrung: die disk-id-namen kreuz und quer gewürfelt.

Zweites Problem jetzt hier:
Code:
gpart backup ada5 | gpart restore ada10

Das kopiert dir zwar brav das Partitionslayout 1:1, aber eben auch die Partitionsnamen. Dh. du erhältst gptboot0 2x, swap0 2x und zfs0 2x.
Nach dem gpart restore solltest du dann eben auf ada10 die Partitionsnamen noch ändern.

Aber wie das jetzt verstanden habe, werden alle drei Partitionen auf dem ROOT-Laufwerk separat betrachtet:
p1 - BootCode (ungespiegelt)
p2 - SWAP (ungespiegelt)
p3 - ZFS-Pool für das BS

Ja. Der bootcode wird nicht gespiegelt im eigentlichen Sinne, er muß nur jeweils auf die erste Partition jeder ausgetauschten Platte. (damit eben von jeder verbleibenden, gesunden Platte unabhängig von den anderen gebootet werden kann)
Geht so wie in dem Hinweis (nur eben die richtige, neue Platte wählen):
Code:
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0

Die zweite Partition, also swap wird mit 'swapon /dev/adaxp2' eingebunden oder in der fstab eingepflegt.

Und nur die dritte Partition wird dann für zfs genutzt. Hoffe, es ist dadurch ein wenig klarer geworden.

Und so habe ich mir seit dem nicht getraut auch die erste Platte auszutauschen, obwohl die jetzt auch schon in der SMART-Ausgabe Fehler aufweist.

Bei raid1/mirror tauscht man eigentlich auch nicht direkt aus, sondern hängt erstmal eine weitere dazu. Damit hat man noch eine klitzekleine weitere Chance, dass man von den übriggebliebenen Platten einen resilver fahren kann. Falls du nämlich replaced und die eine Platte stirbt beim resilver, ists gameover.

Edit: Mir hilft manchmal etwas Spicken in logfiles für besseres Verständnis.
Schau dir mal '/var/log/bsdinstall_log' an. Suche in dem file nach der zeichenfolge 'zfs_create_boot:' und schau ab dort Zeile für Zeile durch, was der Installer damals gemacht hat.
 
Ich würde das nicht machen!
ABER ACHTUNG, das ist meine vollkommen unmaßgebliche Meinung.

Wenn du eine bereits anfällige Platte hast und nun den Pool resilverst, wird dieser viel abverlangt. Die Chance ist gut, dass sie dabei stirbt.
Das gilt natürlich immer und für alle Art der Last, aber, ich würde die darauf befindlichen Daten sichern (du hast ja ausreichend viele Poole im System, falls dort noch genug Platz ist, ansonsten über Netzwerk oder auch extern) und dann den Pool neu anlegen und zwar "richtig" mit SWAP und Bootcode und so und dann schließlich die Sicherung zurück spielen.
OK, das bedeutet einen Ausfall des Systems. Wieviel Aufwand man betreiben möchte, um diesen Ausfall gering zu halten, ist eine andere Frage. Man könnte zB direkt einen neuen Pool anlegen (also weitere Platten einbauen) und diese vorbereiten, Daten überspielen, einmal neu starten und gut ist.
 
Ja, allem voran natürlich ein Backup....kann man nicht oft genug dazu raten!

Dann würd ich das neu aufsetzen und mit einer Testmaschine ohne wichtige Daten das Szenario mit Plattentausch ein paarmal nachspielen, damit man das beim nächsten Plattentod souverän regelt. :)
 
Zurück
Oben