Категорії
FreeBSD Misc, staff, other

[FreeBSD] Швидко збираємо ядро

В даній статті розкажу про деякі методи швидкого збирання чи перезбирання ядра.

Типове збирання ядра виконується командою

$ 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://man.freebsd.org/cgi/man.cgi?query=src.conf&sektion=5&apropos=0&manpath=FreeBSD+15.0-RELEASE+and+Ports

https://freebsdfoundation.org/wp-content/uploads/2021/11/Kernel_Development_Recipes.pdf

https://xmj.github.io/articles/sysadmin/builds_ccache_memcached.html

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Домашняя страничка Andy
Записки молодого админа
Самостоятельная подготовка к Cisco CCNA
Самостоятельная подготовка к Cisco CCNP