BSD Kernel

Майкл Эбен, Брайан Таймэн - FreeBSD. Администрирование <<---PDF    ст.327

Алексей Федорчук, Алексей Торн - FreeBSD                                <<---PDF    ст.134

Michael Lucas FreeBSD                                                                 <<---PDF    ст.156

Колисниченко_BSD                                                                         <<---PDF     ст.293

Сборка ядра

Конфигурационный файл

Сборка и установка ядра FreeBSD 11

Конфигурирование, сборка и установка ядра во FreeBSD

    В процессе установки нового ядра старое сохраняется в виде файла /boot/kernel.old. При сборке нового ядра может возникнуть ситуация, что мы допустили незначительную оплошность,  и решаем устранить ее, еще раз пересобрав ядро. В этом случае заново собранное ядро становится текущим, а предыдущее (с изъяном) в свою очередь заменит старое, рабочее ядро, которое исчезнет.  Когда обнаружится, что новое ядро содержит ту же самую или даже более серьезную ошибку, останется только горько сожалеть о том, что надежное ядро утеряно. По этому хорошей практикой будет перед настройкой ядра сохранить надежное работающее ядро: # cp -Rp /boot/kernel /boot/kernel.good

Кроме того, многие хранят копию ядра GENERIC в виде файла /boot/kernel.GENERIC для нужд тестирования и отладки. Ядер много не бывает, бывает лишь в том случае, если они совершенно заполнили корневой раздел.

Фактически настройка ядра сводится к следующим задачам:

1. определение (или переопределение) параметров ядра;

2. принудительное добавление указанных модулей в ядро;

3. принудительное запрещение загрузки указанных модулей.

Частным случаем является добавление и настройка драйверов устройств.

Конфигурационные файлы

/usr/src/sys - исходные коды ядра

   Ядро FreeBSD имеет монолитно-модульную архитектуру, что позволяет загружать и выгружать целые участки ядра, включая или выключая целые подсистемы по мере необходимости. Чаще всего приходится иметь дело с модулями устройств.

    Практически, динамическая загрузка модулей — это просто более гибкий способ изменения образа ядра во время выполнения — в отличие от перезагрузки с другим ядром. Модули позволяют легко расширить возможности ядра по мере необходимости, сохраняя основное достоинство монолитного ядра - высокую производительность Ядро по умолчанию хранится в виде файла /boot/kernel/kernel, модули ядра также хранятся в виде файлов в каталоге /boot/kernel.

    Имена файлов всех модулей ядра имеют расширение .ko. Обычно файлы модулей ядра получают имена, соответствующие их функциональности.Получить список загруженных в настоящий момент модулей ядра можно с помощью команды kldstat.

    Загрузка и выгрузка модулей ядра производится с помощью команд kldload и kldunload.

# kldload /boot/kernel/wlan_wep.ko

# kldunload wlan_wep.ko

    Модульная архитектура позволяет уменьшить ядро, сделать его более эффективным, а редко используемые функции загружать только в случае необходимости и "интерактивно".

Команды kldload и kldunload не требуют указания полного пути к модулю ядра, точно так же они не требуют указания расширения файла .ko. Если вы помните точное имя файла модуля ядра, можно использовать примерно такие команды:

# kldload wlan_wep

# kldunload wlan_wep

Автоматическая загрузка модулей ядра

    Для автоматической загрузки модуля надо добавить его в файл /boot/loader.conf. Файл по умолчанию loader.conf содержит множество примеров загрузки модулей ядра, в которых используется один и тот же синтаксис: 

    При рассмотрении файла можно заметить что, некоторые переменные файла loader.conf  не имеют конкретного значения, вместо значения используются пустые кавычки. Это означает, что загрузчик предлагает сделать выбор значения ядру, но если у вас появится необходимость переопределить значение, устанавливаемое ядром, у вас будет такая возможность. Например:  kern.nbuf=""

Ядро знает, какое значение выбрать для kern.nbuf, но вы с помощью loader.conf, можете указать свое значение.

LINUX:

lsmod (kldstat-BSD) - программа для просмотра состояния модулей ядра. Если ее выполнить под пользователем root без аргументов, команда выведет список загруженных на данный момент модулей. Список содержит следующие колонки: имя модуля, его размер в памяти, число компонентов системы, которые на текущий момент используют модуль, и список других модулей, которые от него зависят.

lsmod is a trivial program which nicely formats the contents of the /proc/modules, showing what kernel modules are currently loaded

/var/run/dmesg.boot  -  сообщения ядра с информацией об аппаратном окружении при загрузке системы

$ lsmod 

Module                  Size  Used by

nls_ascii              16384  0

nls_cp437              20480  0

vfat                   24576  0

fat                    90112  1 vfat

......................................


Примеры команд:

Команда /sbin/modprobe

/sbin/modprobe tulip  загружает модуль сетевого интерфейса tulip.

/sbin/rmmod tulip     выгружает модуль сетевого интерфейса tulip.

Другой полезной командой управления модулями ядра является modinfo. Вы можете выполнить команду /sbin/modinfo чтобы просмотреть информацию о модуле ядра. Общий синтаксис:

/sbin/modinfo [options] <module>


Ядро BSD более монолитно в отличии от Linux, то есть большинство жизненно важных устройств требует включения соответствующих опций статичной части ядра.

В общем и целом процесс конфигурирования заключается в простой правке одного из специально к тому предназначенных файлов GENERIC и LINT (NOTES) расположенных по пути -  /sys/i386/conf

root@bsd:/ # cd /sys/i386/conf

root@bsd:/sys/i386/conf # ls -al

total 96

drwxr-xr-x   2 root  wheel    512 Apr  7 16:37 .

drwxr-xr-x  15 root  wheel    512 Jul 21  2017 ..

-rw-r--r--   1 root  wheel    554 Jul 21  2017 DEFAULTS

-rw-r--r--   1 root  wheel  14789 Jul 21  2017 GENERIC

-rw-r--r--   1 root  wheel   1004 Jul 21  2017 GENERIC.hints

-rw-r--r--   1 root  wheel  14788 Apr  7 18:16 GENERIC.mykrnl

-rw-r--r--   1 root  wheel    139 Jul 21  2017 Makefile

-rw-r--r--   1 root  wheel  33634 Jul 21  2017 NOTES

-rw-r--r--   1 root  wheel    550 Jul 21  2017 PAE                (Physical Address Extension)

-rw-r--r--   1 root  wheel   2751 Jul 21  2017 XBOX               (xbox - SPARC SBus Expansion Subsystem)

root@bsd:/sys/i386/conf #

    В каждом конфигурационном файле ядра присутствуют записи пяти типов: 

Наличие или отсутствие этих записей определяет наличие поддержки аппаратных устройств или  функциональных возможностей.   

     cpu — Данная метка указывает, какие типы процессоров поддерживаются ядром. Конфигурационный файл ядра, предназначенного для устаревших персональных компьютеров, включал в себя несколько записей с указанием типа процессора, такие как 486 (I486_CPU), Pentium (I586_CPU) и для серии процессоров от Pentium Pro до современных Pentium 4 (I686_CPU). Конфигурация ядра для аппаратной платформы amd64/EM64T включает в себя единственную запись с указанием типа процессора. Конфигурация ядра может включать несколько типов процессоров при условии, что они принадлежат одной и той же архитектуре, – можно собрать ядро, которое будет работать и на процессорах 486, и на процессорах Pentium, но невозможно получить ядро, которое могло бы работать как на Intel совместимых процессорах, так и на процессорах Sparc.

    ident — Строка, начинающаяся с метки ident, содержит имя ядра. Именно таким образом ядро GENERIC получает свое имя. Это может быть любая произвольная строка.

    makeoptions —Данная строка содержит инструкции для программного обеспечения, выполняющего сборку ядра. Наиболее распространенный параметр – DEBUG=–g, который сообщает компилятору о необходимости включения в ядро отладочной информации. Отладочная информация помогает разработчикам в разрешении возникающих проблем.

    options —Записи этого типа описывают функции ядра, которые непосредственно не связаны с аппаратным обеспечением. Сюда входят файловые системы, сетевые протоколы и отладчики, встроенные в ядро.

    devices —Записи этого типа описывают устройства или драйверы устройств, они содержат инструкции, которые описывают, как ядро должно взаимодействовать с определенными устройствами. Если вам необходимо, чтобы система осуществляла поддержку некоторого аппаратного обеспечения, ядро должно включать драйвер этого аппаратного устройства. Некоторые записи этого типа соответствуют так называемым псевдоустройствам, которые в действительности не являются аппаратными устройствами, а обеспечивают поддержку целых категорий аппаратных устройств, таких как сетевые карты, генераторы случайных чисел или электронные диски. Здесь вполне может появиться вопрос – чем псевдоустройства отличаются от записей типа options. Дело в том, что псевдоустройства тем или иным способом отображаются в системе как устройства, тогда как функциональные возможности типа options не имеют отличительных особенностей, присущих устройствам. Например, петлевое (loopback) псевдоустройство – это сетевой интерфейс, который позволяет подключаться только к локальному компьютеру. В данном случае отсутствует какоелибо аппаратное обеспечение, тем не менее программы могут подключаться через петлевой интерфейс и обмениваться данными с программами, исполняемыми на том же самом компьютере.

sysctl

12.11. Настройка с помощью sysctl

sysctl — в BSD и Linux — команда, предназначенная для управления параметрами ядра на лету. Позволяет читать и изменять параметры ядра. Например - такие параметры как размер сегмента разделяемой памяти, ограничение на число запущенных процессов, а также включать функции наподобие маршрутизации.  Sysctl – это инструмент, во многих случаях он позволяющий увеличить производительность без повторной сборки ядра или переконфигурирования приложения.

Конфигурационный файл: /etc/sysctl.conf, в котором переопределяются необходимые параметры. Параметры настройки ядра организованы по древовидной схеме, которая называется базой управляющей информации (Management Information Base, MIB). В ней есть несколько основных категорий, таких как:

Уникальные имена переменных создаются из комбинации названия родительской категории и всех вложенных подкатегорий.

root@bsd:~ # sysctl -A | more      —Просмотреть всю базу MIB

root@bsd:~ # sysctl -A > sysctl.out   —Сохранить в файл sysctl.out

root@bsd:~ # sysctl net                    —Просмотреть отдельно по корням

root@bsd:~ # sysctl hw.ath.rxbuf    —Просмотреть отдельный параметр

hw.ath.rxbuf: 512                                         

root@bsd:~ # sysctl -d hw.ath.anical   —Просмотреть краткое описание, добавив ключ -d перед hw.ath.anical: ANI calibration (msecs)    полным  именем

                   

/etc/sysctl.conf     Конфигурационный файл в котором достаточно прописать значения параметров, что бы они автоматически устанавливались при старте системы

root@bsd:~ # cat /etc/sysctl.conf

# $FreeBSD: releng/11.1/etc/sysctl.conf 112200 2003-03-13 18:43:50Z mux $

#

#  This file is read when going to multi-user and its contents piped thru

#  ``sysctl'' to adjust kernel values.  ``man 5 sysctl.conf'' for details.

#

# Uncomment this to prevent users from seeing information about processes that

# are being run under another UID.

#security.bsd.see_other_uids=0


Файл /boot/loader.conf в том числе включает настроеки и значения systctl,  наряду с /etc/sysctl.conf  это один из основных файлов настройки "запуска" ядра поскольку много параметров определяются именно на этапе загрузки, этапе опроса устройств.

root@bsd:/boot # ls -al

total 1600

............

-r--r--r--   1 root  wheel    8192 Jul 21  2017 boot

-r--r--r--   1 root  wheel     512 Jul 21  2017 boot0

-r--r--r--   1 root  wheel     512 Jul 21  2017 boot0sio

-r--r--r--   1 root  wheel     512 Jul 21  2017 boot1

-r--r--r--   1 root  wheel    7680 Jul 21  2017 boot2

............

drwxr-xr-x   2 root  wheel   19456 Apr  8 15:44 kernel

drwxr-xr-x   3 root  wheel     512 Apr  8 13:19 kernel.good

drwxr-xr-x   2 root  wheel   19456 May  2  2018 kernel.old

-r-xr-xr-x   1 root  wheel  307200 Jul 21  2017 loader

-r--r--r--   1 root  wheel    7199 Jul 21  2017 loader.4th

-rw-r--r--   1 root  wheel      90 Apr  9 10:34 loader.conf

-r--r--r--   1 root  wheel   14766 Jul 21  2017 loader.help

-r--r--r--   1 root  wheel     430 Jul 21  2017 loader.rc

............

-r--r--r--   1 root  wheel     512 Jul 21  2017 mbr

............

# cd /sys/i386/conf

# cp GENERIC GENERIC.mykrnl

# cd /boot

# cp -Rp /boot/kernel /boot/kernel.good

-----------------------

# vim /var/run/dmesg.boot

# vim /sys/i386/conf/GENERIC.mykrnl

-----------------------

# cd /usr/src

# make buildkernel KERNCONF=GENERIC.mykrnl

# make installkernel KERNCONF=GENERIC.mykrnl

# reboot

==========================================

Чтобы полностью стереть из памяти загруженное ядро вместе со всеми модулями, существует команда unload.

Никакого подтверждения успешного выполнения этой операции вы не получите, но последующая команда lsmod продемонстрирует, что загрузчик не имеет никакой информации о файлах ядра.

Для загрузки другого ядра используется команда load.

load boot/kernel.good/kernel

# freebsd-update fetch

# freebsd-update install

В первую очередь изменения будут применены к ядру и его модулям. При использовании ядра с собственной конфигурацией укажите для следующей загрузки обновлённое ядро /boot/GENERIC с помощью nextboot:       # nextboot -k GENERIC

#pkg update -f

#pkg upgrade -f