Конфигурация и сборка ядра FreeBSD 14
В большинстве случае собирать свое ядро FreeBSD 14 не имеет смысла для x86-64 архитектуры. Того что в ядре нет можно подключить как модули ядра при загрузке системы. Собрать свое ядро есть смысл, если сервер имеет очень мало оперативной памяти или необходима очень сильная оптимизация производительности. При такой сборке будут выкинуты лишние драйвера, ненужные компоненты ядра и добавлены если необходимо недостающие. Для сборки ядра необходимы исходные коды FreeBSD системы.
1. Обновление исходных кодов через Git
1.1. Установка Git
Нужно установить Git (система управления версиями), если ранее не была установлена.
Устанавливаем из портов, с нужными опциями
cd /usr/ports/devel/git/ && make install clean
Или устанавливаем через пакеты
pkg install git
Достаточно поставить облегчённую версию git-lite или git-tiny (у этих версий меньше зависимостей). Используем команду: pkg install git-tiny
1.2. Получение исходных кодов
Если исходные коды ранее получались другим способом, необходимо удалить содержимое каталога /usr/src/ или сам каталог. Если этого не сделать будет выведено сообщение fatal: destination path '/usr/src' already exists and is not an empty directory. при попытке клонировать репозиторий.
Удаляем каталог /usr/src
rm -rf /usr/src/
Проверяем версию установленной FreeBSD системы
uname -r
14.0-RELEASE
Существует три ветки исходных кодов в зависимости от версии FreeBSD.
Версия FreeBSD | Ветка репозитория | Описание ветки и версии |
---|---|---|
14.0-RELEASE | releng/14.0 | Самая стабильная версия, получает только обновления безопасности. |
14.0-STABLE | stable/14 | Версия RELEASE плюс все дополнительные разработки в этой ветке. Бывают встречаются ошибки. |
14-CURRENT | main | Версия в режиме разработки, нестабильная, может содержать серьезные ошибки. |
По умолчанию установлена RELEASE версии системы, поэтому выбираем ветку репозитория releng/14.0
Клонируем официальный репозиторий исходных кодов FreeBSD
git clone --branch releng/14.0 https://git.FreeBSD.org/src.git /usr/src
1.3. Обновление исходных кодов
Обновляем исходные коды используя команду, где параметр -С путь до каталога исходных кодов.
git -C /usr/src pull
Или переходим в каталог исходных кодов и выполняем команду
cd /usr/src/
git pull
Исходные коды успешно обновлены.
1.4. Смена ветки исходных кодов
Если было обновление операционной системы FreeBSD на более новую версию, необходимо сменить ветку репозитория. Допустим было обновление до FreeBSD 14.
Переходим в каталог исходных кодов
cd /usr/src/
Изменяем ветку на более новую версию
git checkout releng/14.0
Обновляем исходные коды
git pull --rebase
2. Конфигурация ядра FreeBSD 14
Переходим в каталог conf той архитектуры на которой работает сервер, в моем случаи это amd64(x86-64 архитектура).
cd /usr/src/sys/amd64/conf
Создаем файл конфигурации ядра путем копирования файл GENERIC(конфигурация базового ядра).
Скопируем файл конфигурации базового ядра GENERIC в MYKERNEL
cp GENERIC MYKERNEL
MYKERNEL — имя собственного ядра, принято использовать английские ЗАГЛАВНЫЕ буквы.
Также в этой папке (/usr/src/sys/amd64/conf) содержатся файлы конфигурации других ядер от разработчика FreeBSD. На основе файл MINIMAL(конфигурация ядра с минимальными параметрами) можно понять какие параметры необходимы, хотя там можно тоже убрать часть параметров.
Открываем файл конфигурации собственного ядра
nano MYKERNEL
Редактируем файл конфигурации ядра.
По мере изучения параметров я добавляю их описание, перевод и обновляю статью.
Примерная конфигурацию ядра FreeBSD 14 которую я использовал…
#
# MYKERNEL -- Мое ядра для FreeBSD 14 / amd64
#
cpu HAMMER # Архитектура CPU. HAMMER это amd64(x86-64)
ident MYKERNEL # Имя ядра, как имя файла
makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
makeoptions WITH_CTF=1 # Run ctfconvert(1) for DTrace support
# IPFW + NAT (FireWall и Маршрутизация) - в ядре изначально нет
options IPFIREWALL # Включить IPFW
options IPFIREWALL_NAT # Включить базовый NAT
options LIBALIAS # Включить полный NAT
options SCHED_ULE # ULE scheduler (планировщик)
options NUMA # Non-Uniform Memory Architecture support
options PREEMPTION # Enable kernel thread preemption
#options VIMAGE # Subsystem virtualization, e.g. VNET (используется для виртулизации)
# Раздел для управления сетями и их оптимизацией
options INET # InterNETworking (поддержка сетевых возможностей)
options INET6 # IPv6 communications protocols (поддержка протокола IPv6)
#options IPSEC_SUPPORT # Allow kldload of ipsec and tcpmd5 (IPsec используется для VPN)
#options ROUTE_MPATH # Multipath routing support (балансировка исходящего между интерфейсами)
options FIB_ALGO # Modular fib lookups
options TCP_OFFLOAD # TCP offload (обработке пакетов на сетевой карте, если она это поддерживает)
options TCP_BLACKBOX # Enhanced TCP event logging
options TCP_HHOOK # hhook(9) framework for TCP
options TCP_RFC7413 # TCP Fast Open
options SCTP_SUPPORT # Allow kldload of SCTP
options KERN_TLS # TLS transmit & receive offload
# Unix file system (UFS) и настройки для нее
options FFS # Поддержка Unix file system (UFS)
options SOFTUPDATES # Включить для FFS soft updates поддержку (повышает скорость записи на диск)
options UFS_ACL # Support for access control lists
options UFS_DIRHASH # Improve performance on big directories
options UFS_GJOURNAL # Enable gjournal-based UFS journaling
options QUOTA # Enable disk quotas for UFS
#options MD_ROOT # MD is a potential root device (диск в памяти для корневого каталога)
# Сетевая файловая система. Если по сети не будет нечего монтировать, то можно отключить.
#options NFSCL # Network Filesystem Client (клиент сетевой файловой система)
#options NFSD # Network Filesystem Server (сервер сетевой файловой система)
#options NFSLOCKD # Network Lock Manager
#options NFS_ROOT # NFS usable as /, requires NFSCL (NFS использовать для коревого каталога)
# Различные файловые системы.
options MSDOSFS # MSDOS Filesystem (EFI раздел это FAT32)
#options CD9660 # ISO 9660 Filesystem (файловая система CD-дисков)
#options PROCFS # Process filesystem (requires PSEUDOFS)
#options PSEUDOFS # Pseudo-filesystem framework
options TMPFS # Efficient memory filesystem (файловая система в оперативной памяти)
#options GEOM_RAID # Soft RAID functionality. (поддержка програмного RAID)
#options GEOM_LABEL # Provides labelization (позволяет монтирование через метку раздела)
options EFIRT # EFI Runtime Services support
# Совместимость со старыми версиями системы. В теории это все можно выкинуть.
options COMPAT_FREEBSD32 # Compatible with i386 binaries (32-bit)
options COMPAT_FREEBSD4 # Compatible with FreeBSD4
options COMPAT_FREEBSD5 # Compatible with FreeBSD5
options COMPAT_FREEBSD6 # Compatible with FreeBSD6
options COMPAT_FREEBSD7 # Compatible with FreeBSD7
options COMPAT_FREEBSD9 # Compatible with FreeBSD9
options COMPAT_FREEBSD10 # Compatible with FreeBSD10
options COMPAT_FREEBSD11 # Compatible with FreeBSD11
options COMPAT_FREEBSD12 # Compatible with FreeBSD12
options COMPAT_FREEBSD13 # Compatible with FreeBSD13
options SCSI_DELAY=5000 # Delay (in ms) before probing SCSI
options KTRACE # ktrace(1) support
options STACK # stack(9) support
options SYSVSHM # SYSV-style shared memory
options SYSVMSG # SYSV-style message queues
options SYSVSEM # SYSV-style semaphores
options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
options PRINTF_BUFR_SIZE=128 # Prevent printf output being interspersed.
options KBD_INSTALL_CDEV # install a CDEV entry in /dev
options HWPMC_HOOKS # Necessary kernel hooks for hwpmc(4)
options AUDIT # Security event auditing
options CAPABILITY_MODE # Capsicum capability mode
options CAPABILITIES # Capsicum capabilities
options MAC # TrustedBSD MAC Framework
options KDTRACE_FRAME # Ensure frames are compiled in
options KDTRACE_HOOKS # Kernel DTrace hooks
options DDB_CTF # Kernel ELF linker loads CTF data
options INCLUDE_CONFIG_FILE # Include this file in kernel (config -x /boot/kernel/kernel)
#options RACCT # Resource accounting framework
#options RACCT_DEFAULT_TO_DISABLED # Set kern.racct.enable=0 by default
#options RCTL # Resource limits
# Debugging support. Always need this:
#options KDB # Enable kernel debugger support.
#options KDB_TRACE # Print a stack trace for a panic.
# Kernel Sanitizers
#options COVERAGE # Generic kernel coverage. Used by KCOV
#options KCOV # Kernel Coverage Sanitizer
# Warning: KUBSAN can result in a kernel too large for loader to load
#options KUBSAN # Kernel Undefined Behavior Sanitizer
#options KCSAN # Kernel Concurrency Sanitizer
# Kernel dump features. (возможности дампа ядра, у меня отключено)
#options EKCD # Support for encrypted kernel dumps
#options GZIO # gzip-compressed kernel and user dumps
#options ZSTDIO # zstd-compressed kernel and user dumps
#options DEBUGNET # debugnet networking
#options NETDUMP # netdump(4) client support
#options NETGDB # netgdb(4) client support
# Make an SMP-capable kernel by default (если одноядерный процессор можно убрать опцию)
options SMP # Symmetric MultiProcessor Kernel (многопоточность по умолчанию)
# CPU frequency control (регулировка частоты CPU)
device cpufreq
# Bus support. (основные системные шины)
device acpi
device smbios
options IOMMU
device pci
options PCI_HP # PCI-Express native HotPlug
options PCI_IOV # PCI SR-IOV support
options COMPAT_LINUXKPI
# Enable support for the kernel PLL to use an external PPS signal,
# under supervision of [x]ntpd(8)
# More info in ntpd documentation: http://www.eecis.udel.edu/~ntp
options PPS_SYNC
# Floppy drives (дисковод)
#device fdc
# ATA controllers (можно отключить есть используются только NVME накопитель)
device ahci # AHCI-compatible SATA controllers
device ata # Legacy ATA/SATA controllers
device mvs # Marvell 88SX50XX/88SX60XX/88SX70XX/SoC SATA
device siis # SiliconImage SiI3124/SiI3132/SiI3531 SATA
# SCSI Controllers (SCSI устройства, у меня их нет)
#device ahc # AHA2940 and onboard AIC7xxx devices
#device ahd # AHA39320/29320 and onboard AIC79xx devices
#device hptiop # Highpoint RocketRaid 3xxx series
#device isp # Qlogic family
#device ispfw # Firmware for QLogic HBAs- normally a module
#device mpt # LSI-Logic MPT-Fusion
#device mps # LSI-Logic MPT-Fusion 2
#device mpr # LSI-Logic MPT-Fusion 3
#device sym # NCR/Symbios Logic
#device isci # Intel C600 SAS controller
#device ocs_fc # Emulex FC adapters
#device pvscsi # VMware PVSCSI
# ATA/SCSI peripherals (устройства SATA и SCSI)
device scbus # SCSI bus (required for ATA/SCSI)
#device ch # SCSI media changers
device da # Direct Access (disks)
#device sa # Sequential Access (tape etc)
#device cd # CD
device pass # Passthrough device (direct ATA/SCSI access)
#device ses # Enclosure Services (SES and SAF-TE)
#device ctl # CAM Target Layer
# RAID controllers interfaced to the SCSI subsystem (RAID устройства подключенные к SCSI)
#device arcmsr # Areca SATA II RAID
#device ciss # Compaq Smart RAID 5*
#device ips # IBM (Adaptec) ServeRAID
#device smartpqi # Microsemi smartpqi driver
#device tws # LSI 3ware 9750 SATA+SAS 6Gb/s RAID controller
# RAID controllers (RAID устройства)
#device aac # Adaptec FSA RAID
#device aacp # SCSI passthrough for aac (requires CAM)
#device aacraid # Adaptec by PMC RAID
#device ida # Compaq Smart RAID
#device mfi # LSI MegaRAID SAS
#device mlx # Mylex DAC960 family
#device mrsas # LSI/Avago MegaRAID SAS/SATA, 6Gb/s and 12Gb/s
#XXX pointer/int warnings
#device pst # Promise Supertrak SX6000
# NVM Express (NVMe) support (поддержка NVME накопителей, у меня SATA)
#device nvme # base NVMe driver
#device nvd # expose NVMe namespaces as disks, depends on nvme
# Intel Volume Management Device (VMD) support
#device vmd
# atkbdc0 controls both the keyboard and the PS/2 mouse (контролер для клавиатуры и PS/2 мышки)
device atkbdc # AT keyboard controller
device atkbd # AT keyboard
device psm # PS/2 mouse
#device kbdmux # keyboard multiplexer (несколько клавиатур)
# syscons is the legacy console driver, resembling an SCO console (На VDS выключить?)
device vga # VGA video card driver
device splash # Splash screen and screen saver support
device sc
options SC_PIXEL_MODE # add support for the raster text mode
# vt is the default video console driver (На VDS выключить?)
device vt
device vt_vga
device vt_efifb
device vt_vbefb
#device agp # support several AGP chipsets (AGP видеокарты)
# CardBus bridge support (PCMCIA устройства старых ноутбуков)
#device cbb # CardBus (yenta) bridge
#device cardbus # CardBus (32-bit) bus
# Serial (COM) ports
#device uart # Generic UART driver
# Parallel port (параллельный порт - LPT)
#device ppc
#device ppbus # Parallel port bus (required)
#device lpt # Printer
#device ppi # Parallel port interface device
#device vpo # Requires scbus and da
#device puc # Multi I/O cards and multi-channel UARTs
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Далее идут разделы с Ethernet сетевыми картами, оставляем устройства которые используются в системе.
# По умолчанию все устройства включены.
# PCI/PCI-X/PCIe Ethernet NICs that use iflib infrastructure
device iflib # iflib infrastructure (обязательно для сетевых карт этого раздела)
device em # Intel PRO/1000 Gigabit Ethernet Family
#device igc # Intel I225 2.5G Ethernet
#device ix # Intel PRO/10GbE PCIE PF Ethernet
#device ixv # Intel PRO/10GbE PCIE VF Ethernet
#device ixl # Intel 700 Series Physical Function
#device iavf # Intel Adaptive Virtual Function
#device ice # Intel 800 Series Physical Function
#device vmx # VMware VMXNET3 Ethernet
#device axp # AMD EPYC integrated NIC (requires miibus)
# PCI Ethernet NICs.
#device bxe # Broadcom NetXtreme II BCM5771X/BCM578XX 10GbE
#device le # AMD Am7900 LANCE and Am79C9xx PCnet
#device ti # Alteon Networks Tigon I/II gigabit Ethernet
# Nvidia/Mellanox Connect-X 4 and later, Ethernet only
# o requires COMPAT_LINUXKPI and xz(4)
# o mlx5ib requires ibcore infra and is not included by default
#device mlx5 # Base driver
#device mlxfw # Firmware update
#device mlx5en # Ethernet driver
# PCI Ethernet NICs that use the common MII bus controller code.
# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
#device miibus # MII bus support (обязательно для сетевых карт этого раздела)
#device ae # Attansic/Atheros L2 FastEthernet
#device age # Attansic/Atheros L1 Gigabit Ethernet
#device alc # Atheros AR8131/AR8132 Ethernet
#device ale # Atheros AR8121/AR8113/AR8114 Ethernet
#device bce # Broadcom BCM5706/BCM5708 Gigabit Ethernet
#device bfe # Broadcom BCM440x 10/100 Ethernet
#device bge # Broadcom BCM570xx Gigabit Ethernet
#device cas # Sun Cassini/Cassini+ and NS DP83065 Saturn
#device dc # DEC/Intel 21143 and various workalikes
#device et # Agere ET1310 10/100/Gigabit Ethernet
#device fxp # Intel EtherExpress PRO/100B (82557, 82558)
#device gem # Sun GEM/Sun ERI/Apple GMAC
#device jme # JMicron JMC250 Gigabit/JMC260 Fast Ethernet
#device lge # Level 1 LXT1001 gigabit Ethernet
#device msk # Marvell/SysKonnect Yukon II Gigabit Ethernet
#device nfe # nVidia nForce MCP on-board Ethernet
#device nge # NatSemi DP83820 gigabit Ethernet
#device re # RealTek 8139C+/8169/8169S/8110S
#device rl # RealTek 8129/8139
#device sge # Silicon Integrated Systems SiS190/191
#device sis # Silicon Integrated Systems SiS 900/SiS 7016
#device sk # SysKonnect SK-984x & SK-982x gigabit Ethernet
#device ste # Sundance ST201 (D-Link DFE-550TX)
#device stge # Sundance/Tamarack TC9021 gigabit Ethernet
#device vge # VIA VT612x gigabit Ethernet
#device vr # VIA Rhine, Rhine II
#device xl # 3Com 3c90x (``Boomerang'', ``Cyclone'')
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Wireless NIC cards (поддержка Wi-Fi и беспроводные сетевые карты)
#device wlan # 802.11 support (поддержка Wi-Fi, у меня не используется)
#options IEEE80211_DEBUG # enable debug msgs
#options IEEE80211_SUPPORT_MESH # enable 802.11s draft support
#device wlan_wep # 802.11 WEP support
#device wlan_ccmp # 802.11 CCMP support
#device wlan_tkip # 802.11 TKIP support
#device wlan_amrr # AMRR transmit rate control algorithm
#device ath # Atheros CardBus/PCI NICs
#device ath_hal # Atheros CardBus/PCI chip support
#options AH_AR5416_INTERRUPT_MITIGATION # AR5416 interrupt mitigation
#options ATH_ENABLE_11N # Enable 802.11n support for AR5416 and later
#device ath_rate_sample # SampleRate tx rate control for ath
#device bwi # Broadcom BCM430x/BCM431x wireless NICs.
#device bwn # Broadcom BCM43xx wireless NICs.
#device ipw # Intel 2100 wireless NICs.
#device iwi # Intel 2200BG/2225BG/2915ABG wireless NICs.
#device iwn # Intel 4965/1000/5000/6000 wireless NICs.
#device malo # Marvell Libertas wireless NICs.
#device mwl # Marvell 88W8363 802.11n wireless NICs.
#device ral # Ralink Technology RT2500 wireless NICs.
#device wpi # Intel 3945ABG wireless NICs.
# Pseudo devices. (псевдоустройства)
device crypto # core crypto support
device aesni # AES-NI OpenCrypto module
device loop # Network loopback
device padlock_rng # VIA Padlock RNG
device rdrand_rng # Intel Bull Mountain RNG
device ether # Ethernet support
device vlan # 802.1Q VLAN support
device tuntap # Packet tunnel.
device md # Memory "disks"
device gif # IPv6 and IPv4 tunneling (туннелирование IPv6 и IPv4)
device firmware # firmware assist module
device xz # lzma decompression
# The `bpf' device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
# Note that 'bpf' is required for DHCP. (используется для DHCP)
device bpf # Berkeley packet filter
# USB support (поддержка USB, если не используется можно отключить)
options USB_DEBUG # enable debug msgs
device uhci # UHCI PCI->USB interface
device ohci # OHCI PCI->USB interface
device ehci # EHCI PCI->USB interface (USB 2.0)
device xhci # XHCI PCI->USB interface (USB 3.0)
device usb # USB Bus (required)
device ukbd # Keyboard (USB клавиатура)
device umass # Disks/Mass storage - Requires scbus and da
# Sound support (звук, для сервера не нужен)
#device sound # Generic sound driver (required)
#device snd_cmi # CMedia CMI8338/CMI8738
#device snd_csa # Crystal Semiconductor CS461x/428x
#device snd_emu10kx # Creative SoundBlaster Live! and Audigy
#device snd_es137x # Ensoniq AudioPCI ES137x
#device snd_hda # Intel High Definition Audio
#device snd_ich # Intel, NVidia and other ICH AC'97 Audio
#device snd_via8233 # VIA VT8233x Audio
# MMC/SD (карты памяти SD, на ноутбуке с картридером нужно)
#device mmc # MMC/SD bus
#device mmcsd # MMC/SD memory card
#device sdhci # Generic PCI SD Host Controller
# VirtIO support (поддержка виртуализации ввода-вывода)
#device virtio # Generic VirtIO bus (required)
#device virtio_pci # VirtIO PCI device
#device vtnet # VirtIO Ethernet device
#device virtio_blk # VirtIO Block device
#device virtio_scsi # VirtIO SCSI device
#device virtio_balloon # VirtIO Memory Balloon device
# Linux KVM paravirtualization support
#device kvm_clock # KVM paravirtual clock driver
# HyperV drivers and enhancement support
#device hyperv # HyperV drivers
# Xen HVM Guest Optimizations
# NOTE: XENHVM depends on xenpci and xentimer.
# They must be added or removed together.
#options XENHVM # Xen HVM kernel infrastructure
#device xenefi # Xen EFI timer device
#device xenpci # Xen HVM Hypervisor services driver
#device xentimer # Xen x86 PV timer device
# Netmap provides direct access to TX/RX rings on supported NICs
device netmap # netmap(4) support
# evdev interface (драйвер ввода Xorg, необходим в графической среде?)
#options EVDEV_SUPPORT # evdev support in legacy drivers
#device evdev # input event device support
#device uinput # install /dev/uinput cdev
# HID support (устройств для взаимодействия с человеком: клавиатуры, мышки и так далее)
options HID_DEBUG # enable debug msgs
device hid # Generic HID support
options IICHID_SAMPLING # Workaround missing GPIO INTR support
Сохраняем файл конфигурации после редактирования.
3. Сборка и установка ядра FreeBSD 14
Перед сборкой ядра всегда необходимо обновлять исходные коды FreeBSD.
Собственное ядро может не загрузится или не будут найдены драйвера для устройств. Имей это ввиду если делаешь это на удаленном сервере.
Переходим в каталог исходных кодов
cd /usr/src/
Производим сборку ядра
make buildkernel KERNCONF=MYKERNEL
Устанавливаем собранное ядро
make installkernel KERNCONF=MYKERNEL
В результате установлено новое ядро в /boot/kernel/kernel и было сохранено старое ядро в /boot/kernel.old/kernel
Перезагружаем сервер
shutdown -r now
Проверяем что все исправно работает.
Если не загружается и нет возможность использовать, пробуем загрузить старое ядро. Если не получается загрузить, загружаемся с LiveUSB и копируем старое ядро на место нового.