Migrate rpool to new disk(s)

Migrating the rpool is not just a matter of zfs send and zfs receive since the name of the pool rpool is used literally various places in the core configuration so the name must not be changed. Apart from this the disk(s) containing the rpool also contains the boot block and the boot loader which is not part of the pool and therefore must be dealt with using other tools than zfs. therefore this short guide will give instructions for the simplest and easiest way to accomplish this task.

This guide is using a mirrored rpool as an example so if your own rpool just consists of one disk you can use this guide too just using one disk where the guide talks of two disks.

NB. It is always a good idea to perform a scrub before doing operations on the pool which is potentially dangerous!.

Configuration used in this guide

This is the current rpool:

$ zpool status
  pool: rpool
 state: ONLINE
  scan: scrub repaired 0 in 3h6m with 0 errors on Sat Apr  11 23:21:26 2020
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0

Disks available in the system:

AVAILABLE DISK SELECTIONS:
       0. c1t1d0 <VBOX-HARDDISK-1.0-16.00GB>
          /pci@0,0/pci8086,2829@1f,2/disk@1,0
       1. c1t2d0 <VBOX-HARDDISK-1.0-16.00GB>
          /pci@0,0/pci8086,2829@1f,2/disk@2,0
       2. c1t3d0 <VBOX-HARDDISK-1.0-16.00GB>
          /pci@0,0/pci8086,2829@1f,2/disk@3,0
       3. c1t4d0 <VBOX-HARDDISK-1.0-16.00GB>
          /pci@0,0/pci8086,2829@1f,2/disk@4,0

The task is to migrate the rpool from the mirror consisting of c1t1d0 and c1t2d0 to a new mirror consisting of c1t3d0 and c1t4d0.

So after completing this guide your rpool should look like this:

$ zpool status
  pool: rpool
 state: ONLINE
  scan: resilvered 1.59G in 0h11m with 0 errors on Sun Apr 12 00:35:53 2020
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c1t3d0  ONLINE       0     0     0
            c1t4d0  ONLINE       0     0     0

Attach the new disk(s) to rpool

The first step is to attach the new disks to the existing rpool using the command zpool attach like this:

$ sudo zpool attach rpool c1t1d0 c1t3d0
Password: 
Make sure to wait until resilver is done before rebooting.

Running the command zpool status after attaching the new disk will give this output:

$ 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.
  scan: resilver in progress since Mon Apr 13 14:24:45 2020
        18.1M scanned out of 1.60G at 1.21M/s, 0h22m to go
    16.1M resilvered, 1.10% done
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0
            c1t3d0  ONLINE       0     0     0

You must not do anything until resilver is done. So go and grab a cup of coffee or some other fluid you want to drink.

To monitor progress you can use this command:

$ yes "zpool status; sleep 10"|sh

Use Ctrl+c to quit the command.

The above should be done for every new disk which in this case means one more time for c1t4d0

Install boot block and boot loader to the new disk(s)

The next step is to install the boot block and the boot loader to the new disk(s) using the command bootadm install-bootloader like this:

$ sudo bootadm install-bootloader -P rpool

Reboot to test migration was successful

Before detaching the old disk(s) from the rpool we make a reboot to ensure everything was successful. Remember to change the first boot device in the BIOS to use the new disk (or one of the new disk(s)).

When rebooting you might see a warning from ‘devid register’ that device ids has changed in case you need to reorder the disks in the BIOS to be able to change boot device. This is just a warning which will be fixed by creating a new boot_archive either manually or automatically by OmniOSce when you reboot or power down your system.

Detach old disk(s) from the rpool

If you were able to make a successful reboot on the new disk(s) then the time has come to detach the old disk(s) from the rpool using the command zpool detach like this:

sudo zpool detach rpool c1t1d0
sudo zpool detach rpool c1t2d0

After detaching the old disk(s) from the rpool you should do a reboot to ensure everything is fine.

If the new disk(s) have a higher capacity than the old disk(s) and you want the new rpool to grow to the new size of the disk(s) you will have to run the following command:

zpool set autoexpand=on rpool

When rebooting you might see a warning from ‘devid register’ that device ids has changed when removing the old disk(s). This is just a warning which will be fixed by creating a new boot_archive either manually or automatically by OmniOSce when you reboot or power down your system.

Contact

Any problems or questions, please get in touch.