FreeBSD: сборка собственного ядра

Автор: | 17/05/2012

Не смотря на то, что статья довольно объёмная – сам процесс особой сложности не представляет.

Для начала, надо убедиться, что имеются исходные коды системы:

# ls -la /usr/src
total 4
drwxr-xr-x 2 root wheel 512 Feb 18 2011 .
drwxr-xr-x 15 root wheel 512 May 15 22:07 ..

Каталог пустой – значит, надо их получить. Варианта два — либо с помощью sysinstall, если есть диск с такой же версией FreeBSD и вы возле сервера, либо с помощью cvsup с какого-либо сервера FreeBSD. Мы будем качать.

Первым делом — надо найти самый быстрый сервер. Как это сделать – описано тут>>>.

Находим самый удобный сервер cvsup:

# fastest_cvsup -c ua -Q
cvsup5.ua.freebsd.org

Создадим каталог для supfile-ов:

# mkdir /etc/csup

Создадим сам supfile:

# ee /etc/csup/src-sys

Впишем такое содержимое:

*default host=cvsup5.ua.FreeBSD.org
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=RELENG_8_2
*default delete use-rel-suffix
*default compress
src-sys

В строке default host указываем сервер, который будем использовать.

ВАЖНО: в строке default release требуется указать вашу текущую версию FreeBSD. Например:

# uname -a
FreeBSD ikari 8.2-RELEASE FreeBSD 8.2-RELEASE #0: Fri Feb 18 02:24:46 UTC 2011
[email protected]:/usr/obj/usr/src/sys/GENERIC  i386

Теги svn для конкретной версии можно посмотреть тут>>>.

Другие варианты supfile

Для обновления портов:

*default host=cvsup5.ua.FreeBSD.org
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=.
*default delete use-rel-suffix
*default compress
ports-all

Для загрузки всех исходных кодов системы (потребуется при обновлении версии FreeBSD из исходного кода):

*default host=cvsup5.ua.FreeBSD.org
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=RELENG_8_2
*default delete use-rel-suffix
*default compress
src-all

ВАЖНО: если это первый раз, когда вы загружаете исходные коды для ядра (src-sys), то сначала надо загрузить ВСЕ файлы (src-all).

Теперь запустим загрузку файлов:

# csup -g -L 2 /etc/csup/src-sys
Parsing supfile “/etc/csup/src-sys”
Connecting to cvsup5.ua.FreeBSD.org
Connected to 109.106.1.244

Ждем сообщения:

Shutting down connection to server
Finished successfully

Проверим наличие файлов:

# cd /usr/src/sys/
# ls
Makefile        compat          geom            libkern         netinet6        nfs4client      pci             tools
amd64           conf            gnu             modules         netipsec        nfsclient       powerpc         ufs
arm             contrib         i386            net             netipx          nfsserver       rpc             vm
boot            ddb             i4b             net80211        netnatm         nlm             security        x86
bsm             dev             ia64            netatalk        netncp          opencrypto      sparc64         xdr
cam             fs              isa             netgraph        netsmb          pc98            sun4v
cddl            gdb             kern            netinet         nfs             pccard          sys

Все, исходные коды загружены, можно приступать к конфигурированию собственного ядра.

Переходим в каталог /usr/src/sys/i386/conf/.

ВАЖНО – каталог зависит от архитектуры вашей системы. Для i386 (или x32) это будет каталог /usr/src/sys/i386/conf/. Если х64 – то /usr/src/sys/amd64/conf/.

# cd /usr/src/sys/i386/conf/

Создадим копию конфигурации дефолтного (GENERIC) ядра, и назовем его нашим именем – по этому файлу конфигурации и будет собираться наше ядро:

# cp GENERIC COREIKARI1

Редактируем его под себя. Воспользуйтесь ссылками в конце статьи – там есть примеры.

# ee COREIKARI1

ВАЖНО: установите в строке:

ident           GENERIC

имя вашего ядра.

Остальные параметры – по желанию, но будьте осторожны.

Например, надо только добавить поддержку IPFW, для этого будут добавлены строки:

options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=50
options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPFIREWALL_FORWARD
options IPFIREWALL_NAT
options LIBALIAS
options DUMMYNET

Сохраняем файл, переходим в каталог /usr/src и начинаем сборку ядра:

# cd /usr/src
# make buildkernel KERNCONF=COREIKARI1

Возможные ошибки при сборке ядра

Если у вас в начале сборки ошибки такого плана:

/usr/src/sys/i386/conf/yourkern: unknown option “STOP_NMI”

возможно загружены исходные коды не вашей версии ОС, проверьте строку  default release=cvs tag=RELENG_8_2 в файле /etc/csup/src-sys (или /etc/csup/src-all если качали все).

Если ошибка такого плана:

# make buildkernel KERNCONF=yourkern
make: don’t know how to make buildkernel.Stop

убедитесь, что команда builtkernel запускается из каталога /usr/src. Если так, проверьте содержимое каталога /usr/src – присутствует ли в нем файл Makefile.

Если нет – возможно не загружены ВСЕ исходные коды – выполните сначала:

# csup -g -L 2 /etc/csup/src-all

либо установите с помощью sysinstall, при наличии диска и доступа к серверу, либо с FTP-сервера FreeBSD:

# sysinstall

Выбираем:

Configure > Distributions > Src >

далее:

Base, Sys > Ok > Ok > Select Internet > FTP Main (или CD/DVD)

и запустите установку.

Ждем окончания сборки нового ядра. Наконец, получаем сообщение:

————————————————————–
>>> Kernel build for COREIKARI1 completed on Wed May 16 22:39:20 UTC 2012
————————————————————–

Теперь пора установить новое ядро:

# make installkernel KERNCONF=COREIKARI1
————————————————————–
>>> Installing kernel

kldxref /boot/kernel

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

После перезагрузки проверим:

# uname -a
FreeBSD ikari 8.2-RELEASE-p7 FreeBSD 8.2-RELEASE-p7 #0: Wed May 16 21:49:18 UTC 2012    setevoy@ikari:/usr/obj/usr/src/sys/COREIKARI1  i386

Вот оно, новое ядро: COREIKARI1  i386.

Если загрузка нового ядра неудачна – можно загрузить старое (GENERIC) ядро. Для этого, в меню загрузки выбираем Boot to loader promt (6). Попадаем в командную строку, и выгружаем новое ядро:

OK unload

Теперь загрузим наше старое ядро:

OK load /boot/kernel.old/kernel

Ждем, пока ядро загрузится в память, и вводим:

OK boot

Начался процесс загрузки системы со старым ядром.

Проверим:

# uname -a
FreeBSD ikari 8.2-RELEASE FreeBSD 8.2-RELEASE #0: Fri Feb 18 02:24:46 UTC 2011 [email protected]:/usr/obj/usr/src/sys/GENERIC  i386

Ядро GENERIC  i386 – наше старое ядро.

Теперь, что бы вернуть загрузку с этим ядром постоянно, выполняем:

# cd /boot/

На всякий случай – сохраняем наше “неудачное” ядро:

# mv kernel kernel.bak

Вернем на место копию старого ядра GENERIC:

# mv kernel.old kernel

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

Ссылки по теме:

http://daemony.org
http://www.lissyara.su
http://www.bsdportal.ru
http://www.freebsd.org
http://www.bsdnotes.ru