Kernel fordítás sorozat: [1] [2] [3]
Mivel olyan csodálatosan zuhog az eső és nem tudok hazamenni, gyorsan kedvem lett folytatni a sorozatot... :-)
Münchausentől Linusig
Bemelegítésképpen akkor az initrd-ről: Ahogyan írtam az első részben, egy linux terjesztés nem tud felkészülni minden egyes igényre, minden típusú gépre amelyre valaha is fel fogják telepíteni. A kernelbe nem lehet mindent beszuszakolni, egyrészt mert nagy és lassú lenne, másrészt mert nem is fér bele minden. (Emlékszem, hogy régen a kernel nem lehetett egy bizonyos méretnél nagyobb; de arra nem emlékszem, mekkora volt az.) De ha például a SCSI támogatást modulba rakjuk, akkor a SCSI vinyóról nem tudja felolvasni a megfelelő modult, hiszen épp az a modul kellene hozzá. Viszont az sem járja, hogy minden SCSI kártya és chipset kódját a kernelbe fordítsuk... a saját hajunknál fogva kellene kirántani magunkat a mocsárból. Erre szolgál az initrd. Először betöltjük az initrd-t, amely áthidalja a problémát - ennek mérete nagyobb lehet, mint egy kernel; egy kis RAMdisk-nek kell elképzelni (mint ahogy az is), amelyen scriptek, szélsőséges esetben akár egy nagyon pici alaprendszer is lehet. Ez elvégzi a szükséges feladatokat (merevlemez init, ilyesmik), majd betölti a "rendes" kernelt.
Sokan azt mondják, ez az initrd az esetek nagy részében felesleges; kernelt kell fordítani és bele kell rakni a támogatandó meghajtókat. Ezt mondom én is: az Ubuntu gyári kernele természetesen initrd-s, mert fel kell készülnie mindenre; nade mi optimalizálunk, tehát initrd csak végső esetben kell.
Most pedig térjünk vissza a konfiguráláshoz...
Ha kész a konfiguráció
Ha készen vagyunk, akkor már csak a fordítás van hátra (lépjünk ki az <Exit> gombbal):
make && make modules_install
Ekkor elkezd dolgozni a fordító:
HOSTLD scripts/kconfig/conf
scripts/kconfig/conf -s arch/x86/Kconfig
CHK include/linux/version.h
UPD include/linux/version.h
CHK include/linux/utsrelease.h
UPD include/linux/utsrelease.h
SYMLINK include/asm -> include/asm-x86
CC arch/x86/kernel/asm-offsets.s
GEN include/asm-x86/asm-offsets.h
CALL scripts/checksyscalls.sh
HOSTCC scripts/genksyms/genksyms.o
Stb. stb. Ha nincs hibaüzenet, akkor az elkészült kernelünk a arch/i386/boot/bzImage relatív útvonalon található. Ezt másoljuk a /boot alá:
cp arch/i386/boot/bzImage /boot/vmlinuz_2.6.24.3bagoj
Majd ezután szerkesszük a rendszerindító fájlt. Feltételezem (ahogy eddig is), hogy Ubuntu gyári rendszerrel, így a grub lemezbetöltővel van dolgunk. Szerkesszük meg ennek a menüjét!
Fontos megjegyzés: Ahhoz, hogy az Ubuntu automatikusan is le tudja generálni a menüt (ha gyári kernelt cserélünk), egy kicsit elbonyolították ezt a menü-fájlt. A lényeg, hogy a "BEGIN AUTOMAGIC KERNELS LIST" elé írjuk, amit írunk. Ez pedig nekem a következő:
# vi /boot/grub/menu.lst
title Bagoj kernel 2.6.24.3
root (hd0,0)
kernel /boot/vmlinuz_2.6.24.3bagoj root=/dev/hda1 ro quiet splash resume=/dev/hda5
quiet
Ezt a kis menüt úgy hoztam össze, hogy lemásoltam az egyik már meglévő kernelét (a fájl végén található), és kicseréltem a szükséges részeket. Nyilván hagyjuk benne a régebbi kernel bejegyzéseket is! Ha valami nem jött össze, akkor azokat kiválasztva be tudjuk tölteni a régi állapotot (Grub visszaszámláláskor ESC, aztán ki kell választani a legutolsó régi kernelt; ez elméletben a második sor lesz ugyebár). Megjegyzés: A "kernel" szócska után először a kernel elérési útját írjuk be; a root= mögé a / partíciónkat. A "resume=/dev/hda5" a hibernálás miatt kell, nekem az a swap partícióm.
Azt mondtam korábban, hogy ezt az sda-hda váltást megoldjuk; de közben rájöttem hogy nem akar sikerülni a dolog. Úgy terveztem, hogy a partíció label-je alapján működni fog (azaz nem a konkrét eszköznevet, hanem a label-t adom meg itt), de szerintem vagy a régi IDE vezérlő kódja nem tart itt, vagy én szúrtam el valamit. Bocsika...
Kernelcsomag-gyártás
Ha jól tudom, van egy kernel-package nevű csomag, amelynek segítségével tudunk .deb csomagot készíteni a kernelünkből. Ez akkor jó, ha sok azonos gépet felügyelünk, ilyenkor egy .deb mégiscsak sokkal könnyebben teríthető...
Ekkor a kernel fordítást így végezzük:
apt-get install kernel-package
cd /usr/src/linux
make-kpkg clean
make menuconfig
make-kpkg --revision=2.6.24.20080407 kernel_image
...majd az elkészült .deb csomagot dpkg -i segítségével feltesszük.
Reboot!
Ezek után indítsuk újra a gépet! Ha megáll "Kernel panic" üzenettel és valami VFS-re panaszkodik, akkor három dolog lehet: Nincs meg a merevlemez-támogatás, nincs meg a fájlrendszer-támogatás és végül rossz paramétert adtunk meg a menu.lst-ben. Töltsük vissza a régi kernelt és foglalkozzunk még a témával egy kicsit.
Elképzelhető, hogy ez-az nem fog működni. Nekem például a hibernálás. Nem mintha létfontosságú volna, de mégis. Ezek kiderítése érdekfeszítő agymunka, ne adjátok fel! Én például ott kezdtem, hogy végigolvastam a kernel forrás alatti Documentation/power alatti részeket. :-)
Nézzük, most hány modulom fut:
root@metal:~# lsmod
Module Size Used by
container 4864 0
iptable_filter 3072 0
ip_tables 13000 1 iptable_filter
x_tables 14852 1 ip_tables
sd_mod 29456 0
lp 11332 0
loop 17412 0
usb_storage 72384 0
libusual 18336 1 usb_storage
pcmcia 39444 0
video 18960 0
serio_raw 7044 0
ac 6148 0
thermal 15772 0
uhci_hcd 25484 0
via_agp 10240 1
parport_pc 35236 1
parport 35912 2 lp,parport_pc
via686a 14348 0
yenta_socket 26252 1
rsrc_nonstatic 11392 1 yenta_socket
usbcore 143596 4 usb_storage,libusual,uhci_hcd
evdev 11776 0
pcspkr 3072 0
A francba, ez még mindig sok. :-) A boot idő viszont 61%-a a korábbiaknak.
A továbbiakban, ha valakinek van hozzátennivalója, kérdése, azokat megpróbálom összeszedni és esetleg írok belőle még pár postot.
(folyt. köv?)