Как скомпилировать ядро – путь Убунту.
Каждый дистрибутив имеет свои специфические инструменты для сборки самостоятельно настроенного ядра из исходников. Эта статья – о компилировании ядра Linux в ОС Ubuntu. Она объясняет, как построить «своё» ядро используя последние неизмененные исходные тексты с сайта www.kernel.org («ванильное ядро»), оставив систему независимой от ядер, предоставляемых разработчиками вашего дистрибутива. Статья также показывает, как установить патчи для исходных текстов ядра, если вам понадобятся возможности, здесь не описанные.
Я проверил это на Ubuntu 6.10 Server (”Edgy Eft”) и на Ubuntu 6.06 Desktop (”Dapper Drake”). В первую очередь хочу сказать, что это не единственный путь такой настройки системы. Есть много путей к достижению цели, но я пошел этой дорогой. Я не гарантирую, что это сработает у вас!
1.Предварительное замечание.
Я предпочитаю совершать все нижеописанные действитя как суперпользователь. Если вы еще не создали аккаунт суперпользователя, сделайте это сейчас:
sudo passwd root
Затем войдите в систему как суперпользователь:
su
Если же вы захотите работать как пользователь (вместо суперпользователя), не забывайте использовать команду sudo перед любой выполняемой командой, упомянутой в этой статье. Так что когда я запускаю
apt-get update
вы должны запустить
sudo apt-get upgrade
и так далее.
1.1.В Убунту 6.10 /bin/sh – символическая ссылка на /bin/dash по умолчанию. Мне кажется, что /bin/dash вызывает проблемы при сборке из исходников (по крайней мере, у меня такое впечатление). Именно поэтому я сделал /bin/sh символической ссылкой на /bin/bash
Если вы пользователь Убунту 6.10, сделайте сейчас вот что:
rm -f /bin/sh
ln -s /bin/bash /bin/sh
2.Установка пакетов, необходимых для компиляции ядра.
Сначала мы обновим нашу базу данных пакетов:
apt-get update
Затем установим все необходимые пакеты:
apt-get install kernel-package libncurses5-dev fakeroot wget bzip2
3.Скачайте исходные тексты ядра.
Теперь мы скачаем исходники предполагаемого ядра и разместим их в /usr/src. На сайте www.kernel.org выберите ядро, которое вы хотели бы установить. (все ядра 2.6 вы можете найти здесь: http://www.kernel.org/pub/linux/kernel/v2.6/
Затем вы можете скачать их в папку /usr/src следующим образом.
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.1.tar.bz2
Теперь мы распакуем исходники и создадим символическую ссылку на директорию с исходниками ядрами.
tar xjf linux-2.6.18.1.tar.bz2
ln -s linux-2.6.18.1 linux
cd /usr/src/linux
4.Установка патчей на исходные коды ядра (опционально)
Иногда вам нужны драйвера для устройства, которое по умолчанию не поддерживается новым ядром, или вам нужна поддержка для технологий виртуализаций или других новейших технологий, которые еще не нашли своего отражения в ядре. Во всех этих случаях вам необходимо установить патчи (буде таковые имеются) для исходников ядра.
Теперь давайте убедимся в том, что вы скачали нужный патч (я назвал его для примера patch.bz2) в директорию /usr/src. Так вы установите патч для ядра (вы все еще должны быть в директории /usr/src/linux):
bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -p1
Первая команда – всего лишь тест. Он ничего не делает с вашими исходниками. Если первая команда не показала ошибок, переходим ко второй, которая и установит патч. Не делайте этого, если первая команда выдала ошибку!
Вы также можете установить пре-патчи ядра для ваших исходников ядра. К примеру, если вам нужна возможность, доступная только в ядре 2.6.19-rc4, но исходный код актуального ядра не содержит нужной вам возможности. Однако, доступен файл patch-2.6.19-rc4.bz2. Вы можете установить этот патч на исходники ядра 2.6.18, но не на 2.6.18.1 или 2.6.18.2 и т.д. Почему так происходит – читайте на http://kernel.org/patchtypes/pre.html:
Пре-патчи эквивалентны альфа-релизам ядра Линукс; они «живут» в тестируемых директориях в архивах. Пре-патчи устанавливаются с помощью утилиты patch(1) на исходный код предыдущего полного релиза с трехзначным номером версии (к примеру, пре-патч 2.6.12-rc4 может быть установлен на исходники ядра 2.6.11, но не на 2.6.11.10).
Так что если вы хотите скомипилровать ядро версии 2.6.19-rc4, вы должны скачать исходный код ядра версии 2.6.18 (http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2), вместо 2.6.18.1, упомянутый в шаге 3.
Установить патч 2.6.19-rc4 на код ядра 2.6.18 вы можете так:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc4.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.19-rc4.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.19-rc4.bz2 | patch -p1
5.Конфигурирование ядра.
Хорошей мыслью будет использование конфигурации вашего текущего ядра в качестве базиса для конфигурирования нового ядра. Скопируем текущую конфигурацию в /usr/src/linux:
cp /boot/config-`uname -r` ./.config
Затем запускайте
make menuconfig
Вы попадете в меню конфигурации ядра. Выберите Load an Alternate Configuration File, затем выберите .config (который содежит вашу текущую конфигурацию ядра) в качестве файла конфигурации.
![]()
Затем просмотрите меню конфигурации ядра и… сделайте ваш выбор! (о том, что нужно убрать, а что – оставить, можно книгу написать. В 2.6.18 много экспериментальных фич, многое из поддержки железа вам не понадобится в силу того, что этого железа у вас не и не будет… смотрите сами) Когда вы закончите, выберите Exit и на последующий вопрос (Do you wish to save your new kernel configuration?) ответьте Yes.
![]()
6.Компиляция ядра.
Чтобы скомпилировать ядро, выполните следующие команды:
make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers
После –append-to-version= вы можете вписать все что угодно – все, что поможет вам в дальнейшем идентифицировать «ваше» ядро, но это название должно начинаться на минус («-») и не содержать пробелов.
Теперь потерпите – компиляция ядра может занять несколько часов, все зависит от того, как вы сконфигурировали ядро и от того, насколько быстр ваш процессор.
7.Инсталляция нового ядра.
После того, как компиляция нового ядра успешно завершится, в директории /usr/src появятся два deb-файла:
cd /usr/src
ls -l
В моей системе они назывались linux-image-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb (который содержал само ядро) и linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb (который содержал файлы, которые могут понадобиться, если вы в дальнейшем захотите скомпилировать дополнительные модули ядра). Я их установил так:
dpkg -i linux-image-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb
dpkg -i linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb
(Кстати, теперь вы можете аналогичным образом устанавливать «свое» ядро и на других машинах с Убунту, то есть вам не надо еще раз собирать ядро) (что, впрочем, не означает, что оно заработает на другой машине – прим.пер.)
Вы сделали это. (That’s it.
– прим.пер). Теперь вы можете проверить /boot/grub/menu.lst – там вы найдете две новых записи для вашего нового ядра:
vi /boot/grub/menu.lst
(а еще можно nano /boot/grub/menu.lst – прим.пер).
Записи в menu.lst на моей системе выглядели так:
title Ubuntu, kernel 2.6.18.1-custom
root (hd0,0)
kernel /boot/vmlinuz-2.6.18.1-custom root=/dev/sda1 ro quiet splash
initrd /boot/initrd.img-2.6.18.1-custom
savedefault
boot
title Ubuntu, kernel 2.6.18.1-custom (recovery mode)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18.1-custom root=/dev/sda1 ro single
initrd /boot/initrd.img-2.6.18.1-custom
boot
Теперь перезагружайтесь:
shutdown -r now
Если все прошло гладко, вы загрузите свою ОС с использованием нового ядра. Чтобы проверить, действительно ли используется новое ядро:
uname -r
На дисплей будет выведено что-то вроде 2.6.18.1-custom.
Если же система не грузится, перезагружайтесь и на экране GRUB’а нажмите Esc чтобы попасть в меню загрузки.
![]()
![]()
Выберите ваше старое ядро и запускайте систему. Теперь вы можете еще раз попробовать собрать работающее ядро. Не забудьте удалить нерабочие записи из /boot/grub/menu.lst.
Дополнения:
Trident:
Одна из проблем с которой сталкиваются пользователи видеокарт nVidia – бинарные драйвера. Они откажутся работать с новым ядром (соответственно, вы не получите Иксов) до тех пор, пока вы их не переустановите. Но тут еще одна проблемка – нужна соответствующая версия заголовков ядра и соответствующая версия gcc… Я думаю, что методом проб и ошибок каждый может дойти до цели, а если пробы и ошибки не помогают, то:
1.http://forum.ubuntu.ru
2.Don’t ask for ask – just ask: #ubuntu-russian at irc.freenode.net (UTF-8 here).
Trident:
автор предпочел производить все свои действия в /usr/src. Однако практика показывает что лучше это сделать где-нибудь в домашнем каталоге. Это безопаснее![]()
От меня:
также возможен вариант добавления юзера в группу src, чтобы использовать права суперпользователя только для инсталяции уже собранного ядра
sudo adduser a_username src
Статью предоставил: Лысов Дмитрий aka Trident
Вирсия: 1.1
Print This
Tags: Kernel

July 11th, 2007 at 6:24 am
make-kpkg clean
сделать после
make menuconfig
то файлик .config весело сотрется
и еще, команду
fakeroot make-kpkg –initrd –append-to-version=-custom kernel_image kernel_headers
лучше писать (по крайней мере в моем убунту 7.04)
fakeroot make-kpkg –initrd –append-to-version=-custom kernel_image kernel_headers
July 11th, 2007 at 6:26 am
July 11th, 2007 at 7:00 pm
September 21st, 2007 at 11:09 am
# make-kpkg --initrd --revision=custom kernel_imageJune 2nd, 2008 at 2:51 pm
August 7th, 2008 at 8:16 pm
листинг в разделе 6 “Компиляция ядра” абсолютно безграмотный. В нём нумерация строк идёт до трёх, а команд всего две ну это из за того, что цифры нумерации строк это обычная картинка. тут уж ничего не поделаешь
и в последнем блоке текста возможна опечатка в слове “scr”.. ниже идёт команда sudo adduser a_username src
Спасибо автору!
January 13th, 2009 at 10:19 am
01 fakeroot make-kpkg –initrd –append-to-version=-custom
02 kernel_image kernel_headers
bash: kernel_image: команда не найдена
и все у них так. по советски…
February 16th, 2009 at 1:00 am
Большой незачет!!
March 26th, 2009 at 10:27 pm
В чем может заключаться причина необновления menu.lst после инсталляции?
April 7th, 2009 at 2:39 pm
April 8th, 2009 at 7:14 pm