Пересборка ядра FreeBSD
Ядро — это основная часть операционной системы 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 EXT2FS 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