Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
iakovlev.org

Как собрать ядро в SUSE

Как собрать ядро в SUSE

Version 1.0
Author: Falko Timme <ft [at] falkotimme [dot] com>
Last edited 11/17/2006

Каждый дистрибутив имеет набор специфичных средств для сборки ядра из исходников. В этой статье пойдет речь о сборке ядра в SuSE. Будут использованы исходники с www.kernel.org (vanilla kernel). Будет показано,как патчить исходники ядра.

Все это было протестировано на 10.1.

Это не единственный способ достижения данной задачи. Я ничего не могу гарантировать насчет того, что это будет работать у вас

 

Цель статьи - собрать kernel rpm package , который может быть инсталлирован на вашу систему, а затем на другие SUSE-системы.

 

Необходимый минимум для сборки ядра

Нужно проинсталлировать пакет ncurses-devel, который понадобится для команды make menuconfig :

yast -i ncurses-devel

Далее надо будет модифицировать несколько средств. Если мы это не сделаем то получим предупреждение во время сборки ядра:

/usr/lib/rpm/find-requires.ksyms: line 12: /usr/bin/nm: Argument list too long

и мы не сможем инсталлировать наш kernel rpm package.

Для начала, давайте подстрахуемся:

cp /usr/lib/rpm/find-provides.ksyms /usr/lib/rpm/find-provides.ksyms_orig
cp /usr/lib/rpm/find-requires.ksyms /usr/lib/rpm/find-requires.ksyms_orig
cp /usr/lib/rpm/find-supplements.ksyms /usr/lib/rpm/find-supplements.ksyms_orig

Далее мы открываем каждый из 3-х вышеназванных скриптов и заменяем строку kernel-*)           is_kernel_package=1 ;;
на строку
kernel*)           is_kernel_package=1 ;;:

vi /usr/lib/rpm/find-provides.ksyms

[...]
 #kernel-*)           is_kernel_package=1 ;;
 kernel*)           is_kernel_package=1 ;;
 [...]

vi /usr/lib/rpm/find-requires.ksyms

[...]
 #kernel-*)           is_kernel_package=1 ;;
 kernel*)           is_kernel_package=1 ;;
 [...]

vi /usr/lib/rpm/find-supplements.ksyms

[...]
 #kernel-*)          is_kernel_package=1 ;;
 kernel*)          is_kernel_package=1 ;;
 [...]

 

Загрузка исходников

Идем на www.kernel.org и выбираем там linux-2.6.18.2.tar.bz2 (здесь: 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.2.tar.bz2

Распаковываем и создаем symlink linux:

tar xjf linux-2.6.18.2.tar.bz2
ln -s linux-2.6.18.2 linux
cd /usr/src/linux

 

Патчи (Optional)

Вам могут понадобиться драйвера,которых нет в ядре, или вам нужна поддержка виртуализации, или какая-то иная технология,которой еще нет в ядре. Во всех этих случаях вам нужен патч.

Теперь представим,что вы загрузили нужный вам патч (я обзову его условно patch.bz2). Делается это следующим образом : (вы по-прежнему находитесь в /usr/src/linux):

bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -p1

Первая команда-просто тест,который ничего не делает. Если в нем не будет ошибок, только тогда вы можете запускать вторую команду.

Если патч имеет расширение (.gz) вместо bzip2 (.bz2), ядро патчится так :

gunzip -c /usr/src/patch.gz | patch -p1 --dry-run
gunzip -c /usr/src/patch.gz | patch -p1

Можно также выполнить prepatches. Например,если вам нужна фича,которая доступна только в 2.6.19-rc6. Для этого доступен патч patch-2.6.19-rc6.bz2. Его можно применить для ядра 2.6.18 kernel, но не для 2.6.18.1 или 2.6.18.2. Причину смотрите на http://kernel.org/patchtypes/pre.html:

Препатч - это фактически альфа-релиз. Он живет в тестовом каталоге архива.

Поэтому,если вы хотите собрать версию ядра 2.6.19-rc6 , нужно загрузить версию 2.6.18 (http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2) вместо 2.6.18.2!

Как наложить патч 2.6.19-rc6 patch для 2.6.18:

cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc6.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -p1

Конфигурация ядра

Мы будем итспользовать конфигурацию текущего ядра как основу для нового ядра. Скопируем существующий конфиг в /usr/src/linux:

make mrproper
cp /boot/config-`uname -r` ./.config

Теперь запускаем

make menuconfig

Появляется конфигурационное меню. Выбираем Load an Alternate Configuration File

Далее выбираем General Setup --->
(-default) Local version
-default
Наш kernel rpm package будет назван как kernel-2.6.18.2default-1.i386.rpm. Можно выбрать -custom по вкусу.

Я выбрал -default.

Если вы проинсталлируете kernel-2.6.18.2default-1.i386.rpm и затем надумаете собрать новое ядро версиит 2.6.18.2, нужно использовать другую version string, т.е. -default1, -default2, и т.д., а иначе вы не сможете его проинсталлировать, потому что kernel-2.6.18.2default-1.i386.rpm уже есть!

В конце , когда нажмете Exit, На следующий вопрос (Do you wish to save your new kernel configuration?) нужно ответить Yes:

 

Сборка ядра

Для сборки наберите команду:

make rpm

И отдаемся на волю времени.

 

Инсталляция нового ядра

После успешной компиляци будут созданы 2 пакета src.rpm и rpm . src.rpm лежит в /usr/src/packages/SRPMS/ каталоге. Выполним:

ls -l /usr/src/packages/SRPMS/

У меня он был назван kernel-2.6.18.2default-1.src.rpm.

rpm package лежит в /usr/src/packages/RPMS/i386/, /usr/src/packages/RPMS/i586/, /usr/src/packages/RPMS/i686/, /usr/src/packages/RPMS/x86_64/, и т.д. в зависимости от вашей архитектуры. У меня он в /usr/src/packages/RPMS/i386/, набираем

ls -l /usr/src/packages/RPMS/i386/

Он назван как kernel-2.6.18.2default-1.i386.rpm.

Теперь мы можем проинсталлировать наш kernel rpm package :

cd /usr/src/packages/RPMS/i386/
rpm -ivh kernel-2.6.18.2default-1.i386.rpm

Теперь вы можете провести инсталляцию на любой SUSE машине.

Создадим ramdisk для ядра, иначе система не загрузится с него :

mkinitrd

(Фактически эта команда содает ramdisks для всех имеющихся ядер)

Конфигурация GRUB

Нужно сконфигурировать GRUB . Вместо изменения /boot/grub/menu.lst запустим

yast

Идем в System -> Boot Loader:

На следующем экране вы увидите содержимое конфига GRUB. Выбираем Add для добавления:

Выбираем Clone Selected Section для копирования существующей записи GRUB:

Набираем имя для ядра , например SUSE Linux 10.1 - 2.6.18.2, выбираем Kernel -> Browse:

Вы увидите содержимое каталога/boot где лежит ваше новое ядро. Выберите файл, который обычно начинается с vmlinuz (типа vmlinuz-2.6.18.2-default):

Выбираем Initial RAM Disk -> Browse:

Вы увидите содержимое каталога /boot. Нужно выбрать соответственный ramdisk , который обычно начинается с initrd (типа initrd-2.6.18.2-default):

Выбираем OK:

Вы увидите новую запись GRUB . Отмечаем ее и жмем на Up :

Затем жмем на Set as Default :

Жмем Finish:

Выбираем Quit

Теперь можно проверить /boot/grub/menu.lst

vi /boot/grub/menu.lst

# Modified by YaST2. Last modification on Wed Nov 15 14:37:56 CET 2006
 
 color white/blue black/light-gray
 default 0
 timeout 8
 
 
 title SUSE Linux 10.1 - 2.6.18.2
     root (hd0,0)
     kernel /vmlinuz-2.6.18.2-default root=/dev/sda3 vga=0x314    resume=/dev/sda2  splash=silent showopts
     initrd /initrd-2.6.18.2-default
 
 ###Don't change this comment - YaST2 identifier: Original name: linux###
 title SUSE Linux 10.1
     root (hd0,0)
     kernel /vmlinuz root=/dev/sda3 vga=0x314    resume=/dev/sda2  splash=silent showopts
     initrd /initrd
 
 ###Don't change this comment - YaST2 identifier: Original name: floppy###
 title Floppy
     chainloader (fd0)+1
 
 ###Don't change this comment - YaST2 identifier: Original name: failsafe###
 title Failsafe -- SUSE Linux 10.1
     root (hd0,0)
     kernel /vmlinuz root=/dev/sda3 vga=normal showopts ide=nodma apm=off acpi=off noresume nosmp noapic maxcpus=0 edd=off 3
     initrd /initrd

(Можно было вместо яста просто ручками добавить

title SUSE Linux 10.1 - 2.6.18.2
     root (hd0,0)
     kernel /vmlinuz-2.6.18.2-default root=/dev/sda3 vga=0x314    resume=/dev/sda2  splash=silent showopts
     initrd /initrd-2.6.18.2-default
 

в самом начале /boot/grub/menu.lst

)

Перезапускаемся:

shutdown -r now

Если все ОК,новое ядро загрузится. Вы можете проверить,действительно ли оно новое:

uname -r

Должно быть что-то типа

2.6.18.2-default

Если система НЕ грузится,перезагружаемся и выбираем старое ядро:

Попробуйте пересобрать все по новой.

Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье