Ядро — это основная часть операционной системы 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/?p=255


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

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

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

Add your comment now

You must be logged in to post a comment.