Сборка нового ядра для Ubuntu Linux
Некоторое время назад у меня наконец-то появилась возможность перейти на Linux. Раньше я всегда использовал Slackware, но тут решил поставить Ubuntu из-за удобства менеджера пакетов. И столкнулся с необходимостью сборки нового ядра. Оказалось, что процесс немного отличается от привычного.
Примечание: предполагается, что все манипуляции выполняются с привилегиями root.
/bin/sh на Ubuntu 6.10 ("Edgy Eft")
В Ubuntu 6.10 /bin/sh по умолчанию является symlink'ом на /bin/dash. Это может вызвать проблемы при сборке ядра из исходных текстов, поэтому стоит сделать /bin/sh ссылкой на /bin/bash.
-
rm -f /bin/sh
-
ln -s /bin/bash /bin/sh
Установка необходимых пакетов
Для начала обновляем базу даных пакетов:
-
apt-get update
Затем ставим необходимые пакеты:
-
apt-get install kernel-package libncurses5-dev fakeroot wget bzip2
Получение исходных текстов ядра
Переходим в /usr/src и скачиваем туда нужное ядро. На момент написания статьи самым новым было 2.6.20.4, поэтому комманды выглядели так:
-
cd /usr/src
-
wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.20.4.tar.bz2
Затем распаковываем архив и делаем нужны ссылки:
-
tar xjf linux-2.6.20.4.tar.bz2
-
ln -s linux-2.6.20.4 linux
-
cd /usr/src/linux
В случае, если нужно установить какой-либо patch для ядра (предположим, это patch.bz2), выполняем примерно такие манипуляции находясь в папке /usr/src/linux:
-
bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run
-
bzip2 -dc /usr/src/patch.bz2 | patch -p1
Настройка ядра
Разумно будет в качестве основы использовать конфигурацию текущего (работающего) ядра:
-
cp /boot/config-`uname -r` ./.config
Теперь можно приступать к ручной настройке:
-
make menuconfig
Перед тем, как менять параметры ядра нужно зайти в Load an Alternate Configuration File и выбрать .config, который мы получили до этого.
По окончании настройки нужно не забыть сохранить изменения на выходе.
Сборка ядра
Последовательно запускаем две команды:
-
make-kpkg clean
-
fakeroot make-kpkg --initrd --append-to-version -someCustomText kernel_image kernel_headers
Примечание: вместо someCustomText можно вставить свой текст, который будет добавлен к версии ядра. Единственное, что этот текст не должен содержать пробелов.
Учтите, что сборка ядра - процесс долгий. Придется подождать.
Установка нового ядра
По окончании сборки в папке /usr/src должны появится два .deb-файла. В моем случае это были linux-headers-2.6.20.4-ac97hacks_2.6.20.4-ubuntu-ac97-hacks-10.00.Custom_i386.deb и linux-image-2.6.20.4-ac97hacks_2.6.20.4-ubuntu-ac97-hacks-10.00.Custom_i386.deb. Собственно, их и надо установить:
-
dpkg -i linux-image-2.6.20.4-ac97hacks_2.6.20.4-ubuntu-ac97-hacks-10.00.Custom_i386.deb
-
dpkg -i linux-headers-2.6.20.4-ac97hacks_2.6.20.4-ubuntu-ac97-hacks-10.00.Custom_i386.deb
Теперь проверяем настройки загрузки (/boot/grub/menu.lst). В моем случае там появились такие строки:
-
title Ubuntu, kernel 2.6.20.4-ac97hacks
-
root (hd0,0)
-
kernel /boot/vmlinuz-2.6.20.4-ac97hacks root=/dev/hda1 ro quiet splash
-
initrd /boot/initrd.img-2.6.20.4-ac97hacks
-
quiet
-
savedefault
-
boot
-
-
title Ubuntu, kernel 2.6.20.4-ac97hacks (recovery mode)
-
root (hd0,0)
-
kernel /boot/vmlinuz-2.6.20.4-ac97hacks root=/dev/hda1 ro single
-
initrd /boot/initrd.img-2.6.20.4-ac97hacks
-
boot
Теперь можно перезагрузиться:
-
shutdown -r 0
И после загрузки проверить версию ядра:
-
uname -r
Эта команда должна вывести что-то вроде 2.6.20.4-ac97hacks.
В случае, если система не загружается с новым ядром, зайдите в меню GRUB (нажав Esc в начале загрузки) и выберите более старое, стабильное ядро.


April 6th, 2007 at 15:35 Quote
"Пере тем, как менять параметры"
Опечатка ;-)
April 6th, 2007 at 23:22 Quote
NeX1k @ 06.04.2007, 15:35 #
спасибо, исправил
February 17th, 2008 at 17:02 Quote
Спс) содержательная статья.
July 5th, 2008 at 23:24 Quote
Ну ОЧЕНЬ хорошая статья, спасибо автору)
August 8th, 2008 at 11:00 Quote
Для Ubuntu 8.04.1 тоже пойдёт?
August 8th, 2008 at 11:17 Quote
mikoto @ 08.08.2008, 11:00 #
в принципе должно, why not :)
August 31st, 2008 at 14:20 Quote
ой спасибо. самый внятный ман по компиляции своего ядра... над будет занятся
October 9th, 2008 at 10:25 Quote
Спасибо за инструкцию. Мне очень помогла.
December 10th, 2008 at 08:06 Quote
отличная статья! ничего лишнего
January 31st, 2009 at 15:47 Quote
Господа! Скажите linux-image-2.6.хх-mybuild_i386.deb После сборки весит что-то около 150 Мб, тогда как изкоробочная версия около 17 Мб.
Скажите, это допустимо или все-же я что-то делаю не так. (хотя .config от предыдущего ядра)
January 31st, 2009 at 16:02 Quote
KT315 @ 31.01.2009, 15:47 #
что-то не так. многовато. может что-то лишнее в пакете? или не то собрали?
February 14th, 2009 at 00:23 Quote
KT315 явно конфиг подменился стандартным потому что возникла несовместиомсть с новым ядром
March 14th, 2009 at 21:58 Quote
Мужики помогите плиз, при попытке сборке ядра выдает эту ошибку? Из-за чего и в чем проблема?
"Error: The extended version may only contain
lowercase alphanumerics and the characters - + .
The current value is: -someCustomText
Aborting."
March 15th, 2009 at 13:06 Quote
это у Вас проблема с --append-to-version и его значением. советую его убрать. а в ошибке написано, что там могт быть буквы и цифры. но не тире.
March 15th, 2009 at 16:14 Quote
Не подскажите как правильно устанавливать патчи? После запуска патча он выдает Reversed (or previously applied) patch detected! Assume -R? [n] ? Со всем соглашаться?
March 15th, 2009 at 22:31 Quote
смотря по тому, что Вы хотите. из ошабки видно, что Вы применяете патч, который уже был применен.
очень советую читать то, что написано. и пытаться это понять для начала.
April 5th, 2009 at 20:10 Quote
Скажите, в чем может быть проблема
root@serv:/usr/src/linux# make-kpkg clean
exec debian/rules DEBIAN_REVISION=5:10.Custom clean
/bin/sh: line 0: [: -ge: unary operator expected
/bin/sh: line 0: [: -ge: unary operator expected
/bin/sh: line 0: [: -ge: unary operator expected
/bin/sh: line 0: [: -lt: unary operator expected
/bin/sh: line 0: [: -eq: unary operator expected
/bin/sh: line 0: [: -eq: unary operator expected
/bin/sh: line 0: [: -gt: unary operator expected
/bin/sh: line 0: [: -ge: unary operator expected
/bin/sh: line 0: [: -gt: unary operator expected
/bin/sh: line 0: [: -ge: unary operator expected
/bin/sh: line 0: [: -ge: unary operator expected
====== making target CLN-common [new prereqs: testdir]======
====== making target CLN-common [new prereqs: ]======
/usr/bin/make -f ./debian/rules real_stamp_clean
/bin/sh: line 0: [: -ge: unary operator expected
/bin/sh: line 0: [: -ge: unary operator expected
/bin/sh: line 0: [: -ge: unary operator expected
/bin/sh: line 0: [: -lt: unary operator expected
/bin/sh: line 0: [: -eq: unary operator expected
/bin/sh: line 0: [: -eq: unary operator expected
/bin/sh: line 0: [: -gt: unary operator expected
/bin/sh: line 0: [: -ge: unary operator expected
/bin/sh: line 0: [: -gt: unary operator expected
/bin/sh: line 0: [: -ge: unary operator expected
/bin/sh: line 0: [: -ge: unary operator expected
make[1]: Entering directory `/usr/src/linux-2.6.29'
====== making target real_stamp_clean [new prereqs: ]======
running clean
test ! -f scripts/package/builddeb.kpkg-dist || \
mv -f scripts/package/builddeb.kpkg-dist scripts/package/builddeb
test ! -f scripts/package/Makefile.kpkg-dist || \
mv -f scripts/package/Makefile.kpkg-dist scripts/package/Makefile
test ! -f .config || cp -pf .config config.precious
test ! -f Makefile || \
/usr/bin/make ARCH=xen distclean
make[2]: Entering directory `/usr/src/linux-2.6.29'
Makefile:529: /usr/src/linux-2.6.29/arch/xen/Makefile: No such file or directory
make[2]: *** No rule to make target `/usr/src/linux-2.6.29/arch/xen/Makefile'. Stop.
make[2]: Leaving directory `/usr/src/linux-2.6.29'
make[1]: *** [real_stamp_clean] Error 2
make[1]: Leaving directory `/usr/src/linux-2.6.29'
make: *** [CLN-common] Error 2
April 28th, 2009 at 13:17 Quote
3 часа ждал, а потом выдало:
H16TOFW firmware/vicam/firmware.fw
IHEX firmware/cpia2/stv0672_vp4.bin
make[1]: Leaving directory `/usr/src/linux-2.6.29.2'
/usr/bin/make -j5 EXTRAVERSION=.2-koc ARCH=i386 \
-C Documentation/lguest
make[1]: Entering directory `/usr/src/linux-2.6.29.2/Documentation/lguest'
cc -Wall -Wmissing-declarations -Wmissing-prototypes -O3 -I../../include -I../../arch/x86/include -U_FORTIFY_SOURCE lguest.c -lz -o lguest
lguest.c:34:18: error: zlib.h: Нет такого файла или каталога
make[1]: *** [lguest] Ошибка 1
make[1]: Leaving directory `/usr/src/linux-2.6.29.2/Documentation/lguest'
make: *** [debian/stamp/build/kernel] Ошибка 2
Подскажите, пожалуйста, в чем может быть проблема...
April 28th, 2009 at 13:50 Quote
Судя по всему Вы включили поддержку чего-то особенного, что не скомпилировалось. Честно говоря, нехватает информации для ответа.
November 20th, 2009 at 16:37 Quote
Спасибо... тока по menuconfig дописал бы.... где мне родить та ncurses-devel
December 25th, 2009 at 04:56 Quote
А тут вот такие грабли.. Собрал все.. и когда сказал dpkg -i и пакет ядра.. оно выдало:
dpkg -i ./linux-image-2.6.32.2-optimized_2.6.32.2-optimized-10.00.Custom_i386.deb
(Reading database ... 202662 files and directories currently installed.)
Unpacking linux-image-2.6.32.2-optimized (from .../linux-image-2.6.32.2-optimized_2.6.32.2-optimized-10.00.Custom_i386.deb) ...
Done.
dpkg: error processing ./linux-image-2.6.32.2-optimized_2.6.32.2-optimized-10.00.Custom_i386.deb (--install):
trying to overwrite `/lib/firmware/emi26/bitstream.fw', which is also in package linux-image-2.6.29.4
dpkg-deb: subprocess paste killed by signal (Broken pipe)
Running postrm hook script /sbin/update-grub.
Searching for GRUB installation directory ... found: /boot/grub
Searching for default file ... found: /boot/grub/default
Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst
Searching for splash image ... found: /boot/grub/splash.xpm.gz
Found kernel: /boot/vmlinuz-2.6.29.4
Found kernel: /boot/memtest86+.bin
Updating /boot/grub/menu.lst ... done
Errors were encountered while processing:
./linux-image-2.6.32.2-optimized_2.6.32.2-optimized-10.00.Custom_i386.deb
Пока так и не понял в гем грабля.. =(
February 1st, 2010 at 13:28 Quote
>Спасибо... тока по menuconfig дописал бы.... где мне родить та ncurses-devel
Поставьте пакет libncurses5-dev