#!/bin/sh # Automatic FreeBSD ZFS bootcode updater # Mark Felder # # REQUIRE: root # KEYWORD: nojail shutdown . /etc/rc.subr name=zfsbootcode desc="Updates ZFS bootcode automatically before shutdown" load_rc_config $name start_cmd=: stop_cmd=bootcode_check bootcode_check() { ZSIZE=$(stat -f %z /boot/gptzfsboot) BOOTCSUM=$(head -c $ZSIZE /boot/gptzfsboot | sha256) for blockdev in $(gpart show -p | awk '/freebsd-boot/ {print $3}'); do DISK=$(echo ${blockdev} | sed -E 's/^([a-z]+[0-9]+)p[0-9]+$/\1/') PART=$(echo ${blockdev} | sed -E 's/^[a-z]+[0-9]+p([0-9]+)$/\1/') if [ "$(head -c ${ZSIZE} /dev/${DISK}p${PART} | sha256)" != "${BOOTCSUM}" ]; then gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i ${PART} ${DISK} 2>&1 > /dev/null echo "Bootcode on /dev/${DISK}p${PART} has been updated." else echo "Bootcode on /dev/${DISK}p${PART} is up to date." fi done } run_rc_command "$1"