Topic: Howto: ZFS upgrade

Yesterday I upgraded my web server to the latest version of FreeBSD (9.0-RELEASE). 

FreeBSD 9.0 supports ZFS v28:

# zpool upgrade -v
This system is currently running ZFS pool version 28.

The following versions are supported:

VER  DESCRIPTION
---  --------------------------------------------------------
 1   Initial ZFS version
 2   Ditto blocks (replicated metadata)
 3   Hot spares and double parity RAID-Z
 4   zpool history
 5   Compression using the gzip algorithm
 6   bootfs pool property
 7   Separate intent log devices
 8   Delegated administration
 9   refquota and refreservation properties
 10  Cache devices
 11  Improved scrub performance
 12  Snapshot properties
 13  snapused property
 14  passthrough-x aclinherit
 15  user/group space accounting
 16  stmf property support
 17  Triple-parity RAID-Z
 18  Snapshot user holds
 19  Log device removal
 20  Compression using zle (zero-length encoding)
 21  Deduplication
 22  Received properties
 23  Slim ZIL
 24  System attributes
 25  Improved scrub stats
 26  Improved snapshot deletion performance
 27  Improved snapshot creation performance
 28  Multiple vdev replacements

For more information on a particular version, including supported releases,
see the ZFS Administration Guide.

Check ZFS version of our pools:

# zpool get all tank
NAME  PROPERTY       VALUE       SOURCE
tank  size           2.70T       -
tank  capacity       0%          -
tank  altroot        -           default
tank  health         ONLINE      -
tank  guid           16518060353267231552  local
tank  version        15          local
tank  bootfs         tank/root   local
tank  delegation     on          default
tank  autoreplace    off         default
tank  cachefile      -           default
tank  failmode       wait        default
tank  listsnapshots  off         default
tank  autoexpand     off         default
tank  dedupditto     0           default
tank  dedupratio     1.00x       -
tank  free           2.70T       -
tank  allocated      8.29G       -
tank  readonly       off         -

# zpool upgrade
This system is currently running ZFS pool version 28.

The following pools are out of date, and can be upgraded.  After being
upgraded, these pools will no longer be accessible by older software versions.

VER  POOL
---  ------------
15   tank

Use 'zpool upgrade -v' for a list of available versions and their associated
features.

So we need to upgrade our pool to the latest version:

# zpool upgrade -a
This system is currently running ZFS pool version 28.

Successfully upgraded 'tank'

If you boot from pool 'tank', don't forget to update boot code.
Assuming you use GPT partitioning and da0 is your boot disk
the following command will do it:

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

WARNING: Don't forget to upgrade boot partition/partitions!

Check disk labels:

# gpart show
=>        34  5860533101  ada0  GPT  (2.7T)
          34        2014        - free -  (1M)
        2048         128     1  freebsd-boot  (64k)
        2176    33554432     2  freebsd-swap  (16G)
    33556608  5826976527     3  freebsd-zfs  (2.7T)

=>        34  5860533101  ada1  GPT  (2.7T)
          34        2014        - free -  (1M)
        2048         128     1  freebsd-boot  (64k)
        2176    33554432     2  freebsd-swap  (16G)
    33556608  5826976527     3  freebsd-zfs  (2.7T)

I have mirror partitions, so I need to upgrade bootcode on both of them:

# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
bootcode written to ada0
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
bootcode written to ada1

Run once again:

# zfs upgrade -a
4 filesystems upgraded

Check zpool version:

# zpool get all tank
NAME  PROPERTY       VALUE       SOURCE
tank  size           2.70T       -
tank  capacity       0%          -
tank  altroot        -           default
tank  health         ONLINE      -
tank  guid           16518060353267231552  default
tank  version        28          default
tank  bootfs         tank/root   local
tank  delegation     on          default
tank  autoreplace    off         default
tank  cachefile      -           default
tank  failmode       wait        default
tank  listsnapshots  off         default
tank  autoexpand     off         default
tank  dedupditto     0           default
tank  dedupratio     1.00x       -
tank  free           2.70T       -
tank  allocated      8.30G       -
tank  readonly       off         -

And don't forget to reboot:

 # shutdown -r now