FreeBSD - компилируем ядро


Автор admin

Компиляция "своего" ядра системы необходимый шаг. Скорость загрузки, малый размер ускоряют работу сервера (утверждение не проверено но знаю что это правда). Мне в работе пока что не надо но подготовлюсь :)что найду на эту тему закину сюда.

Тюнингую ядро почтового сервака

Возникла проблема. Создал конфиг нового ядра. На самом деле просто убрал неиспользуемые типы процессора и сетевые карты и SCSI контроллеры.

после компиляции и успешной перезагрузки
site# uname -a

FreeBSD site.ubcua.tv 7.0-RELEASE-p4 FreeBSD 7.0-RELEASE-p4 #0: Sun Sep 28 22:50:33 EEST 2008

после чего ни один порт не грузится - говорит что нету ветки 7.0-RELEASE-p4

откатил к прошлому ядру

%uname -a
FreeBSD site.ubcua.tv 7.0-RELEASE FreeBSD 7.0-RELEASE #0: Sun Feb 24 19:59:52 UTC 2008

Во FreeBSD обнаружены три новые уязвимости:
# "amd64 swapgs local privilege escalation " - локальный злоумышленник может выполнить код в системе с привилегиями ядра (root), изменив состояние стека пользовательского приложения и инициировав GPF (General Protection Fault) в момент передачи управления приложению, после обработки ядром прерывания, trap или системного вызова. Уязвимости подвержена только amd64 сборка всех поддерживаемых версий FreeBSD. Проблема устранена в 7.0-RELEASE-p4 и 6.3-RELEASE-p4.
# "nmount(2) local arbitrary code execution" - возможность выполнения кода локального злоумышленника в контексте ядра, в случае когда непривилегированным пользователям предоставлена возможность монтирования файловых систем. Уязвимость вызвана ошибкой в системном вызове nmount, передающем пользовательские данные ядру без надлежащей проверки границ. Проблеме подвержена только ветка FreeBSD 7, исправление внесено в 7.0-RELEASE-p4. В качестве временного решения можно запретить операции монтирования пользователям: "sysctl vfs.usermount=0".
# "Remote kernel panics on IPv6 connections " - удаленный злоумышленник может вызвать крах ядра (kernel panic), отправив по сети специальным образом модифицированный IPv6 (ICMPv6) пакет. Обязательным условием проявления уязвимости является необходимость наличия в системе IPv6 TCP сокетов, принимающих внешние соединения. Уязвимости подвержены все поддерживаемых версий FreeBSD, проблема устранена в 7.0-RELEASE-p4 и 6.3-RELEASE-p4.

Автор: lissyara.

А зачем вообще нужно собирать собственное ядро? Со стандартным ядром - GENERIC работает большинство железяк, все программы. Но - в GENERIC нет поддержки файрволла, оно неоптимизированно для Ваших нужд... Да и железок лишних там слишком много, зачем вам секция касающаяся SCSI контроллеров если у Вас их нет? А почти два десятка моделей сетевых плат, когда у на серваке стоят всего две-три, да ещё и одной модели? Куча разных процессоров - от i386 до P-IV и AMD K7 - реально-то стоит только один проц. Ещё ядро надо пересобирать при обнаружении новых уязвимостей. Происходит это не так часто, но ошибаются все. В том числе и те, кто делают FreeBSD.
Да, конечно, не исключена возможность, что сгорит мама и придётся хард переставлять на другую машину - тогда будут проблемы - если старая машина была P-III и из ядра были выкинуты все другие процессоры, то на другой маме - например под K7 фря может даже не загрузиться, не говоря уже о нормальной работе. Да и если возникнет необходимость заменить, например сетевуху, на другую модель - придётся пересобирать ядро. Но - ядро на современных машинах пересобирается минут 5, максимум 7. Да и прибавка к быстродействию машины стоит того, чтобы один раз заморочиться и оптимизировать ядро.
Итак. Для пересборки ядра у Вас должны быть установлены его исходные тексты. Проверяем:

Если наблюдаем такую картину, то всё есть. Если в папке /usr/src ничего нет - надо их доставить с установочного диска. Делаем это таким образом:

Теперь, когда исходные кодя ядра установлены, приступаем с правке файла конфигурации ядра.

Если у Вашей машины конфигурация i386 - а это 80386, 80486, 80586 (первые пни), P-II, P-III, P-IV, AMD K5, AMD K6, AMD K6-II, AMD K6-III, AMD K7 (Duron, Athlon, Sempron) то делаете то же что и я. Если архитектура отличается - тогда в директории /usr/src/sys/ ищете архитектуру, которая у Вас и делаете там похожие действия :) Архитектуру можно посмотреть, после загрузки таким макаром:

/usr/src/sys/i386/conf/>dmesg | grep CP
CPU: Intel Pentium III (792.22-MHz 686-class CPU)

Подробней про архитектуры можно узнать на www.freebsd.org или в файле /etc/defaults/make.conf. К нему, кстати, мы ещё вернёмся. Наверное, возник вопрос, зачем я так извращённо копировал файл GENERIC - чтобы не забыть дату когда я его делал. Вот мой файл конфигурации ядра:

# Мой файл конфига ядра

machine i386 # Тип компьютера
#cpu I386_CPU # процессор компьютера
#cpu I486_CPU # процессор компьютера
#cpu I586_CPU # процессор компьютера
cpu I686_CPU # процессор компьютера
# про процы подробней можно
# посмотреть LINT
ident main_kernell # идентификатор ядра
maxusers 0 # Определяет количество дескрипторов
# в системе (0 - значит определяет
# "автопилот" :)))

#makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols
# опции отладки ядра (в жизни,
# вероятно не пригодится, но
# если поймаете глюк
# и захотите сообщить об этом
# разработчикам - то пригодится)

options IPFIREWALL # встраиваем поддержку файрволла в ядро
options IPFIREWALL_VERBOSE # вывод информации об отброшенных пакетах
options IPFIREWALL_VERBOSE_LIMIT=100 # ограничение, чтоб весь /var
# логами не засрали
options IPFIREWALL_FORWARD # включаем поддержку перенаправления
# чтобы можно было сделать
# позрачный прокси-сервер
# TCP пакетов ядром
options IPDIVERT # поддержка IP-маскарадинга
options DUMMYNET # поддержка DUMMYNET (искуственное
# ограничение пропускной способности
# сети, может быть нужно если есть
# необходимость урезать канал одним
# и разжать другим компьютерам)
options TCP_DROP_SYNFIN # Это нужно, чтобы сетевые сканеры
# не могли определять версию OS на
# сервере. Также нужно добавить в
# /etc/rc.conf строчку
# tcp_drop_synfin="YES"


#options MATH_EMULATE #Support for x87 emulation
# эмуляция матеметического
# сопроцессора сейчас он есть
# во всех процах, поэтому
# не нужно
options INET #InterNETworking
# поддержка сети, конкретно -
# протокола TCP/IP (если у Вас
# машина без сети - можете
# смело убирать :))
#options INET6 #IPv6 communications protocols
# Протокол IP версии 6
options FFS #Berkeley Fast Filesystem
# файловая система FreeBSD
options FFS_ROOT #FFS usable as root device [keep this!]
# Файловая система FFS является
# фаловой системой ядра
options SOFTUPDATES #Enable FFS soft updates support
# SoftUpdates - повышает скорость
# работы с файловой системой
options UFS_DIRHASH #Improve performance on big directories
# если у Вас будут директории с
# миллионами файлов - то этот
# пункт нужен. Но на самом деле
# никто не знает будут, или нет...
#options MFS #Memory Filesystem
# файловая система памяти
#options MD_ROOT #MD is a potential root device
# корневой файловой системой может
# быть файловая система в памяти
# (нужно для бездисковых рабочих
# станций )
#options NFS #Network Filesystem
# Сетевая файловая система - если
# будете строить сеть между
# фряхами - оно нужно
#options NFS_ROOT #NFS usable as root device, NFS required
# корневым разделом может быть ФС
# находящаяся на другом компе. Нужно,
# опять-таки только бездисковым
# рабочим станциям
#options MSDOSFS #MSDOS Filesystem
# файловая система FAT12, FAT16 и
# FAT32. Если будете что-то таскать
# дискетками на виндовые машины и
# обратно - нужно. если будете
# монтировать форточные ФС -
# тоже нужно.
options CD9660 #ISO 9660 Filesystem
# файловая система CD-ROM дисков
#options CD9660_ROOT #CD-ROM usable as root, CD9660 required
# Корневым разделом может быть
# файловая система CD-ROM - опять
# таки для бездисковых рабочих
# станций
options PROCFS #Process filesystem
# файловая система процессов
options COMPAT_43 #Compatible with BSD 4.3 [KEEP THIS!]
# совместимость с BSD 4.3 (отдельные
# приложения начинают себя
# неадекватно вести, без этого
# пункта)
#options SCSI_DELAY=15000 #Delay (in ms) before probing SCSI
# Задержка при загрузке для того,
# чтобы SCSI-контроллер успел
# обнаружить все подключенные к
# нему устройства. для современных
# винтов и контроллеров - 5 секунд,
# хватает за глаза. Если у Вас есть
# другие устройства на SCSI-шине -
# то курите маны, что шли с ними.
#options UCONSOLE #Allow users to grab the console
# если иксов на машиен нету -
# то этот пункт и не нужен
#options USERCONFIG #boot -c editor
#options VISUAL_USERCONFIG #visual boot -c editor
#options KTRACE #ktrace(1) support
options SYSVSHM #SYSV-style shared memory
# чё-то там про разделяемую память
# как я понял, это нужно в первую
# очередь графическим программам,
# но на всякий случай оставляю
options SYSVMSG #SYSV-style message queues
options SYSVSEM #SYSV-style semaphores
options P1003_1B #Posix P1003_1B real-time extensions
# Насчёт этого пункта нигде ничё
# нарыть не удалось, самая подробная
# инфа в LINT - это какие-то
# расширения для работы в режиме
# реального времени....
options _KPOSIX_PRIORITY_SCHEDULING
# ну и шедулер, для этого самого
# Real Time - только вот не
# вполне понятно, какой нафиг
# шедулер для реального времени
# вообще может быть...
options ICMP_BANDLIM #Rate limit bad replies
# ограничение неверных ответов
# по ICMP
#options KBD_INSTALL_CDEV # install a CDEV entry in /dev
# для всяких клав USB-овых
#options AHC_REG_PRETTY_PRINT # Print register bitfields in debug
# output. Adds ~128k to driver.
# для отладки
#options AHD_REG_PRETTY_PRINT # Print register bitfields in debug
# output. Adds ~215k to driver.
# для отладки

# To make an SMP kernel, the next two are needed
# следующие две опции нужны для многопроцессорных систем
#options SMP # Symmetric MultiProcessor Kernel
#options APIC_IO # Symmetric (APIC) I/O

device isa # поддержка шины ISA - советую
# не удалять этот пункт, даже на самых
# современных компах, т.к. даже в них
# есть ситемный таймер, клава и прочие
# вещи, которые с рождения ИСОвые
# и такими навсегда и останутся :)
#device eisa # Шина EISA - я её видел то пару раз,
# на 486 компах...
device pci # поддержка шины PCI

# Floppy drives
# флоппики
device fdc0 at isa? port IO_FD1 irq 6 drq 2 # контроллер флопов
device fd0 at fdc0 drive 0 # первый флоп
#device fd1 at fdc0 drive 1 # второй флоп
#
# If you have a Toshiba Libretto with its Y-E Data PCMCIA floppy,
# don't use the above line for fdc0 but the following one:
# какой-то тошибовский флопповод, подрубающийся по PCMSIA (для буков?)
#device fdc0

# ATA and ATAPI devices
# Контролеры IDE хардов
device ata0 at isa? port IO_WD1 irq 14 # первый канал
device ata1 at isa? port IO_WD2 irq 15 # второй канал
device ata # ????????
device atadisk # ATA disk drives
# собственно поддержка ATA-хардов
device atapicd # ATAPI CDROM drives
# CDROM`ы подключаемые к ATA
#device atapifd # ATAPI floppy drives
# флопповоды подключаемые к ATA
# контроллеру (первый раз о таких
# узнал именно из конфига ядра)
#device atapist # ATAPI tape drives
# Стриммеры подключаемые по ATA
#options ATA_STATIC_ID #Static device numbering
# статическая нумерация устройств
# (я вот думал, что она всегда
# статическая)

# SCSI Controllers
# SCSI-контроллеры - без комментариев
#device ahb # EISA AHA1742 family
#device ahc # AHA2940 and onboard AIC7xxx devices
#device ahd # AHA39320/29320 and onboard AIC79xx devices
#device amd # AMD 53C974 (Tekram DC-390(T))
#device isp # Qlogic family
#device mpt # LSI-Logic MPT/Fusion
#device ncr # NCR/Symbios Logic
#device sym # NCR/Symbios Logic (newer chipsets)
#options SYM_SETUP_LP_PROBE_MAP=0x40
# Allow ncr to attach legacy NCR devices when
# both sym and ncr are configured

#device adv0 at isa?
#device adw
#device bt0 at isa?
#device aha0 at isa?
#device aic0 at isa?

#device ncv # NCR 53C500
#device nsp # Workbit Ninja SCSI-3
#device stg # TMC 18C30/18C50

# SCSI peripherals
# периферийное сказёвое оборудование (собственно диски, накопители на
# магнитной ленте, CD-ROM`ы)
#device scbus # SCSI bus (required)
#device da # Direct Access (disks)
#device sa # Sequential Access (tape etc)
#device cd # CD
#device pass # Passthrough device (direct SCSI access)

# RAID controllers interfaced to the SCSI subsystem
# сказёвые рэйды
#device asr # DPT SmartRAID V, VI and Adaptec SCSI RAID
#device dpt # DPT Smartcache - See LINT for options!
#device iir # Intel Integrated RAID
#device mly # Mylex AcceleRAID/eXtremeRAID
#device ciss # Compaq SmartRAID 5* series
#device twa # 3ware 9000 series PATA/SATA RAID

# RAID controllers
# рэйд-контроллеры
#device aac # Adaptec FSA RAID, Dell PERC2/PERC3
#device aacp # SCSI passthrough for aac (requires CAM)
#device ida # Compaq Smart RAID
#device ips # IBM/Adaptec ServeRAID
#device amr # AMI MegaRAID
#device mlx # Mylex DAC960 family
#device pst # Promise Supertrak SX6000
#device twe # 3ware Escalade

# atkbdc0 controls both the keyboard and the PS/2 mouse
device atkbdc0 at isa? port IO_KBD # контроллер клавы
device atkbd0 at atkbdc? irq 1 flags 0x1 # клава
#device psm0 at atkbdc? irq 12 # PS/2 мышь

device vga0 at isa? # Ну, это, куда моник прикручивать :)

# splash screen/screen saver
#pseudo-device splash

# syscons is the default console driver, resembling an SCO console
device sc0 at isa? flags 0x100 # системная консоль -
# без этого пункта всё
# работает, но на
# локальном мониторе
# ничего не показывает :))
# Когда я первый раз на
# это напролся, то думал,
# что убил сервак :))

# Enable this and PCVT_FREEBSD for pcvt vt220 compatible console driver
# это для всяких иксов нужно
#device vt0 at isa?
#options XSERVER # support for X server on a vt console
#options FAT_CURSOR # start with block cursor
# If you have a ThinkPAD, uncomment this along with the rest of the PCVT lines
#options PCVT_SCANSET=2 # IBM keyboards are non-std

#device agp # support several AGP chipsets
# Поддержка шины AGP

# Floating point support - do not disable.
# какой-то драйвер расширений для математического сопроцессора
device npx0 at nexus? port IO_NPX irq 13

# Power management support (see LINT for more options)
# управление питанием (ну, вот, зачем серверу засыпать?)
#device apm0 at nexus? disable flags 0x20 # Advanced Power Management

# PCCARD (PCMCIA) support
#device card
#device pcic0 at isa? irq 0 port 0x3e0 iomem 0xd0000
#device pcic1 at isa? irq 0 port 0x3e2 iomem 0xd4000 disable

# Serial (COM) ports
device sio0 at isa? port IO_COM1 flags 0x10 irq 4
device sio1 at isa? port IO_COM2 irq 3
#device sio2 at isa? disable port IO_COM3 irq 5
#device sio3 at isa? disable port IO_COM4 irq 9

# Parallel port
#device ppc0 at isa? irq 7
#device ppbus # Parallel port bus (required)
#device lpt # Printer
#device plip # TCP/IP over parallel
#device ppi # Parallel port interface device
#device vpo # Requires scbus and da


# PCI Ethernet NICs.
#device de # DEC/Intel DC21x4x (``Tulip'')
#device em # Intel PRO/1000 adapter Gigabit Ethernet Card
# (``Wiseman'')
#device txp # 3Com 3cR990 (``Typhoon'')
#device vx # 3Com 3c590, 3c595 (``Vortex'')

# 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
# Вообще, MII bus нужен для всех современных
# сетевух, поэтому его комментировать не надо.
# у меня сетевухи исовые, потому закомментил.
#device dc # DEC/Intel 21143 and various workalikes
#device fxp # Intel EtherExpress PRO/100B (82557, 82558)
#device pcn # AMD Am79C97x PCI 10/100 NICs
#device rl # RealTek 8129/8139
#device sf # Adaptec AIC-6915 (``Starfire'')
#device sis # Silicon Integrated Systems SiS 900/SiS 7016
#device ste # Sundance ST201 (D-Link DFE-550TX)
#device tl # Texas Instruments ThunderLAN
#device tx # SMC EtherPower II (83c170 ``EPIC'')
#device vr # VIA Rhine, Rhine II
#device wb # Winbond W89C840F
#device xl # 3Com 3c90x (``Boomerang'', ``Cyclone'')
#device bge # Broadcom BCM570x (``Tigon III'')

# ISA Ethernet NICs.
# 'device ed' requires 'device miibus'
#device ed0 at isa? disable port 0x280 irq 10 iomem 0xd8000
#device ex
#device ep
#device fe0 at isa? disable port 0x300
# Xircom Ethernet
#device xe
# PRISM I IEEE 802.11b wireless NIC.
#device awi
# WaveLAN/IEEE 802.11 wireless NICs. Note: the WaveLAN/IEEE really
# exists only as a PCMCIA device, so there is no ISA attachment needed
# and resources will always be dynamically assigned by the pccard code.
#device wi
# Aironet 4500/4800 802.11 wireless NICs. Note: the declaration below will
# work for PCMCIA and PCI cards, as well as ISA cards set to ISA PnP
# mode (the factory default). If you set the switches on your ISA
# card for a manually chosen I/O address and IRQ, you must specify
# those parameters here.
device an
# The probe order of these is presently determined by i386/isa/isa_compat.c.
#device ie0 at isa? disable port 0x300 irq 10 iomem 0xd0000
#device le0 at isa? disable port 0x300 irq 5 iomem 0xd0000
device lnc0 at isa? disable port 0x280 irq 10 drq 0
#device cs0 at isa? disable port 0x300
#device sn0 at isa? disable port 0x300 irq 10

# Pseudo devices - the number indicates how many units to allocate.
pseudo-device loop # Network loopback
# сетевая петля
pseudo-device ether # Ethernet support
# поддержка Ethernet
#pseudo-device sl 1 # Kernel SLIP
#pseudo-device ppp 1 # Kernel PPP
#pseudo-device tun # Packet tunnel.
pseudo-device pty # Pseudo-ttys (telnet etc)
# псевдо консоли (ssh, telnet)
#pseudo-device md # Memory "disks"
#pseudo-device gif # IPv6 and IPv4 tunneling
#pseudo-device faith 1 # IPv6-to-IPv4 relaying (translation)

# The `bpf' pseudo-device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
pseudo-device bpf #Berkeley packet filter
# псевдо-устройство, используется
# программами подсчёта траффика,
# сетевыми сканерами...

# USB support
#device uhci # UHCI PCI->USB interface
#device ohci # OHCI PCI->USB interface
#device usb # USB Bus (required)
#device ugen # Generic
#device uhid # "Human Interface Devices"
#device ukbd # Keyboard
#device ulpt # Printer
#device umass # Disks/Mass storage - Requires scbus and da
#device ums # Mouse
#device uscanner # Scanners
#device urio # Diamond Rio MP3 Player
# USB Ethernet, requires mii
#device aue # ADMtek USB ethernet
#device axe # ASIX Electronics USB ethernet
#device cue # CATC USB ethernet
#device kue # Kawasaki LSI USB ethernet

# FireWire support
#device firewire # FireWire bus code
#device sbp # SCSI over FireWire (Requires scbus and da)
#device fwe # Ethernet over FireWire (non-standard!)

Я его специально выложил в таком непотребном виде, просто закомментировав ненужные строки - чтобы было наглядно видно, что я убрал, а что оставил. Также были добавлены несколько строк непосредственно мною - для поддержки IPFW и ipforward.

/usr/src/sys/i386/conf/>cd ../../../
/usr/src/>make buildkernel KERNCONF=main_kernell.2005-26-11 &&
make installkernel KERNCONF=main_kernell.2005-26-11

По окончании инсталляции заглянем в /

/usr/src/>cd /
//>ls -l | grep kern
-r-xr-xr-x 1 root wheel 1677713 Nov 26 20:54 kernel
-r-xr-xr-x 1 root wheel 4388756 Jan 21 2005 kernel.GENERIC
-r-xr-xr-x 1 root wheel 4388756 Jan 21 2005 kernel.old
//>

Ядро стало меньше почти втрое. Перезагружаемся командой shutdown -r now, и проверяем всё ли работает нормально. У меня всё прекрасно подцепилось не считая ругани отдельных приложений на пропавший протокол IPv6 - на эту тему надо копать их конфиги, или просто забить (но это неверный метод!).
Теперь рассмотрим вариант, что у вас что-то неполучилось. В простых случаях, например, не работает сеть - надо просто изменить конфиг и пересобрать ядро. Для этого можно и локально поработать недолго :) В более сложном варианте - фря не грузится вообще - такое вполне возможно, если Вы на горячую руку ампутировали что-то нужное - например подержку SCSI-контроллера на котором висят винты, или вообще ампутировали файловую систему из ядра :) Бывает и такое. Тоже не надо терять голову, проблема решается сравнительно просто - надо загрузиться со старым ядром и заново пересобрать новое. На моменте загрузки, когда идёт 10-секундный обратный отсчёт времени (у меня, кстати, 2-х секундный :)) надо сделать то, что он просит - нажать любую клавищу, кроме [Enter], я, например, жму 'Esc':

Hit [Enter] to boot immediately, or any other kay for command prompt.
Booting [kernel] in 8 seconds...

Type '?' for a list of commands, 'help' for more detailed help.
ok _

Как итог мы получаем приглашение загрузчика. Советую ознакомится со списком команд - их совсем мало, и времени это немного займёт. Теперь, выгружаем новое ядро из памяти, загружаем туда GENERIC (или Ваше старое ядро, если на машине какой-то нестандартный набор железа), и загружаем ОС:

ok unload
ok load kernel.GENERIC
/kernel.GENERIC text=0x3418b5 data=0x4c0e0+0x34af4 syms=[0x4+0x474b0+0x4+0x5037c]
ok boot

После загрузки собираем новое ядро и снова пробуем.

1. Зачем нужно перегенерировать ядро (kernel)?

При инсталяции FreeBSD у вас появится в системе ядро, которое вполне работоспособно. Зачем его переделывать?

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

В эту конфигурацию встроена поддержка ВСЕХ типов накопителей (HDD и CD) и ВСЕХ сетевых карт, которые на данный момент поддерживаются FreeBSD. Это вполне логично - вы должны иметь возможность поставить свой Unix и дополнительные программы на тот HDD, который имеется у вас в машине и суметь войти в сеть, какой бы сетевой карточкой вы ни пользовались.

В то же время, в ядро не включены некоторые полезные модули, которые могут вам понадобится в дальнейшем, особенно, если вы хотите использовать вашу машину в качестве сервера. (Например - поддержка firewall, PPP-сервера, bpf и т.п.).

Итак. Перегенерировать ядро стоит для того чтобы -
- убрать все лишнее (драйверы устройств, которых у вас нет);
- добавить то, чего не хватает.

Первое позволит вам ускорить загрузку (так как система не будет тратить время на поиск и тестирование несуществующих в вашей машине устройств) и сэкономить место в ОЗУ, занимаемое ядром.

Ну, а без второго, скорее всего, вы не сможете решить свои задачи :). 2. Как перегенерировать ядро системы?

В общем виде этот процесс выглядит так:
- развернуть исходники ядра (я обычно заказываю их в процессе инсталяции, но если вы этого не сделали, то можно добавить их "вручную");
- составить свою конфигурацию (конфигурационный файл);
- запустить программу config, которая создаст необходимые файлы *.h и *.c в соответствии с вашей конфигурацией;
- скомпилировать новое ядро с помощью программы make;
- установить новое ядро на место;
- перезагрузиться. Теперь более подробно.
2.1 Разворачивание исходников.

Прежде всего посмотрите в директорию

/usr/src/sys

если она не пустая, то все что вам нужно уже на месте. И вы можете спокойно перейти к следующему пункту.

В противном случае, вам надо взять из дистрибутива нужные файлы и установить их.
Не забудьте, что вам в данном случае необходима только та их часть, которая называется sys.
2.2 Составление конфигурационного файла.

Перейдите в директорию /usr/src/sys/i386/conf.

Здесь имеются два конфигурационных файла GENERIC и LINT. Первый представляет собой конфигурацию того ядра, которое установилось у вас при инсталяции системы. Вы можете посмотреть там - что в данный момент может ваше ядро.

Второй же файл представляет собой скорее описание всех возможных элементов конфигурационного файла, чем реальную конфигурацию. Если вы попытаетесь построить ядро в такой конфигурации, оно, скорее всего даже не будет работать. Во всяком случае, памяти "отожрет" по максимуму :).

Вам необходимо составить свой файл. Его название значения не имеет. Можете назвать его MyConfig или MyComputer. Я обычно даю ему то же название, что и доменное имя машины.

В качестве основы для нового файла вы можете использовать один из уже имеющихся файлов - GENERIC или LINT.

Если вы возьмете за основу GENERIC, то вам придется убрать оттуда описания всех лишних устройств и дописать необходимые вам options.

Если же вы возьмете за основу LINT, то все редактирование будет заключаться в удалении всего ненужного. Однако, это может оказаться весьма утомительным занятием.

Итак. Скопируйте один из имеющихся конфигов

cp GENERIC MyConfig
или
cp LINT MyConfig

И подправьте его любым текстовым редактором.

Hint: Если вы не успели еще поставить никакого текстового редактора "с человеческим лицом", можно использовать редактор ee, который у вас наверняка уже стоит. Он довольно простой, но вполне полноценный экранный редактор.

Как я уже сказал, основным "мануалом" по составлению новой конфигурации служит файл LINT. Причем, там должны быть описаны самые "свежие" options, которые появились в той версии, которую вы ставите, и еще не описаны в других "мануалах". (К сожалению, "должны быть" и "есть" - не одно и то же.)

2.3 Подготовка к генерированию

После того, как вы закончили редактировать свою конфигурацию (пусть она называется MyConfig, например), наберите команду

config MyConfig

Она создаст в директории /usr/src/sys директорию compile/MyConfig (о чем и сообщит вам в конце своей работы) и поместит туда файлы, необходимые для компиляции ядра.
2.4 Трансляция (собственно само генерирование) ядра

Перейдите в директорию /usr/src/sys/compile/MyConfig и наберите команду

make

она сделает все что нужно.
Учтите, что kernel - достаточно сложная программа, поэтому ее компиляция потребует довольно много времени. От 15-20 минут на Pentium'е до часа, на 386 процессоре.

Если в процессе компиляции обнаружатся фатальные ошибки, придется пересмотреть свой конфиг, исправить его и повторить пункты 2.3 - 2.4.

(У меня такие случаи были, когда я попросил некоторые опции, возможные только для Pentium, забыв указать в начале файла, что хочу поддержку процессора i586)
2.5-2.6 Установка нового ядра и Перезагрузка

После того, как компиляция ядра успешно завершилась наберите комманду

make install

она переименует старое ядро в kernel.old и поместит в корневую директорию ваш новый kernel.

После этого можно (и нужно) перегрузить компьютер.

Если загрузка нового ядра не получилась (такое тоже возможно), вы можете загрузится со старым ядром. Для этого, в начале загрузки на подсказку Boot: надо быстро сказать kernel.old.

Естественно, после этого надо снова вернуться к редактированию вашей конфигурации и повторить все последующие пункты.

Только не торопитесь. Если новое ядро опять окажется неработоспособным, вы можете попасть в неприятную ситуацию, так как после очередного "make install" -

kernel.old - предыдущая неработающая версия kernel
kernel - новая, столь же бесполезная.

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

А чтобы при этом не попасть в вышеописаную ситуацию, можно переименовать пока еще работающий kernel.old в kernel.work или kernel.original и продолжать свои эксперименты. Во всяком случае, у вас всегда останется по крайней мере один "загружабельный" вариант ядра.
Важное замечание по поводу драйверов устройств.

Если вы добавили в конфигурации ядра устройства (реальные или pseudo-device), возможно потребуется создать для них файлы-устройства в директории /dev.

Какие-то общие рекомендации по этому поводу дать трудно, поскольку это зависит от того - какие устройства вы добавляли в конфиг-файл, а их много разных.

Во всяком случае, если вы знаете какого файла (в /dev) не хватает, его можно создать с помощью программки MAKEDEV, которая лежит в той же /dev. Это даже не программа, а командный файл, в начале которого есть коментарии, в которых более-менее подробно описаны возможные аргументы (имена устройств) для MAKEDEV.

И еще, поскольку, /dev наверняка не прописана в вашем PATH, запускать ее нужно /dev/MAKEDEV ... , или, если вы находитесь в самой директории /dev, то ./MAKEDEV ...

http://allwork.kiev.ua

Обновлено: 12.03.2015