HTML

Bagoj úr blogja

Kíváncsi Bagoj befigyel a Linux belsejébe, illetve különféle Linux terjesztéseket próbál ki. Ha jó napja van, scriptet ír Neked.

Friss topikok

Kernel fordítás - bevezető

2008.04.03. 10:40 bagoj ur

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.)

 

6 komment

Címkék: linux fordítás hardver ubuntu kernel rendszerfelügyelet

A bejegyzés trackback címe:

https://bagojur.blog.hu/api/trackback/id/tr25612277

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

bagoj.ur 2008.04.04. 14:17:18

(Türelmetlenek részére mondom el, hogy első körben a teljes boot folyamatot a bejelentkező képernyőig (gdm) sikerült 52,2 másodpercről 38,2-re rövidíteni. Mondjuk még nem tudom, hogy minden működik-e, például mert nincs egy USB-kulcs se nálam. Majd jelentkezem.)

birno 2008.04.04. 22:22:22

Kíváncsian várom a folytatást, ígéretesnek tűnik. :)

birno 2008.04.06. 21:58:48

Nem tudtam várni, fordítottam egy kernelt. :)
A gdm-ig 20 másodperc alatt jut el, de az usb-t egyenlőre nem tudja csatolni, valszeg a scsi támogatásnál csesztem el valamit, mert usb-nél ohci, ehci, uhci engedélyezve van, meg úgy ránézésre szerintem ott minden ok.
Most kísérlezetem még vele. :)

bagoj.ur 2008.04.06. 22:46:20

Azért is nem folytattam, mert bent hagytam a laptopot a melóhelyemen pénteken, és akkor még nem sikerült összehozni a hibernálást, ami mégsem járja... ;-)

Az usb_storage-t is engedélyezted? Mert azt kéne...

mavo · http://mavo.blog.hu 2008.04.09. 20:59:05

Jó szeműek inkább arra figyelhetnek fel, hogy a második szám a páros. :-) De aki 2.5.xx-es, vagy 2.7.xx-es stable kernelt használ, az szóljon :-D

bagoj.ur 2008.04.18. 13:45:01

Jut eszembe: Egy lsusb kiemenete sem árt azoknál, akinek USB kütyü van rádugva a gépre, onnan meg lehet tudni hogy elég-e a generic támogatás vagy speciálisan valami ahhoz a hardverhez írt drivert kell befordítani.
süti beállítások módosítása