FreeBSD - Festplatte im Root ZFS Pool wechseln

Ich plane irgendwann in der Zukunft den Betrieb meiner Server von Debian auf FreeBSD umzustellen. Auch wenn meine Bemühungen FreeBSD auf meinem Thinkpad X201 zu installieren immer noch am Suspend/Resume scheitern habe ich jetzt über Freenas schon einiges an Erfahrungen sammeln können.

Da hier kein Zeitdruck vorhanden ist aber viel Neues ansteht gilt es erstmal einiges zu testen und auszuprobieren. Da ich in der Vergangenheit schon einige Male meine Festplatte tauschen musste wollte ich diesen sensiblen Usecase vorab einmal ausprobieren. Also habe ich auf Proxmox eine Standardinstallation mit zwei Festplatten durchgeführt. Mit folgenden Befehlen konnte ich auf Basis dieses Beitrages den Zyklus einmal durchlaufen.

FreeBSD

Wir beginnen mit 2 Platten wobei von der 2. gestartet wird. In Proxmox habe ich dann die Platte 1 entfernt, eine leere neue wieder eingebaut und gebootet.

 zpool status
  pool: zroot
 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://illumos.org/msg/ZFS-8000-2Q
  scan: none requested
config:

	NAME                     STATE     READ WRITE CKSUM
	zroot                    DEGRADED     0     0     0
	  mirror-0               DEGRADED     0     0     0
	    7039742516796718660  UNAVAIL      0     0     0  was /dev/ada0p3
	    ada1p3               ONLINE       0     0     0

Zuerst gilt es die Festplattenpartitionen gleichzuziehen.

#/sbin/gpart backup ada1 | /sbin/gpart restore -F ada0

Dann sieht es so aus

gpart show ada0
=>       40  276823984  ada0  GPT  (132G)
         40       1024     1  freebsd-boot  (512K)
       1064        984        - free -  (492K)
       2048    4194304     2  freebsd-swap  (2.0G)
    4196352  184545280     3  freebsd-zfs  (88G)
  188741632   88082392        - free -  (42G)

gpart show ada1
=>       40  188743600  ada1  GPT  (90G)
         40       1024     1  freebsd-boot  (512K)
       1064        984        - free -  (492K)
       2048    4194304     2  freebsd-swap  (2.0G)
    4196352  184545280     3  freebsd-zfs  (88G)
  188741632       2008        - free -  (1.0M)

Jetzt kann ich die neue 3. Partition an die Stelle der Alten setzten

 zpool replace zroot 7039742516796718660 /dev/ada0p3
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 '/dev/ada0p3'.

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

Jetzt wird erstmal das zfs wieder aufgebaut.

zpool status
  pool: zroot
 state: DEGRADED
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 Nov 16 11:32:34 2020
	536M scanned at 14.9M/s, 180M issued at 5.01M/s, 536M total
	176M resilvered, 33.65% done, no estimated completion time
config:

	NAME                       STATE     READ WRITE CKSUM
	zroot                      DEGRADED     0     0     0
	  mirror-0                 DEGRADED     0     0     0
	    replacing-0            UNAVAIL      0     0     0
	      7039742516796718660  UNAVAIL      0     0     0  was /dev/ada0p3/old
	      ada0p3               ONLINE       0     0     0
	    ada1p3                 ONLINE       0     0     0

Irgendwann ist der Prozess dann fertig

zpool status
  pool: zroot
 state: ONLINE
  scan: resilvered 536M in 0 days 00:01:54 with 0 errors on Mon Nov 16 11:34:28 2020
config:

	NAME        STATE     READ WRITE CKSUM
	zroot       ONLINE       0     0     0
	  mirror-0  ONLINE       0     0     0
	    ada0p3  ONLINE       0     0     0
	    ada1p3  ONLINE       0     0     0

Jetzt sollten die Daten gleich sein aber ich kann von der ersten Platte noch nicht booten

gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
partcode written to ada0p1
bootcode written to ada0

Um das zu testen habe ich im Proxmox jetzt das Bootdevice von Disk1 auf Disk0 umgestellt und konnte booten.

Um den Kreislauf einmal durchzugehen habe ich jetzt das Ganze noch einmal geprüft und den Prozess mit dem Auswechseln der zweiten Festplatte simuliert.

zpool status
  pool: zroot
 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://illumos.org/msg/ZFS-8000-2Q
  scan: resilvered 536M in 0 days 00:01:54 with 0 errors on Mon Nov 16 11:34:28 2020
config:

	NAME                      STATE     READ WRITE CKSUM
	zroot                     DEGRADED     0     0     0
	  mirror-0                DEGRADED     0     0     0
	    ada0p3                ONLINE       0     0     0
	    11749512230780404159  UNAVAIL      0     0     0  was /dev/ada1p3

/sbin/gpart backup ada0 | /sbin/gpart restore -F ada1
zpool replace zroot 11749512230780404159 /dev/ada1p3
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1

Dann konnte nach dem Reboot die Startplatte wieder auf Disk 1 stellen und erfolgreich starten.

Hoffentlich klappt das auch mal wenn es um einen Server in einem entfernten RZ geht.