В даній статті розкажу про деякі методи швидкого збирання чи перезбирання ядра.
Типове збирання ядра виконується командою
$ make buildkernel
Ця команда не лише збирає ядро, а і ще перезбирає всі модулі, які входять у GENERIC (або у custom kernel, якщо вказана опція KERNCONF=MYKERNEL).
Якщо треба перезібрати ядро + деякі модулі, можна задати це через змінну MODULES_OVERRIDE:
$ make MODULES_OVERRIDE="tmpfs nullfs" buildkernel
Але, можна ще пришвидшити збірку, вказавши параметр KERNFAST:
$ make -DKERNFAST buildkernel
Ця команда перезбере лише змінені source файли де немає необхідності перезбирати все.
Зауваження!
KERNFAST працює лише тоді, коли ядро зібране хоч раз, тобто присутні obj файли у /usr/obj. Чому? Давайте розберемо. Ось витяг із man
KERNFAST If set, the build target buildkernel defaults to
setting NO_KERNELCLEAN, NO_KERNELCONFIG, and
NO_KERNELOBJ. When set to a value other than 1 then
KERNCONF is set to the value of KERNFAST.
Розглянемо кожну опцію.
NO_KERNELCLEAN: не запускати make clean перед збіркою, тобто, не видаляти файли з /usr/obj та *.o/*.ko, які якраз і треба для майбутньої збірки kernel
NO_KERNELCONFIG: не генерувати новий Makefile, а використовувати вже згенерований раніше
NO_KERNELOBJ: якщо простими словами, то це НЕ РОБИТИ підготовку до збірки, тобто НЕ створювати середовище, ієрархії каталогів в /usr/obj/usr/src/sys/MYKERNEL, а використовувати вже все існуюче.
Для спрощення, можна використовувати таку конструкцію
$ make KERNFAST=MYKERNEL buildkernel
замість такої:
$ make -DKERNFAST buildkernel KERNCONF=MYKERNEL
Отже, коли варто використовувати KERNFAST.
- якщо змінили пару файлів в якихось пару модулів
- якщо треба накласти security patch
- debug ядра
- дуже часто робити перезбірку ядра, міняючи щось незначне
У всіх інших випадках цього робити не треба
Якщо використовуєте KERNFAST, то доцільно ще використати WITH_META_MODE (без KERNFAST цей параметр немає сенсу використовувати), який покладається лише на зміну метаданих, тобто, якщо файл реально був змінений, а не просто виконана команда touch <file>.
META_MODE — це режим make(1) у FreeBSD, який:
- не покладається лише на timestamps
- відстежує реальні input/output команд
- зберігає метадані в .meta файлах
Тобто make знає не просто коли файл змінювався, а:
- якими файлами він був згенерований
- якою командою
- з якими флагами
Корисні посилання
https://man.freebsd.org/cgi/man.cgi?build(7)
https://freebsdfoundation.org/wp-content/uploads/2021/11/Kernel_Development_Recipes.pdf
https://xmj.github.io/articles/sysadmin/builds_ccache_memcached.html