Kernel fordítás sorozat: [1] [2] [3]
Bevezetőnek szeretném az alábbiakat leszögezni:
1. Nicht besaaren (ne fossál)! Rengeteg helyen olvasom, hogy "hú Te aztán nagyon bátor vagy, hogy kernelt fordítasz" - nem kell rájuk hallgatni. Természetesen úgy kell csinálni, hogy visszaállhass a régebbi kerneledre, ha valami nem jönne össze. Egyébként 2-3 helyen lehet igazán elcseszni, ezt el fogom mondani.
2. Egy linux kernel fordítás bonyolult dolog. Csak általános dolgokat tudok leírni, hiszen nekem nagy valószínűséggel teljesen más hardverem van, mint Neked.
3. Szánd rá az időt! Készülj rá, hogy főleg az első alkalommal nagyon sokat kell majd a helpet olvasgatni, úgyhogy 1-1,5 óra nyugodt időt biztosíts magadnak erre.
Nem tudom, hányan fordítanak kernelt mostanában. Régebben ez teljesen általános teendő volt; hiszen a terjesztések akkor még nem foltozták rommá a linux kerneleket; az ember egyszerűen leszedte a kernel.org-ról a legutolsó patch-et (nyilván nem a teljes kernelt, hiszen akkor még spórolni kellett a sávszélességgel), amely tartalmazta az új fejlesztéseket, hibajavításokat. Mindenki szépen nyomta a vanilla kernellel (tehát egy az egyben azzal, amit a kernel fejlesztők készítenek). A világ azóta sokat változott: a különféle linux terjesztések rengeteg saját fejlesztést, plusz hardver támogatást is beletesznek a vanilla kernelbe, és ennek lefordított, illetve forrás változatát is ők tartják karban. Például egy-egy hibajavítás után nem is léptetik a kernel verzióját, csak a legutolsó számot léptetik eggyel. A kernel lényegében csak egy csomaggá változott, amit mindenki leszed és kész - pedig tulajdonképpen EZ MAGA a linux - hiszen az opensource programok (nagy része) lefordíthatók más POSIX rendszerekre, pl. BSD-re.
Verziószámok
A kernelnek van stabil, illetve számos fejlesztői "ága", változata is. A fejlesztői ágban megy az új feature-ök tesztelése; ebből következően azok lehetnek instabilak. Az esetek 99%-ban nem lesz ezekre szükség (hacsak nem valami nagyon új hardverre van okvetlenül szükség, és emiatt bevállalható akár gyakori fagyás is). A különféle ágak a verziószámokkal vannak jelölve. Most, ahogy ezt írom, a fejlesztői verzió 2.6.25-rc8 (rc = release candidate; kiadás előtti 8-as verzió), a stabil pedig Ubuntun a 2.6.24.3. Jó szeműek felfigyelhetnek rá, hogy a harmadikmásodik szám a verzióban páratlan a fejlesztői esetében, és páros a stabil verzió esetében. Emellett jelenleg a 2.4.x-es kernel ág is aktív; tehát oda is átrakják a fontosabb fejlesztéseket (ún. "backporting", és folyamatosan végzik a hibajavításokat. Nem is boncolgatnám ezt a témát tovább; aki a fejlesztőivel akar foglalkozni, úgyis beleássa magát a témába.
Minek fordítsak kernelt?
Ha elégedett vagy a rendszereddel, és csak használni szeretnéd, akkor nincs szükséged rá. Ha szeretnél többet kihozni a rendszeredből, esetleg szeretnél átesni egy férfiúi beavató szertartáson :-), akkor érdemes belevágni. A disztribúciók kernelei ugyanis természetesen úgy vannak felkészítve, hogy lehetőleg minden gépen, bármely támogatott hardver esetén tudjanak futni (magyarul kellőképpen általánosak). Egy-egy adott gépen negyedannyi dologra sem lesz szükség; ráadásul sok dolgot ki is lehet kapcsolni, ha éppen nekünk olyan nincs (pl. soros/párhuzamos port támogatás, más alaplapi chipsetek). Az eredmény: a kernel kisebb, gyorsabb, és mivel kevesebb feature (kevesebb hibalehetőség) van benne, jó eséllyel megbízhatóbb is lesz.
Ne értsetek félre: sok esetben egy-egy változtatás csak mikromásodperceket jelent. Nade ha a működés során egy ilyen rutin másodpercenként több tízezerszer hívódik meg, akkor az már századmásodpeceket jelent. És másodpercenként nyerni pár századot jelentős gyorsulási érzettel jár. (Tiszta Forma1, nem? :-)) Egy szóval, a lényeg: optimalizáció.
Megjegyzés: az Ubuntuban, ha rákerestek a kernelekre (apt-cache search linux-image), akkor látjátok, hogy van -generic és -server változat. Ez lényegében ugyanaz a kernel, csak másra optimalizálva (desktop, illetve szerver felhasználás). A desktopon a rendszer interaktív válaszideje van maximalizálva, szerveren pedig a háttérfolyamatok. Ezt csak úgy mondom.
Monolit vs. hybrid vs. modularizált
Most meg miről beszélek? A lényeg az, hogy a kernel képes a belefordított kód alapján dolgozni, de képes arra is, hogy futási időben további kernel részeket behúzzon a memóriába és futtasson. Ennek az a lényege, hogy ha nagyon sok szolgáltatásra van szükség, de mindegyikre csak időnként, akkor a kernel karcsúsítása miatt érdemes ún. modulokba fordítani ezeket (megtehetnénk, hogy az összes feature-t belefordítjuk a kernelbe, az eredmény egy sok megabyteos lomha jószág lesz). A kernel tudni fogja, mikor lesz szükség ezekre, és (többé-kevésbé) automatikusan behúzza. A másik fele az, hogy ha egy szolgáltatást gyakran használunk (pl. USB-kütyük), akkor érdemes a kernelbe fordítani, hogy ne teljen azzal is idő, hogy a kernel kitalálja, melyik modul kell és utána betöltse. Ha nincs modul támogatás, minden a kernelből megy, azt nevezik monolitnak, ha minden modulban van, azt modulárisnak. Az igazság sokak szerint valahol félúton van.
Előkészületek
A kernel fordítás is fordítás, következésképpen kell minden hozzá, ami általánosságban a programok fordításához:
root@metal:/~# apt-get install build-essential
A kernel konfigurálása pedig igényli az ncurses függvénykönyvtár fejlesztői változatát (rögtön letőttyük a kernelt is):
root@metal:/~# apt-get install linux-source libncurses5-dev
Ezzel letöltődött a forrás, és a /usr/src alá került be, tömörített formában:
root@metal:/~# cd /usr/src/
root@metal:/usr/src# ls
linux-source-2.6.24.tar.bz2
root@metal:/usr/src# tar -xjvf linux-source-2.6.24.tar.bz2
root@metal:/usr/src# ln -s linux-source-2.6.24 linux
Mielőtt nekivágunk, tájékozódjunk a gépünk hardveréről (persze ha fejből megy minden chipset neve, akkor ezt nyugodtan átugorhatod... ):
root@metal:/~# lspci
00:00.0 Host bridge: VIA Technologies, Inc. VT8601 [Apollo ProMedia] (rev 05)
00:01.0 PCI bridge: VIA Technologies, Inc. VT8601 [Apollo ProMedia AGP]
00:07.0 ISA bridge: VIA Technologies, Inc. VT82C686 [Apollo Super South] (rev 22)
00:07.1 IDE interface: VIA Technologies, Inc. VT82C586A/B/VT82C686/A/B/VT823x/A/C PIPC Bus Master IDE (rev 10)
00:07.2 USB Controller: VIA Technologies, Inc. VT82xxxxx UHCI USB 1.1 Controller (rev 10)
00:07.4 Bridge: VIA Technologies, Inc. VT82C686 [Apollo Super ACPI] (rev 30)
00:07.5 Multimedia audio controller: VIA Technologies, Inc. VT82C686 AC97 Audio Controller (rev 20)
00:09.0 Ethernet controller: Intel Corporation 82557/8/9 Ethernet Pro 100 (rev 09)
00:09.1 Serial controller: Agere Systems LT WinModem
00:0a.0 CardBus bridge: Texas Instruments PCI1410 PC card Cardbus Controller (rev 01)
01:00.0 VGA compatible controller: Trident Microsystems CyberBlade i1 (rev 6a)
Azt már látjuk, hogy ez egy VIA alaplap, VT82CXX chipsetekkel, egy Intel Ethernet Pro 100 hálókártyával, van egy winmodem (ami nekem nem fog kelleni), PCMCIA kártya vezérlő, és egy őskori, nagy rakás Trident Cyberblade videókártya (asszem, nem ezzel fog menni a forgó-kocka-imbolygó-ablak effekt... :-))))
Lessük meg azt is, hogy milyen kernel modulokat töltött be a mostani kernel:
root@metal:/~# lsmod
Module Size Used by
sbs 15112 0
sbshc 7680 1 sbs
container 5632 0
dock 11280 0
iptable_filter 3840 0
ip_tables 14820 1 iptable_filter
x_tables 16132 1 ip_tables
ipv6 267780 12
lp 12324 0
loop 18948 0
pcmcia 40876 0
joydev 13120 0
af_packet 23812 2
snd_via82xx 29464 0
gameport 16008 1 snd_via82xx
snd_ac97_codec 101028 1 snd_via82xx
ac97_bus 3072 1 snd_ac97_codec
snd_pcm_oss 42144 0
snd_mixer_oss 17920 1 snd_pcm_oss
snd_pcm 78596 3 snd_via82xx,snd_ac97_codec,snd_pcm_oss
snd_page_alloc 11400 2 snd_via82xx,snd_pcm
snd_mpu401_uart 9728 1 snd_via82xx
snd_seq_dummy 4868 0
snd_seq_oss 35584 0
snd_seq_midi 9376 0
snd_rawmidi 25760 2 snd_mpu401_uart,snd_seq_midi
video 20112 0
output 4736 1 video
snd_seq_midi_event 8320 2 snd_seq_oss,snd_seq_midi
snd_seq 54224 6 snd_seq_dummy,snd_seq_oss,snd_seq_midi,snd_seq_midi_event
serio_raw 7940 0
snd_timer 24836 2 snd_pcm,snd_seq
snd_seq_device 9612 5 snd_seq_dummy,snd_seq_oss,snd_seq_midi,snd_rawmidi,snd_seq
battery 14212 0
ac 6916 0
button 9232 0
snd 56996 12 snd_via82xx,snd_ac97_codec,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_mpu401_uart,snd_seq_dummy,snd_seq_oss,snd_rawmidi,snd_seq,snd_timer,snd_seq_device
i2c_viapro 9876 0
i2c_core 24832 1 i2c_viapro
shpchp 34452 0
soundcore 8800 1 snd
yenta_socket 27276 1
rsrc_nonstatic 13696 1 yenta_socket
pcmcia_core 40596 3 pcmcia,yenta_socket,rsrc_nonstatic
via_agp 11136 1
agpgart 34760 1 via_agp
parport_pc 36260 1
parport 37832 2 lp,parport_pc
evdev 13056 0
pci_hotplug 30880 1 shpchp
irda 203068 0
via686a 15244 0
crc_ccitt 3072 1 irda
psmouse 40336 0
pcspkr 4224 0
ext3 136712 1
jbd 48404 1 ext3
mbcache 9600 1 ext3
sg 36880 0
sr_mod 17956 0
cdrom 37408 1 sr_mod
sd_mod 30720 3
via82cxxx 9348 0 [permanent]
ide_core 113996 1 via82cxxx
pata_acpi 8320 0
floppy 59588 0
uhci_hcd 27024 0
e100 37388 0
mii 6400 1 e100
usbcore 146028 2 uhci_hcd
pata_via 13316 2
ata_generic 8324 0
libata 159344 3 pata_acpi,pata_via,ata_generic
scsi_mod 151436 4 sg,sr_mod,sd_mod,libata
thermal 16796 0
processor 36872 2 thermal
fan 5636 0
fbcon 42912 0
tileblit 3456 1 fbcon
font 9472 1 fbcon
bitblit 6784 1 fbcon
softcursor 3072 1 bitblit
fuse 50580 1
Húbmeg, ez rohadt sok...! Nem magyarázom végig, melyik modul micsoda, mert el lehet olvasni majd kernel fordítás közben is, ékes angol nyelven. Az itt felsorolt feature-ökről az új kernel konfigurálása közben el tudjuk dönteni, hogy kellenek-e; de kiemelten figyeljünk rájuk, hiszen valszeg nem véletlenszerűen lettek betöltve. :-)
A kimeneteket másoljuk ki valahová, nagy szükség lesz rá.
(folyt. köv.)