Ядро — это основная часть операционной системы FreeBSD. Оно ответственно за управление памятью, параметры безопасности, работу с сетью, доступ к дискам и многое другое.

Зачем необходимо пересобирать собственное ядро?

Вопрос вполне вменяем, ведь с развитием системы — чем дальше, тем она динамичнее и более самодостаточна, но всё же. Представим ситуацию, когда у нас есть старенькое железо например:

CPU: 200Mhz
Memory: 128Mb
HDD: 4Mb
на борту есть 3 PCI слота в которые установлены две супер модные
и современные сетевые карты. Одна (на входе) - оптическая, вторая
(на выходе) - под витую пару в домашний супер свич.

Мы все это железо хотим использовать для домашнего роутера, а точнее шлюза, но….

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

Вот и получается, что нам теперь нужно вкомпилить драйвера в нашу свежую систему, и попутно убрать из ядра неиспользуемое железо, что бы не забирало лишнюю память.

Кроме того, заранее планируем использование netgraph и включим firewall.

Приступим к нашей затее.

Первым делом, нам нужно убедится в наличии исходных кодов ядра в папке /usr/src

# ls -la /usr/src/
total 4
drwxr-xr-x   22 root  wheel     512 Oct 29 13:22 .
drwxr-xr-x   18 root  wheel     512 Oct 29 14:20 ..

Пусто. Значит у нас есть задача сюда положить исходники ядра. Данную операцию можно выполнить как минимум 2мя способами, в нашем случае — это будет через меню sysinstall из диска, так как сети у нас еще нет.

#sysinstall

далее:
Configure, Distributions, src, здесь выбираем «sys» (/usr/src/sys) и выходим из меню, выходим еще раз и у нас спросят откуда ставить — выбираем CD/DVD и жмем «OK»

Второй вариант, занести их через флешь 🙂
Но можно и ухитрится, временно поставить какую-нибудь попроще сетевую карточку, что бы появилась сеть и воспользоваться утилитой cvsup (а вдруг уже добавили наше железо в исходники ;)):

Создаем файл supfile-src-sys

# cat /other/work/supfile-src-sys
#
# Kernel source supfile
#
  *default host=cvsup5.FreeBSD.org
  *default base=/var/db
  *default prefix=/usr
  *default release=cvs tag=RELENG_6_3_0_RELEASE
  *default delete use-rel-suffix
  *default compress
  src-sys

PS. На наше железо стала версия 6.3, если на вашем другое — то tag= должно быть другое.

Запустим:

# cvsup -g -L 2  /other/work/supfile-src-sys

и спустя несколько минут (5-25), всё зависит от машинки и скорости интернета с узла cvsup5.FreeBSD.org.

перепроверим еще раз папку и /usr/src и убедимся, что теперь она не пуста.

# ls -la /usr/src/
total 5
drwxr-xr-x   22 root  wheel     512 Oct 29 13:22 .
drwxr-xr-x   18 root  wheel     512 Oct 29 14:20 ..
drwxr-xr-x   56 root  wheel    1024 Oct 28 10:12 sys

Теперь можем приступать к конфигурации нашего ядра.
Заходим:

# cd /usr/src/sys/i386/conf/
также можно зайти по симлинку, кому как удобнее
# cd /sys/i386/conf/
 
# ls -l | grep GENERIC
-rw-r--r--  1 root  wheel  12472 Oct 28 10:12 GENERIC
-rw-r--r--  1 root  wheel   1745 Oct 28 10:12 GENERIC.hints

далее, делаем копию GENERIC во что нибудь свое.

PS. ВНИМАНИЕ!!!! GENERIC ПРАВИТЬ НЕ НУЖНО. На форумах часто встречаются глупые вопросы, я правлю GENERIC и почему вот у меня нифига не получается. Ругань и прочее..

# cp GENERIC MYKERNEL

И уж потом правим MYKERNEL

# mcedit MYKERNEL

Вспоминая нашу изначальную задачу — заставить нашу железку работать с суперновыми сетевыми картами, дописываем на диск в наше залитое ядро файлы, которые предоставил производитель. И добавляем соответствующие строки в MYKERNEL (соблюдая инструкцию от производителя)

Попутно, оптимизируем — добавляя необходимое и убирая лишнее..

machine i386        # Тип платформы. 
cpu I586_CPU       # Тип процессора, с которыми будет работать ОС. 
cpu I686_CPU       # Здесь можно указать несколько значений. 
ident	   MYKERNEL # Название файла который мы правим :)
maxusers 32         # Максимальное число пользователей. 
 
Коментим лишнее
#options 	INET6 # Я обычно коменчу, пока что мы не юзаем IPv6 протокол
#options 	NFSSERVER # Я не собираюсь на такой тачке делать NFSSERVER
 
options EXT2FS    # Включаем поддержку файловой системы Ext2 (Linux)
device apm0        # Поддержка автоматического управления питанием 
(меняем c #device apm0 at nexus? disable flags 0x20 )

Добавляем стандартный набор, как правило для нашего домашнего роутера он будет выглядеть так:

options         DEVICE_POLLING
options         HZ=1000
#options         IPFILTER
#options         IPFILTER_LOG
options         IPFIREWALL
options         IPFIREWALL_VERBOSE
options         IPFIREWALL_VERBOSE_LIMIT=200
options         IPFIREWALL_DEFAULT_TO_ACCEPT
options         IPFIREWALL_FORWARD
options         IPFIREWALL_NAT
options         DUMMYNET
options         IPDIVERT
options         QUOTA
options         LIBALIAS
options         ROUTETABLES=2
options         ACCEPT_FILTER_DATA
#options         TCP_DROP_SYNFIN
#options         ICMP_BANDLIMIT
#options         TCP_RESTRICT_RST
#####NETGRAPH##### Эту часть не обязательно добавлять, мы ее добавляем 
#только в том случае, если будем использовать NETGRAPH.
options         NETGRAPH
options         NETGRAPH_PPP
options         NETGRAPH_PPPOE
options         NETGRAPH_PPTPGRE
options         NETGRAPH_BPF
options         NETGRAPH_ETHER
options         NETGRAPH_IFACE
options         NETGRAPH_VJC
options         NETGRAPH_SOCKET
options         NETGRAPH_KSOCKET
options         NETGRAPH_TEE
options         NETGRAPH_RFC1490
options         NETGRAPH_MPPC_ENCRYPTION
#######Если у Вас на этой машинке есть пишущий привод, то сразу добавим:
device          atapicam
###В секцию: # SCSI peripherals

Коментим по описанному принципу лишнее, только не переусердствуйте (что бы не получилось как у меня в первый раз, я совсем все лишнее отключил 🙂 )

Но если всё таки вы переусердствуете, и у вас ничего не запуститься после перезапуска системы — не переживайте, всё нормально, жизнь на этом не остановилась.. У нас есть выход:
Жмем RESET и на этапе загрузчика жмакаем на ESC.
появится запрос, мы в него напишем:
boot kernel.old и нажмем ENTER, тем самым загрузив старое ядро.
PS. Важно знать!!! После каждой пересборки ядра — в ее процессе создается директория /boot/kernel.old которая за каждым разом заменяется файлами из /boot/kernel. Поэтому, рекомендую сделать такую хитрость: скопируйте себе сразу же рабочее ядро например в директорию /boot/generic:

# cd /boot
# cp -r kernel.old generic

Тем самым вы обезопасите себя, если у вас и во второй раз не заведется система, вы просто наберете boot /boot/generic

Теперь вернемся к нашему процессу сборки.
Проверяем, убеждаемся что броде бы все правильно, лишнее убрано, недостающее — дописано. Переходим к процессу компиляции.

Сейчас рекомендуют делать так:

# cd /usr/src
# make buildkernel KERNCONF=MYKERNEL
# make installkernel KERNCONF=MYKERNEL
# shutdown -r now

Раньше было так:

# cd /sys/i386/conf/
# config MYKERNEL #При этом вам выдадут дальнейшие инструкции,
 и подскажут о ваших ошибках (если они есть)
# cd ../compile/MYKERNEL
# make cleandepend; make depend && make install && reboot
И ждем...

После сборки нового ядра, перезагружаемся и смотрим, завелось или нет, если нет — читаем примечание выше, если да — радуемся и попиваем пивко.

PS. Если вам нужно чего-то еще добавить в ядро, можем пройтись еще раз по уже накатанной дороге, но можем сделать и немного по другому.. Мы можем подгрузится модулем ядра:
(попутно вспомнил анекдот:
— Любимый, ты борщ умеешь варить?
— секундочку… kldload borsh, теперь да!!!!)

так вот, для того что бы подгрузить модуль можно пользоваться утилитой kldload, для того что бы просмотреть уже подгруженное: kldstat, а для того что бы отгрузить модуль (забыть про то как варить борщ): kldunload borsh.

Также можно дописать в файл лоадера, что подгружать ядром (не будем же мы всё время ручками это делать)

# cat /boot/loader.conf
accf_http_load="YES"
bridge_load="YES"
snd_driver_load="YES"

Удачного и стабильного вам ядра…

Напоминаю всем копирующим мой контент о существовании закона "Об авторском праве".
В связи с этим, прошу во избежании конфликтов при копировании данного материала, ставить на него ссылку:

http://noted.org.ua/255


Также, вы можете отблагодарить меня переслав любую сумму на любой кошелек WebMoney, для поддержания данного ресурса. Или просто админу на пиво ;)

Кошельки для получения благодарности:
R386985788805
U234140473141
Z147712360455

На данной странице нет комментариев, возможно они закрыты. Если Вы хотите оставить свой комментарий, перейдите на специально созданный раздел

Add your comment now

Please note: JavaScript is required to post comments.