Обновление FreeBSD через freebsd-update: патчи и переход на новую версию

freebsd-update — штатная утилита FreeBSD для бинарных обновлений базовой системы. Она делает две вещи: ставит исправления безопасности внутри текущего выпуска (например, 14.4-RELEASE-p1 → p3) и переводит систему на новый выпуск (14.4 → 14.5 или 14.x → 15.1). Сборка из исходников для этого не нужна.

Самый частый сценарий выглядит так. Сначала freebsd-update fetch и install, чтобы дойти до последнего патча. Затем freebsd-update upgrade -r 14.5-RELEASE, install, перезагрузка, ещё один install. После этого обновляют пакеты через pkg upgrade. При переходе на новую основную версию (14 → 15) пакеты переустанавливают принудительно и ещё раз запускают install, чтобы удалить старые библиотеки.

Ниже — пошаговые команды для FreeBSD 14.x и 15.x, сроки поддержки на осень 2026 года, проверка результата и разбор типичных ошибок. Включая ту, с которой начиналась эта статья в 2012 году на FreeBSD 8.2.

Сроки поддержки версий FreeBSD

Каждый минорный выпуск поддерживается три месяца после выхода следующего в той же ветке. Последний выпуск ветки поддерживается до конца поддержки всей ветки. Данные с freebsd.org/security на начало октября 2026 года:

ВыпускВышелПоддержка до
15.1-RELEASE16 июня 202631 марта 2027
15.0-RELEASE2 декабря 202530 сентября 2026 (уже не поддерживается)
14.5-RELEASE8 сентября 202630 июня 2027
14.4-RELEASE10 марта 202631 декабря 2026
14.3-RELEASE—30 июня 2026 (уже не поддерживается)
Ветка 13 (13.5)—30 апреля 2026 (уже не поддерживается)

Ветка 14 поддерживается до 30 ноября 2028 года, ветка 15 — до 31 декабря 2029 года. Вывод простой. Сервер на 13.x или 14.3 пора обновлять сейчас. С 15.0 — сразу на 15.1. С 14.4 — минимум на 14.5 до конца декабря 2026 года. Перед работой сверьтесь со страницей freebsd.org/security: таблица там обновляется с каждым выпуском.

Где работает freebsd-update, а где нет

  • Работает на системах, установленных из официальных образов -RELEASE для amd64 и arm64 (обычная установка с distribution sets).
  • Обновляет только ядро GENERIC. Своё ядро после обновления нужно пересобрать и установить заново.
  • Не работает на -STABLE и -CURRENT, собранных из исходников. Там обновляются через make buildworld.
  • Не нужен на системах с pkgbase (базовая система ставится пакетами FreeBSD-*). Такой вариант установки появился в 15.0, там база обновляется через pkg. Как определить: если pkg info -x '^FreeBSD-' показывает пакеты базы, у вас pkgbase.
  • Не трогает сторонний софт из портов и пакетов. Его обновляет pkg.

Начиная с 15.0 в FreeBSD два способа установки, но freebsd-update не объявлен устаревшим. Системы, поставленные классическим способом, обновляются им, как и раньше.

Файлы и каталоги

  • /etc/freebsd-update.conf — настройки. Главное: Components (что обновлять: src world kernel), KeepModifiedMetadata, MergeChanges (какие конфиги сливать при переходе на новый выпуск), CreateBootEnv (создавать загрузочное окружение ZFS перед установкой).
  • /var/db/freebsd-update/ — скачанные патчи, метаданные, состояние незавершённой установки. Нужно место: при переходе на новую версию — до нескольких сотен мегабайт.
  • /boot/kernel/ — текущее ядро, /boot/kernel.old/ — предыдущее после обновления.

Подготовка

  1. Резервная копия. Минимум — /etc, /usr/local/etc, /boot/loader.conf, базы данных и данные сайтов. Скопировать их на другой сервер удобно через rsync, см. scp, sftp и rsync: копирование файлов между серверами.
  2. Снимок ZFS. Если система загружается с ZFS, создайте загрузочное окружение: bectl create -r pre-14.5. Если что-то пойдёт не так, к нему можно вернуться через меню загрузчика. При CreateBootEnv yes в конфиге freebsd-update создаёт окружение сам, но ручной снимок с понятным именем не помешает.
  3. Консоль. Убедитесь, что есть доступ к консоли (IPMI, KVM, VNC у провайдера). Обновление по SSH работает, но если сервер не поднимется после перезагрузки, без консоли его не починить.
  4. Место на диске. df -h /var /usr /.
  5. Редактор. При конфликтах конфигов freebsd-update откроет редактор из переменной EDITOR. Если vi непривычен: setenv EDITOR ee (csh) или export EDITOR=ee (sh).

Посмотреть текущие версии ядра, установленного ядра и мира:

freebsd-version -kru

Примерно так:

14.4-RELEASE-p3
14.4-RELEASE-p3
14.4-RELEASE-p4

Первая строка — установленное ядро, вторая — работающее, третья — userland. Разные номера патчей у ядра и мира — нормальная ситуация: не каждый патч затрагивает ядро.

Обновление внутри выпуска: исправления безопасности

freebsd-update fetch
freebsd-update install

fetch скачивает патчи и показывает список файлов, которые изменятся. Список открывается в пейджере, выход — клавиша q. install ставит их. Если патч затронул ядро, нужна перезагрузка: shutdown -r now. После этого обновите пакеты:

pkg update
pkg upgrade

Проверить, есть ли непоставленные обновления, можно так:

freebsd-update updatesready

Автоматическая проверка

Чтобы сервер раз в день скачивал патчи и присылал письмо root, добавьте в /etc/crontab:

@daily root freebsd-update cron

cron только скачивает обновления в случайное время суток, ставить их всё равно нужно вручную через install. Это правильно: ядро без вашего ведома не обновится.

Переход на новый минорный выпуск: 14.4 → 14.5

Сначала доведите текущий выпуск до последнего патча (команды выше). Затем:

freebsd-update -r 14.5-RELEASE upgrade
freebsd-update install
shutdown -r now

Порядок upgrade -r 14.5-RELEASE и -r 14.5-RELEASE upgrade равнозначен. На этапе upgrade утилита определит установленные компоненты, скачает новые файлы и попробует слить изменения в ваших конфигах. Если слить автоматически не получилось, откроется редактор с маркерами конфликта <<<<<<<, =======, >>>>>>>. Оставьте нужный вариант и удалите маркеры. Потом утилита покажет списки удаляемых, добавляемых и изменяемых файлов.

Первый install ставит новое ядро. После перезагрузки система работает на новом ядре со старым миром. Ставим мир:

freebsd-update install

В пределах одной ветки ABI не меняется, поэтому пакеты достаточно обновить штатно: pkg update && pkg upgrade.

Переход на новую основную версию: 14.x → 15.1

На 15.1 можно перейти с 14.4 или 15.0. С более старых выпусков сначала поднимитесь до 14.4 или 14.5. Учтите, что в 15.0 удалены платформы i386, armv6 и 32-битный powerpc. Сервер на i386 на 15.x не переводится, только переустановка на amd64. 32-битные программы на amd64 по-прежнему работают.

# 1. Последние патчи текущего выпуска
freebsd-update fetch
freebsd-update install

# 2. Ядро новой версии
freebsd-update -r 15.1-RELEASE upgrade
freebsd-update install
shutdown -r now

# 3. После перезагрузки: мир
freebsd-update install

Теперь важный шаг. Сторонние пакеты собраны под FreeBSD 14 и ссылаются на старые библиотеки. Их нужно переустановить под новую ABI, начиная с самого pkg:

pkg-static install -f pkg
pkg update -f
pkg upgrade -f

Если пакеты собирали из портов, пересоберите их тем же способом, которым ставили (poudriere, portmaster). Модули ядра из портов (drm-kmod, virtualbox-ose-kmod и подобные) обязательно обновите до перезагрузки в следующий раз: модуль, собранный под ядро 14, на ядре 15 не загрузится.

Последний шаг удаляет старые библиотеки, которые больше не нужны:

freebsd-update install
shutdown -r now

Если сторонний софт ещё не переустановлен, этот шаг откладывают: иначе старые программы потеряют библиотеки. Если пересобрать что-то сразу нельзя, поставьте пакет совместимости misc/compat14x.

Загрузчик

freebsd-update обновляет файлы в /boot, но не трогает загрузчик в EFI-разделе и boot-код на диске. Это обязательный шаг при переходе на новую версию, особенно перед zpool upgrade.

UEFI на amd64:

efibootmgr -v
mount_msdosfs /dev/nda0p1 /boot/efi
cp /boot/loader.efi /boot/efi/efi/freebsd/loader.efi
cp /boot/loader.efi /boot/efi/efi/boot/bootx64.efi

Имя раздела (nda0p1, ada0p1, vtbd0p1) берите из вывода efibootmgr -v и gpart show. Если ESP уже смонтирован в /boot/efi, команду mount_msdosfs пропустите. Обновляйте только те файлы, которые реально есть на разделе.

BIOS (legacy) с GPT, где индекс 1 — раздел freebsd-boot из gpart show:

# ZFS
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
# UFS
gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 ada0

На зеркале или RAID-Z повторите команду для каждого диска, с которого можно загрузиться.

ZFS: не спешите с zpool upgrade

После обновления zpool status может сообщить, что пулу доступны новые функции. Не включайте их сразу. Пока функции не включены, можно откатиться на старое загрузочное окружение. После zpool upgrade старый загрузчик и старая система могут не прочитать пул. Сначала убедитесь, что всё работает и загрузчик обновлён.

Проверка результата

freebsd-version -kru
uname -a
pkg config ABI
pkg check -dsa

Все три строки freebsd-version должны показать новый выпуск. pkg config ABI должен показать FreeBSD:15:amd64 (или FreeBSD:14:amd64 после минорного обновления). pkg check -d ищет пакеты с неудовлетворёнными зависимостями, -s — с испорченными файлами. Затем проверьте службы: service -e покажет включённые, sockstat -4l — что слушает порты. Для быстрой оценки нагрузки после перезапуска удобен htop, см. htop и btop: мониторинг процессов в Linux и FreeBSD.

Откат

Последнюю установку можно отменить:

freebsd-update rollback
shutdown -r now

rollback отменяет только последний install, а не весь переход на новую версию. На ZFS надёжнее откатиться на загрузочное окружение: bectl list, затем bectl activate pre-14.5 и перезагрузка. Или выбрать окружение в меню загрузчика.

Типичные ошибки

СимптомПричинаРешение
... /usr/src/lib/libc/gen/...: no such file or directory на этапе installКомпонент src установлен частично: часть дерева /usr/src удалена вручнуюУдалите src из Components в /etc/freebsd-update.conf, если исходники не нужны. Либо создайте недостающий каталог (mkdir -p) и повторите fetch и install
You have a partially completed upgrade pendingПрошлый upgrade не доведён до концаВыполните freebsd-update install до конца. Если старый процесс брошен намеренно — fetch -F по подсказке утилиты
Cannot upgrade from a version that is not a releaseСистема -STABLE или -CURRENT из исходниковОбновляйтесь из исходников, freebsd-update тут не работает
fetch should not be run non-interactivelyfetch запущен из скрипта или cronВ cron используйте freebsd-update cron. В скриптах автоматизации — --not-running-from-cron fetch
No mirrors remaining, giving upНет доступа к update.FreeBSD.org: DNS, файрвол, проксиПроверьте host update.FreeBSD.org, правила pf/ipfw, переменную http_proxy
Newer FreeBSD version for package ... при pkg upgradeПакеты под новую версию, а система ещё на старой (не перезагрузились или не доставили мир)Доведите freebsd-update install и перезагрузку до конца. IGNORE_OSVERSION=yes — только если понимаете последствия
После перехода на 15.x программы падают с Shared object "libXXX.so.N" not foundСтарые библиотеки удалены финальным install до переустановки пакетовpkg upgrade -f, при необходимости misc/compat14x
После перезагрузки нет видео или сети, не грузится модульМодуль ядра из портов собран под старое ядроОбновите *-kmod-пакеты, проверьте kld_list в /etc/rc.conf
Своё ядро после обновления осталось старымfreebsd-update обновляет только GENERICПересоберите своё ядро из исходников новой версии

Первая строка таблицы — та самая ошибка из старой версии статьи. На FreeBSD 8.2 freebsd-update пытался обновить файл в /usr/src/lib/libc/gen/, но каталога не было. Тогда помогал mkdir -p /usr/src/lib/libc/gen и повтор fetch и install. Принцип не изменился: утилита считает компонент установленным и ждёт его файлы на месте. Сегодня аккуратнее не создавать пустые каталоги, а явно указать в Components, что обновлять.

Частые вопросы

Можно ли перепрыгнуть через выпуск, например 14.3 → 14.5?

В пределах ветки обычно да: freebsd-update -r 14.5-RELEASE upgrade работает с любого поддерживаемого или недавно снятого с поддержки выпуска. Для перехода на 15.1 официально поддерживаются исходные выпуски 14.4 и 15.0, поэтому с более старых систем сначала поднимитесь до последнего 14.x.

Сколько раз нужно запускать freebsd-update install?

При патчах внутри выпуска — один раз. При переходе на новый минорный выпуск — два: ядро, перезагрузка, мир. При переходе на новую основную версию — три: третий запуск после переустановки пакетов удаляет старые библиотеки.

Обновляет ли freebsd-update программы из портов и пакетов?

Нет. Он обновляет только базовую систему: ядро, userland, при необходимости /usr/src. Nginx, PHP, MySQL и всё остальное из /usr/local обновляется через pkg upgrade или пересборкой портов.

Нужно ли переходить на pkgbase?

Не обязательно. В 15.x оба способа поддерживаются, и freebsd-update остаётся штатным для классических установок. Проект планирует со временем сделать pkgbase основным. Переводить рабочий сервер стоит по официальной инструкции и после проверки на тестовой машине.

Как обновить jail?

У freebsd-update есть ключи -b (корень другой системы) и -j (имя запущенного jail). Удобнее пользоваться средствами менеджера jail (bastille, iocage, ezjail), они вызывают freebsd-update правильно. Мир jail не должен быть новее ядра хоста.

Что делать, если сервер не загрузился после обновления?

Через консоль выберите в меню загрузчика старое ядро (kernel.old) или прошлое загрузочное окружение ZFS. Загрузившись, разберитесь с причиной: чаще всего это модуль ядра из портов или свой loader.conf. Если менялся только последний install, поможет freebsd-update rollback.