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 содержит множество примеров загрузки модулей ядра, в которых используется один и тот же синтаксис:
Берется имя модуля ядра, без расширение файла .ko и добавляется к нему строка _load="YES". Например, чтобы автоматически загружать модуль /boot/kernel/procfs.ko, в файл loader.conf нужно добавить такую строку: procfs_load="YES"
При рассмотрении файла можно заметить что, некоторые переменные файла 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 #
DEFAULTS Это список параметров и устройств, поддержка которых включена по умолчанию для данной архитектуры. Наличие этого файла совершенно не означает, что можно скомпилировать и запустить ядро DEFAULTS, – это лишь отправная точка, позволяющая собрать ядро с минимальными возможностями.
GENERIC Этот файл содержит конфигурацию стандартного ядра. В нем присутствуют настройки, обеспечивающие поддержку стандартного аппаратного окружения, необходимую для запуска ядра на данной архитектуре – этот конфигурационный файл используется инсталлятором системы.
GENERIC.hints Это файл с указаниями, который впоследствии устанавливается как /boot/device.hints. В данном файле содержится конфигурационная информация, необходимая для настройки устаревших аппаратных устройств.
NOTES Это комплексная конфигурация ядра для заданной аппаратной архитектуры. В файл NOTES включены все особенности, характерные для той или иной платформы. Платформо-независимые особенности можно найти в файле /usr/src/sys/conf/NOTES.
В каждом конфигурационном файле ядра присутствуют записи пяти типов:
cpu
ident
makeoptions
options
devices
Наличие или отсутствие этих записей определяет наличие поддержки аппаратных устройств или функциональных возможностей.
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). В ней есть несколько основных категорий, таких как:
net (network – сеть)
vm (virtual memory – виртуальная память)
kern (kernel – ядро).
Уникальные имена переменных создаются из комбинации названия родительской категории и всех вложенных подкатегорий.
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
https://www.freebsd.org//handbook/updating-upgrading-freeb.html
# freebsd-update fetch
# freebsd-update install
В первую очередь изменения будут применены к ядру и его модулям. При использовании ядра с собственной конфигурацией укажите для следующей загрузки обновлённое ядро /boot/GENERIC с помощью nextboot: # nextboot -k GENERIC
#pkg update -f
#pkg upgrade -f