Kernel Follower
os-kernelfollow · Система
Пересобирает внешний (out-of-tree) модуль ядра FreeBSD под ядро, которое устанавливает обновление OPNsense, до перезагрузки, чтобы драйвер не из собственного репозитория OPNsense был на месте при следующей загрузке.
В меню
- С установленным os-xgs-npu: XGS: Kernel Follower
- Без os-xgs-npu: System: Kernel Follower

Он читает ядро, которое возьмёт следующая загрузка, - набор ядра, подготовленный обновлением, или /boot/kernel, - прямо из бинарного файла, не загружая его, и сравнивает со штампом рядом с каждым зарегистрированным у него модулем. Модуль, который не совпадает, пересобирается под это ядро из исходников: из архива на самой машине или из github.com/opnsense/src на коммите, который называет ядро.
Он запускается из хука обновления, из хука остановки при каждой штатной перезагрузке - который задерживает перезагрузку до конца сборки, не более чем на десять минут, - и из cron каждые пять минут. Если модуль, нужный сети, пересобрать не удаётся, следующая загрузка один раз направляется на /boot/kernel.old, с которым совпадает установленный модуль; это отменяется, как только модуль пересобран.
Плагин регистрирует свой модуль одним файлом в /usr/local/etc/kernelfollow.d/. На Sophos XGS с os-xgs-npu os-xgs-npu сам следит за своими двумя модулями, octep.ko и npuep.ko, собственным механизмом: этот плагин оставляет их ему и только показывает, трогает nextboot лишь для отмены отката, который поставил сам, и оставляет старые исходники ядра os-xgs-npu для удаления.
Возможности
-
Ядро следующей загрузки
Читается из бинарного файла подготовленного набора ядра или /boot/kernel, без загрузки, и сравнивается со штампом каждого модуля.
-
Чистая пересборка
Сборка с нуля в предварительно очищенном каталоге, проверка, что каждый исходник скомпилирован с машинными заголовками этого ядра, установка под временным именем и перенос на место; предыдущая сборка сохраняется как .prev со своим штампом.
-
Запуск, когда это важно
Хук обновления, хук остановки при каждой штатной перезагрузке (не более десяти минут) и cron каждые пять минут. Если ничего не зарегистрировано, каждый запуск - это просто чтение каталога.
-
Откат ради сети
Модуль с пометкой CRITICAL=yes, который не удаётся пересобрать, один раз направляет следующую загрузку на /boot/kernel.old через nextboot -k; запуск, который его пересоберёт, это отменяет.
-
Удаление старых исходников
Исходники ядер, которые больше не работают, удаляются, когда новое ядро проработало сутки (это настройка), а каждый модуль совпадает с ним и загружен.
-
Check и Follow now
Страница показывает работающее ядро и ядро следующей загрузки, каждый модуль относительно него, исходники на диске и последний запуск; Check говорит, что сделает запуск, Follow now выполняет его.
Установка и обновление
Начиная с релиза os-xgs-npu, следующего за 0.1.0-alpha.7.1, XGS: Updates показывает его на вкладке Plugins — установленная копия обновляется там вручную, а отсутствующая там же устанавливается, — и готовые образы, собранные из этого релиза, содержат его; до тех пор он устанавливается и обновляется, как описано ниже. Запись cron плагина каждые пять минут запускает слежение за ядром, но никогда не обновление. Установить его на устройстве XGS или на любом другом OPNsense можно от root: из checkout репозитория командой sh install/install.sh, которая помещает страницу под XGS при os-xgs-npu и под System без него и сохраняет настройки при повторном запуске, - архивы исходников ядра в kernel-sources/ рядом с checkout позволяют собирать на машине без интернета; или из пакета релиза os-kernelfollow-1.0.0.pkg, проверенного по SHA256SUMS и добавленного через pkg. Установленная так копия обновляется собственным self-update.py. В репозитории плагинов OPNsense его нет.
Ограничения и то, что ещё не проверено
- Настоящее обновление ядра: подготовленный набор ядра, загрузка исходников по сети, хуки обновления и остановки.
- Сам nextboot и удаление старых исходников.
- Пакет, собранный tools/make-package.sh и добавленный через pkg.
- Установка на OPNsense без os-xgs-npu.
- Обновление через вкладку Plugins или self-update.py: 1.0.0 - первый релиз, поэтому ни один ещё не опережал установленную копию.
Репозиторий
Первый выпуск: 2026-10-25