Как собрать ядро в 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
Если система НЕ грузится,перезагружаемся и выбираем старое ядро:
Попробуйте пересобрать все по новой.
Оставьте свой комментарий ! | ||
---|---|---|
|