Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
 Kernels
 Boot 
 Memory 
 File system
 0.01
 1.0 
 2.0 
 2.4 
 2.6 
 3.x 
 4.x 
 5.x 
 6.x 
 Интервью 
 Kernel
 HOW-TO 1
 Ptrace
 Kernel-Rebuild-HOWTO
 Runlevel
 Linux daemons
 FAQ
NEWS
Последние статьи :
  Тренажёр 16.01   
  Эльбрус 05.12   
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
 
TOP 20
 MINIX...3057 
 Solaris...2933 
 LD...2905 
 Linux Kernel 2.6...2470 
 William Gropp...2182 
 Rodriguez 6...2014 
 C++ Templates 3...1945 
 Trees...1937 
 Kamran Husain...1866 
 Secure Programming for Li...1792 
 Максвелл 5...1710 
 DevFS...1694 
 Part 3...1684 
 Stein-MacEachern-> Час...1632 
 Go Web ...1625 
 Ethreal 4...1618 
 Arrays...1607 
 Стивенс 9...1603 
 Максвелл 1...1592 
 FAQ...1538 
 
  01.01.2024 : 3621733 посещений 

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

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

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

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

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

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