Сборка custom ядра


Причин для сборки custom ядра может быть много, но основные это:
оптимизация по размеру;
оптимизация по скорости;
связанные с драйверами устройств (добавление, удаление или изменение режима работы).

Внимание: настройка custom ядра - это операция, предполагающая определенный уровень понимания своих действий и способная привести систему в нерабочее состояние. Данное руководство призвано прояснить некоторые детали и помочь в настройке ядра подготовленным пользователям.

Основная идея оптимизации ядра по размеру - удаление неиспользуемого кода. Это, прежде всего, неиспользуемые драйверы устройств и различные подсистемы. Для поиска используемых драйверов устройств можно использовать вывод dmesg(8), а так же специализированные программы, например, dmassage.

Неиспользуемые подсистемы ядра отключаются удалением соответствующих опций, например, если не используется двоичная совместимость с исполняемыми файлами Linux, можно удалить опцию COMPAT_LINUX и т. д. Список всех опций приведен в руководстве options(4).
Основные опции (на примере архитектуры i386)
Ниже приведен список опций, без которых работа ОС будет осложнена или невозможна:
I486_CPU
I586_CPU
I686_CPU Поддержка соответствующего семейства CPU (для архитектуры i386). В целях стабильности рекомендуется указывать все опции сразу.
KVM86 Поддержка эмуляции виртуального режима 8086-совместимого процессора. Требуется для устройства piixpcib(4). Возможно будет также использоваться для разработки бэкенда для драйвера wsfb(4).
FIFO Поддержка именованных каналов, достаточно распространенное средство межпроцессорного взаимодействия (IPC).
SYSVMSG
SYSVSEM
SYSVSHM Средства IPC из UNIX SystemV (очереди сообщений, семафоры, разделяемая память).
FFS,FFS2 Файловая система Berkeley Fast File System с поддержкой 2-ой версии.
INET Поддержка протоколов стека IPv4.
WSDISPLAY_COMPAT_USL
WSDISPLAY_DEFAULTSCREENS Поддержка виртуальных экранов.


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

Для того чтобы собрать ядро с поддержкой SMP для архитектуры i386 необходимо добавить в конфигурацио ядра опцию MULTIPROCESSOR, поддержку I/O APIC и устройств для дополнительных процессоров:
option MULTIPROCESSOR

cpu* at mainbus?
ioapic* at mainbus?
Поддержка расширенных возможностей архитектуры i386

За долгое время развития, архитектура i386 процессора вобрала в себя множество различных возможностей. Некоторые фундаментальны, некоторые опциональны. Ряд опциональных возможностей архитектуры i386 в OpenBSD представлен отдельными опциями или устройствами.
USER_LDT Добавляет возможность процессам менять локальную таблицу дескрипторов (LDT). Обычно ядро OpenBSD полагается на глобальную таблицу дескрипторов (GDT) и отдельные процессы не могут менять LDT. Однако, в ряде случаев, необходимо иметь возможность изменять её. Чаще всего это связано с работой файлов и библиотек других систем, например использование эмулятора Wine или Win32 кодеков в mplayer. Возможность изменения LDT должна быть явно задана sysctl-флагом machdep.userldt.


Также поддерживаются два псевдо-устройства, связанные с дополнительными возможностями процессоров семейства i386. Прежде всего это поддержка регистров атрибутов областей памяти, mtrr(4), управляющих параметрами кэширования:
pseudo-device mtrr

Эти регистры используются X Window System и теоретически ускоряют работу с видео подсистемой.

Второе псевдо-устройство предоставляет доступ к "счетчикам производительности" процессоров Intel и к счетчикам времени TSC на других процессорах, pctr(4):
pseudo-device pctr

"Счетчики производительности" процессоров Intel поддерживают широкие возможности по наблюдению за прерываниями, кэшированием и др., в то время как счетчик времени содержит монотонно возрастающее 64-битное значение, обнуляемое при включении процессора или при естественном переполнении разрядной сетки.

Эти средства часто используются в программах, измеряющих скорость работы каких-либо процессов. Просмотреть текущие значения счетчиков и запрограммировать их можно с помощью утилиты pctr(1).
Опции, используемые при отладке

Отладка ядра OpenBSD может выполняться в двух режимах: непосредственно после аварийного останова с использованием встроенного отладчика ddb(4) или отладка дампа памяти ядра в gdb(1) с использованием дополнительного ядра, содержащего отладочные символы. Возможно использование обоих методов. За возможность использования ddb отвечает опция DDB, для того чтобы отлаживать ядро по дампу памяти, необходимо соблюдение двух условий:
размер swap вмещает полный дамп памяти с некоторым запасом;
ядро собрано с опцией makeoptions DEBUG="-g".

Для отладки пользовательских процессов удобно использовать ktrace(1) или gdb(1). Для этого необходимо включить опции KTRACE и PTRACE.

Важной является и опция BOOT_CONFIG, разрешающая изменение параметров ядра на этапе загрузки через User Kernel Config (UKC).
Статистика и диагностика

OpenBSD поддерживает ряд опций, связанных со сбором статистики и дополнительными проверками в коде ядра:
ACCOUNTING Поддержка сбора статистики работы системы по процессам (сюда входят данные по нагрузке на процессор, дисковую подсистему и так далее). Реальное включение сбора статистики производится с помощью accton(8).
DIAGNOSTIC Включить дополнительные проверки в коде. Обычно это незначительные проверки, которые могут привести к kernel panic. Можно попробовать отключить данную опцию для достижения большей надежности системы, однако это может привести и к нежелательным последствиям.
KMEMSTATS Сбор статистики по использованию памяти. Может быть отключен на рабочих системах, поскольку требует дополнительных затрат процессора и памяти.


Для достижения повышенной скорости работы эти опции могут быть почти безболезненно удалены из конфигурации ядра.
Стеки протоколов IPv4 и IPv6
INET Поддержка стека протоколов IPv4. Во многих случаях опция необходима.
INET6 Поддержка стека протоколов IPv6. Требует IPv4. Если вы не работаете с IPv6, данную опцию можно отключить.
TCP_SACK Поддержка механизма выборочного подтверждения TCP сегментов (Selective Acknowledgements, RFC 2018). Позволяет повысить эффективность передачи TCP сегментов. TCP SACK должен поддерживаться сервером и клиентами.
TCP_ECN Поддержка явных уведомлений о перегрузках в сети (Explicit Congestion Notification, RFC 3168). Позволяет дополнительно регулировать скорость передачи TCP сегментов между двумя сторонами в следствии перегрузок в канале передачи. TCP ECN должен поддерживаться обоими сторонами.
TCP_SIGNATURE Поддержка подписи сегментов TCP с использованием MD5 хэш сумм (Protection of BGP Sessions via the TCP MD5 Signature Option, RFC 2385). Используется протоколом внешней маршрутизации BGP для установления подлиности отправителя. Возможность подписи сегментов TCP должна поддерживаться обоими сторонами. Требует наличия опции CRYPTO.
ALTQ Поддержка механизмов обеспечения качества обслуживания (Quality of Service, QoS). Включает в себя ряд дисциплин трафика: приоритетную, классовую и иерархическую. Управление очередями осуществляется посредством соответствующих правил pf.


Пакетный фильтр pf, работающий на межсетевом уровне (Internetworking) стека TCP/IP, поддерживает работу как с IPv4, так и с IPv6 в зависимости от конфигурации ядра. Поддержка pf в ядре включается добавлением псевдо-устройства:
pseudo-device pf

Для того, чтобы в правилах pf можно было использовать директиву log, необходимо добавить поддержку псевдо-интерфейса pflog(4):
pseudo-device pflog

Синхронизация таблицы состояний соединений (connection state table) реализуется через интерфейс pfsync(4), поддержка которого в ядре реализуется через псевдо-устройство:
pseudo-device pfsync

На основе pfsync(4), построен протокол Common Address Redundancy Protocol (CARP), реализуемый в OpenBSD через псевдо-устройство carp(4):
pseudo-device carp
Криптография в ядре. Использование криптографии в сетевых протоколах

Криптография очень широко используется в ядре OpenBSD. В основу положено обобщенное OpenBSD Cryptographic Framework (OCF), которое включается в сборку при указании опции CRYPTO - это базис для всего кода, использующего криптографию в ядре.

Опция UVM_SWAP_ENCRYPT включает шифрование страниц памяти до попадания в swap. По результатам тестирования на это затрачивается сравнительно немного ресурсов, но для повышения быстродействия на слабых машинах, возможно имеет смысл исключить эту опцию из файла конфигурации ядра. Отключить шифрование можно также через sysctl(8):
# sysctl vm.swapencrypt.enable=0

OpenBSD поддерживает ряд устройств, называемых крипто-акселераторами (hifn(4), ubsec(4) и др.), которые способны регистрировать в OCF поддерживаемые алгоритмы, и ядро в состоянии разгрузить работу по шифрованию на такие устройства. Доступ пользовательских программ (таких как OpenSSL) к этой подсистеме организуется через псевдоустройство crypto(4):
pseudo-device crypto

Практика показывает, что использование подобных устройств способно реально повысить быстродействие только в определенных случаях. Узкими местами являются пропускная способность шины PCI и медлительность самих устройств, по сравнению с современными CPU. Крипто-акселераторы могут повысить быстродействие в тех случаях, когда используются медленные CPU, шина PCI разгружена, а также при больших блоках шифруемых данных и при определенных алгоритмах шифрования (чаще всего - блочных симметричных шифрах, например 3DES). Однако, весьма эффективными являются криптографические средства, встроенные непосредственно в CPU. Ярким примером является процессор VIA Eden-N, поддерживающий инструкции работы с блочным симметричным шифрованием AES.

Поддержка IPsec включается опцией IPSEC. Требуется поддержка IPv4 стека (опция INET), OCF (опция CRYPTO) и специализированного псевдо-интерфейса enc(4), позволяющего фильтровать пакеты до и после их обработки кодом IPsec:
pseudo-device enc

Средства криптографии также применяются в ряде сетевых протоколов. При использовании BGP маршрутизации очень часто используются подписанные TCP сегменты для обеспечения аутентификации источника сообщений. В OpenBSD это делается добавлением опции TCP_SIGNATURE (это требует включенных опций INET, CRYPTO, IPSEC).

Протоколы pfsync(4) и carp(4) также используют криптографическую подпись пакетов, поэтому нуждаются в поддержке OCF и зависят от ряда компонент IPsec.
Файловые системы

Основной файловой системой в OpenBSD является Berkeley Fast File System. Также поддерживаются FAT, NTFS, Linux Extended 2, ISO-9660, UDF и две сетевые файловые системы: NFS и XFS.
FFS,FFS2 Файловая система Berkeley Fast File System с поддержкой 2-ой версии.
FFS_SOFTUPDATES Поддержка SoftUpdates для FFS и FFS2. За счет системы буферизации заметно увеличивает скорость записи на диск.
UFS_DIRHASH Хеширование содержимого директорий, повышает скорость доступа к директориям с большим количеством файлов.
QUOTA Поддержка квот на файловых системах FFS и FFS2.
MFS Поддержка создания файловой системы в оперативной памяти, способной к переходу в свап.
MSDOSFS Поддержка FAT12, FAT16 и FAT32.
NTFS Поддержка NTFS4 (Windows NT 4.0) и NTFS5 (Windows 2000 и более поздние) в режиме только для чтения.
EXT2FS Поддержка Linux Extended 2 File System (и Extended 3 без журналирования).
CD9660 Поддержка файловой системы ISO-9660, используемой на CD и DVD дисках (мультисессионные диски не поддерживаются).
UDF Поддержка файловой системы DVD. Некоторые DVD диски могут быть смонтированы как обычные CD.
NFSCLIENT
NFSSERVER Поддержка сетевой файловой системы NFS в режимах клиента и сервера.
XFS Поддержка сетевой распределенной файловой системы Andrew FS (AFS). Практически не используется.


Существуют и несколько виртуальных файловых систем: PROCFS и PORTAL. Однако, из-за архитектурных особенностей системы они являются необязательными. Файловая система PROCFS используется в основном с эмуляцией Linux, а поддержка PORTAL осталась со времен BSD UNIX и не несет в себе никакой смысловой нагрузки. Ранее также существовали файловые системы KERNFS, NULLFS, UMAPFS и другие, но были удалены по причине нестабильности или отсутствия в них нужды.
Совместимость с ранними версиями

OpenBSD, как и любая развивающаяся система, эволюционирует, но в тоже время пытается оставаться совместимой с прежними интерфейсами ядра и двоичными файлами, скомпилированными для ранних версий системы. Для этого существует ряд опций:
COMPAT_43 Самая старая из опций совместимости. Отвечает за поддержку ряда устаревших ioctl'ей для терминальных устройств и других незначительных интерфейсов. В настоящее время, в подавляющем большинстве случаев может быть опущена.
COMPAT_23
COMPAT_25
COMPAT_35 Опции совместимости с соответствующей версией OpenBSD. Они вводились, когда менялись интерфейсы ядра. Более подробно о том, для чего введены эти опции написано в руководстве options(4).
COMPAT_AOUT Поддержка двоичных файлов, собранных для OpenBSD/i386 версий ниже 3.4 (т.е. двоичные файлы формата a.out). Возможно будет необходимо также включить опции совместимости с предыдущими версиями OpenBSD. Эмуляция активизируется при включении опции kern.emul.aout.

Двоичная совместимость с другими системами

OpenBSD поддерживает эмуляцию системных вызовов для некоторых систем. Основным требованием является принадлежность двоичного файла и хостовой системе к одной архитектуре. Например OpenBSD поддерживает исполняемые файлы от Solaris, но программы, оттранслированные для архитектуры SPARC не загрузятся на i386-совместимом процессоре.

Подсистемы эмуляции опциональны и при желании могут не включаться в ядро.

Рассмотрим опции двоичной совместимости, предоставляемые для архитектуры i386. По умолчанию эмуляция всех систем является отключенной. Для активизации, необходимо выставить соответствующий sysctl-флаг.
COMPAT_LINUX Поддержка запускаемых файлов ОС Linux. (Возможно придется так же установить порт с библиотеками Linux системы, /usr/ports/emulators/redhat/). Эмуляция активизируется при включении kern.emul.linux. Подробную информацию можно получить из страницы руководства.
COMPAT_FREEBSD Поддержка запускаемых файлов ОС FreeBSD. (Существует порт, содержащий библиотеки FreeBSD, /usr/ports/emulators/freebsd_lib/). Эмуляция активизируется при включении kern.emul.freebsd. Подробную информацию можно получить из страницы руководства.
COMPAT_BSDOS
COMPAT_IBCS2
COMPAT_SVR4 Поддержка запускаемых файлов систем BSDI, Solaris, SCO и др. Подробную информацию можно найти в руководствах: compat_bsdos(8), compat_ibcs2(8), compat_svr4(8).


Если вы не используете двоичную совместимость с другими системами, настоятельно рекомендуется не включать эмуляцию, поскольку история проекта уже насчитывает ряд уязвимостей, выявленных в подсистеме эмуляции файлов iBCS2 и др.
X Window System
Для корректной работы X Window System необходимы или желательны следующие опции (платформа i386):
APERTURE Драйвер апертуры ядра, позволяет X серверу получать прямой доступ к видео памяти и регистрам PCI устройств. Непосредственное разрешение использования апертуры ядра осуществляется через sysctl-переменную: machdep.allowaperture=2.
USER_PCICONF Предоставляет прикладным процессам (например, X серверу) возможность получения доступа к конфигурации PCI устройств.
PCIAGP Позволяет получать доступ X сервера к GART (Graphics Address Remapping Table).
WSDISPLAY_COMPAT_RAWKBD
WSDISPLAY_COMPAT_PCVT Позволяет получить доступ к клавиатуре.


На архитектуре i386 система X Window System может использовать регистры атрибутов областей памяти, mtrr(4), управляющих параметрами кэширования. Использование этого механизма теоретически позволяет ускорить работу с видео подсистемой.
Пример конфигурации ядра

Теперь приведем укороченный пример конфигурации ядра для маршрутизатора на платформе i386 с поддержкой IPsec. Драйверы устройств опущены.

machine i386

maxusers 32

makeoptions DEBUG="-g"

option BOOT_CONFIG,TIMEZONE="-180"
option I486_CPU,I586_CPU,I686_CPU
option PCIVERBOSE,USBVERBOSE

option ACCOUNTING,CRYPTO,LKM
option KTRACE,PTRACE
option FIFO,SYSVMSG,SYSVSEM,SYSVSHM

option WSDISPLAY_COMPAT_USL,WSDISPLAY_COMPAT_RAWKBD
option WSDISPLAY_DEFAULTSCREENS=6,WSDISPLAY_COMPAT_PCVT
option WS_KERNEL_FG=WSCOL_WHITE,WS_KERNEL_BG=WSCOL_BLACK

option FFS,FFS2,MFS,FFS_SOFTUPDATES,UFS_DIRHASH
option CD9660

option INET,ALTQ,IPSEC
option TCP_SACK,TCP_ECN,TCP_SIGNATURE
option MROUTING

pseudo-device pf
pseudo-device pflog
pseudo-device pfsync
pseudo-device carp
pseudo-device bpfilter
pseudo-device loop
pseudo-device enc
pseudo-device gif
pseudo-device gre
pseudo-device tun
pseudo-device vlan
pseudo-device trunk

pseudo-device ksyms
pseudo-device systrace
pseudo-device pty 16
pseudo-device vnd 4

Обновлено: 13.03.2015