Пересборка ядра в RedHat.

    Хотя на сайте RedHat можно получить уже собранные ядра самых разных версий, давайте рассмотрим, как можно собрать ядро самостоятельно.

    Для того, чтобы пересобрать ядро в RedHat, необходимо сначала иметь исходные тексты ядра. ;-)

    "Официальное" место : ftp://ftp.kernel.org/pub/linux/kernel/


    Предположим, мы скачали 15 Mb и у нас есть файл linux-2.2.13.tar.gz .

    Но сначала надо убедиться, что у нас есть все необходимое для сборки ядра :

[root@on ~] rpm -qa
bin86
gcc
binutils
make
kernel-source
kernel-headers

    Почему-то особенно часто забывают про bin86. Это ассемблер, без него ядро не соберется !

    А теперь, самое важное правило в RedHat : Все живет на symlink-ах !

    Посмотрим, где лежат исходные тексты старого ядра :

[root@on ~]$ cd /usr/src
[root@on src]$  ls -l
total 14791
lrwxrwxrwx 1  root  root 12   Dec 15 13:18 linux -> linux-2.0.36
drwxr-xr-x 17 root  root 1024 Oct 14 19:58 linux-2.0.36
drwxr-xr-x 7  root  root 1024 Jul 7   1999 redhat

     Как видите, symlink linux указывает на linux-2.0.36.

    Скопируем ядро linux-2.2.13.tar.gz в каталог /usr/src.

[root@on src]$ cp ~/linux-2.2.13.tar.gz /usr/src/

    А теперь внимание ! Нужно обязательно удалить symlink linux !

[root@on src]$ rm linux

    После этого можно развернуть исходные тексты ядра.

[root@on src]$ tar zxvf linux-2.2.13.tar.gz
linux/
linux/Makefile
linux/fs/
linux/fs/stat.c
linux/fs/Makefile
linux/fs/read_write.c
linux/fs/block_dev.c
linux/fs/buffer.c
...

    Как видите, исходные тексты ядра linux-2.2.13 живут в каталоге linux/ и если бы мы не удалили symlink linux, у нас получилась бы каша из старых и новых исходников.

    А теперь вернем нормальный symlink linux, но уже с новым ядром :

[root@on src]$ mv linux linux-2.2.13
[root@on src]$ ln -s linux-2.2.13 linux
[root@on src]$ ls -l
total 14789
lrwxrwxrwx 1  root root       12 Dec 15 13:18 linux -> linux-2.2.13
drwxr-xr-x 17 root root     1024 Oct 14 19:58 linux-2.0.36
drwxr-xr-x 15 1046  101     1024 Dec 15 13:52 linux-2.2.13
-rw-r--r-- 1  root root 15079540 Oct 19 17:32 linux-2.2.13.tar.gz
drwxr-xr-x 7  root root     1024 Jul  7  1999 redhat

    Если у нас есть несколько разных версий ядра, нужно лишь соблюдать простое правило : symlink linux указывает на текущую версию !

    После этого можно конфигурировать ядро и собирать его :

[root@on src]$ cd linux
[root@on linux]$ make menuconfig
[root@on linux]$ make depend
[root@on linux]$ make

    Если ядро собралось нормально, можно его просто проинсталлировать :

[root@on linux]$ make install

    По спецификации RedHat ядро и все относящееся к нему лежит в каталоге /boot

[root@on linux]$ cd /boot
[root@on boot]$ ls -l
total 1502
lrwxrwxrwx 1 root root      17 Dec 15 13:52 System.map -> System.map-2.2.13
-rw-r--r-- 1 root root  105935 Nov 17  1998 System.map-2.0.36
-rw-r--r-- 1 root root  166968 Dec 15 13:52 System.map-2.2.13
-rw-r--r-- 1 root root     512 Oct 14 22:51 boot.0800
-rw-r--r-- 1 root root    4536 May  7  1998 boot.b
-rw-r--r-- 1 root root     300 May  7  1998 chain.b
-rw-r--r-- 1 root root  212019 Oct 14 22:51 initrd-2.0.36.img
-rw------- 1 root root   17408 Dec 15 13:54 map
lrwxrwxrwx 1 root root      26 Dec  9 16:52 module-info -> /boot/module-info-2.0.36
-rw-r--r-- 1 root root   11773 Nov 17  1998 module-info-2.0.36
-rw-r--r-- 1 root root     308 May  7  1998 os2_d.b
lrwxrwxrwx 1 root root      14 Dec 15 13:52 vmlinuz -> vmlinuz-2.2.13
-rw-r--r-- 1 root root  454349 Nov 17  1998 vmlinuz-2.0.36
-rw-r--r-- 1 root root  545845 Dec 15 13:52 vmlinuz-2.2.13

    Как видите, правило в RedHat : Все живет на symlink-ах !   соблюдается и здесь. Команда make install оформила как synlinkSystem.map и vmlinuz.

    Если бы мы собирали ядро с модулями и ранее дали бы команду make modules и make modules_install то у нас бы правильно сформировался бы symlink module-info и каталог /lib/modules/2.2.13/

    Чтобы новое ядро могло грузиться, необходимо добавить его в конфигурацию lilo :

/etc/lilo.conf
=======
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50

image=/boot/vmlinuz-2.2.13
	label=linux-2.2.13
	root=/dev/hda1
	read-only

image=/boot/vmlinuz-2.0.36
	label=linux-2.0.36-1
	root=/dev/hda1
	initrd=/boot/initrd-2.0.36-1.img
	read-only
======

    И дать команду lilo :

[root@on boot]$ lilo

    В заключение необходимо добавить, что если вы меняете версии ядра например с 2.0.x на 2.2.x то также необходимо заменить некоторые утилиты, напрмер mount. На сайте RedHat есть все необходимые дополнения : ftp://ftp.redhat.com/pub/redhat/updates/5.2/kernel-2.2/i386/

    Для дополнительного чтения : Kernel-HOWTO или Перевод Kernel-HOWTO