Если вы используете ZFS как основную файловую систему и при обновлении с 12 до 13 версии сервер перестал грузиться, то под катом можно найти инструкцию по восстановлению работоспособности системы.

О проблеме

Было самое обычное утро и ничего не предвещало беды. Однако, уже несколько недель FreeBSD на стареньком HP ProLiant G7 MicroServer настойчиво требовала обновиться до 13 версии.

Эта машина уже пережила несколько апгрейдов. И в этот раз без особых проблем с помощью freebsd-update я установил все обновления.

Но этой истории не было бы, если бы не zpool status с предупреждением об устаревшей версии ZFS:

status: The pool is formatted using an older on-disk format.  The pool can
        still be used, but some features are unavailable.
action: Upgrade the pool using 'zpool upgrade'.  Once this is done, the
        pool will no longer be accessible on older software versions.

Выполнения zpool upgrade -v прошло штатно и ничего не предвещало беды. На всякий случай я перезагрузил машину и получил забавное сообщение:

/boot/config: @

FreeBSD/x86 boot
Default: zroot/ROOT/default: @
boot:
|
Can't find @

Загрузка остановилась на stage 2. А неопознанный символ @ намекает на проблемы с загрузочной записью/конфигом.

Решение

Сперва нам понадобится Live USB, образ можно скачать по ссылке, а записать с помощью команды:

dd if=FreeBSD-13.0-RELEASE-amd64.iso of=/dev/sda bs=1M status=progress

Алгоритм починки:

  1. Загрузиться с Live USB
  2. Войти под root (пароль пустой)
  3. Создать альтернативную точку монтирования для нашего zfs пула
    mkdir /tmp/root
    
  4. Импортировать zroot pool в /tmp/root
    zroot import -fR /tmp/root zroot
    
  5. Смонтировать zroot/ROOT/default. Данный раздел содержит /boot
    zfs mount zroot/ROOT/default
    
  6. Переписать загрузчик
    gpart bootcode -b /tmp/root/boot/pmbr -p /tmp/root/boot/gptzfsboot -i 1 ada0
    
  7. Экспортировать zpool
    cd /
    zpool export zroot
    
  8. Перезагружаем машину, не забывая убрать USB.

Заключение

Задача простая, но учитывая, что по FreeBSD информации не очень много (особенно в рунете), надеюсь материал окажется полезным и сохранит ваше время.