Kernelforgatás (2.0-pre3)

Címkék

Ahogy sokan javasolták és igértem tovább folytattam a kernelforgatás doksim írását. A következő változat már rc lesz (már csak a grub, és pár disztrón az ncurses telepítése hiányzik belőle).Kernelforgatás (2.0-pre3)

1. Mi a kernel?

A kernel az operációs rendszerek magja. Még Windows-ban is van. Ez biztosítja a programoknak az egységesített felületet, amin keresztül a hardware-el tudnak kommunikálni (ez a jó öreg DOS-nál annyi volt, hogy közvetlen hozzáférést adott az összes hardware-hez, aztán minden program oldja meg a saját meghajtóprogramjaival a dolgot, ahogy akarja:). Win9x-ben a kernel a C:WINDOWSSYSTEMKernel32.dll fájl, WinNT/2000/XP alatt pedig a C:WINDOWSSYSTEM32Kernel32.dll fájl szokott lenni. De most nézzük a Linuxot. Linuxban általában /vmlinuz fájl a kernel.

2. Jó ez nagyon szép, de mi a ráknak újat forgatni belőle?

A Windows azért olyan, amilyen, mert a Microsoft csinál egy általános kernelt, és minden gépen ugyan az a kernel fut, így lehet, hogy ami az egyik gépen bejön, az a másikon nem igazán. Linuxnál nem kell ilyenektől szenvedni. Bekonfigurálod a kernelt pont a te gépedhez (és igényeidhez) igazítva, és pontosan azt csinálja, amit te szeretnél (Na jó. Szép álom lenne, de jobban követi az utasításaid, mint a Windows).

3. A kernel beszerzése

"Be kell szerezni? De hát a win ben benne van ott nem kellet beszerezni." Igen. Ez igaz, viszont a win-ben mindig több hónapos, vagy éves kernelt használsz. Biztos lehetsz benne, hogy az azóta kiderült és közismert hibák nincsenek javítva benne. Linuxban mindig friss, ropogós stabil kernelt érdemes használni (figyelem ez nem a legmagasabb verziószámot, vagy az utolsó kiadási dátumot jelenti). A kernelt a kernel.org-on lehet letölteni. Ott megkeresed a �The latest stable version of the Linux kernel is� kezdetű sort. Kb így fog kinézni:

The latest stable version of the Linux kernel is: 2.4.20 2002-11-28 23:54 UTC F V VI Changelog

Itt nem a 2.4.20 feliratra kell klikkelni a letöltéshez, mivel az egy patch (patchekről olvasd el a függelékeket). A sor vége felé ott van egy Nagy F betű. Arra kell kattintani (kb. 25 mega).

4. A beszerzett kernel előkészítése.

Ha megvan a kernel, akkor lehetőleg lépj ki konzolba és ott root-ként belépve folytasd tovább (ennek az első fontos oka, hogy így csak a rendszergazda jogokkal rendelkező felhasználók férhetnek majd hozzá a kernelhez és a forráskódjához, valamint többször volt, hogy az x-win-es konzolok hibásan jelenítették meg a menuconfigot (a menüs rendszerű kernelkonfiguráló felület), az xconfig pedig elég átláthatatlan (ez a grafikus változata a konfiguráló felületnek), meg jobb is inkább a menuconfigot megszokni, mert az grafikus felület nélkül is használható).

Lépj be a /usr/src-ba:

cd /usr/src

Mozgassad ide a letöltött kernelt:

mv /ahova/a/kernelt/töltötted/linux-2.4.20.tar.gz ./

(ha már nem a 2.4.20 a legújabb kernel, amikor ezt olvasod, akkor a verziószámot értelem szerint cseréld ki arra)

Tömörítsd ki a kernelt:

tar -zvxf linux-2.4.20.tar.gz

Így kapsz egy linux-2.4.20 könyvtárat. Erre én szoktam csinálni egy linket, hogy mindig elérhessem így is /usr/src/linux (ez nem kötelező lépés csak praktikus). Így:

ln -s /usr/src/linux-2.4.20 /usr/src/linux

Most lépj be a friss kernelt tartalmazó könyvtáradba!

cd /usr/src/linux

Most hogy a fölösleges cuccokat eltávolítsuk a kernelforrásból add ki ezt a parancsot:

make mrproper

5. A kernel konfigurálása

5.1. A kernelmodulokról

A kernelbe egy eszköz meghajtóprogramját több féle képen is bele lehet rakni. Lehet úgy, hogy mindig be legyen töltve (a kernel rendszerindításkor bekerül a memóriába), vagy lehet modulként tárolni. A modulok nem kerülnek bele a /vmlinuz-ba, hanem külön fájlokban tárolódnak el (/lib/modules/a-kernel-verziója/a-modulok) és csak akkor töltődnek be, ha egy program kéri rá őket, vagy te aktiválod őket a modconf paranccsal (ekkor minden indításnál betöltésre fognak kerülni, de akár mikor el lehet őket távolítani a memóriából.

5.2. Kernelbe vagy modulba?

Mikor melyiket kell használni?

Az esetek nagy részében a kernelbe való fordítást érdemes használni, amennyiben biztos vagy benne, hogy egy eszközt majdnem mindig használni akarsz (hálókártya meghajtóprogramja, ha állandóan hálón vagy, hangkártya meghajtóprogramja, ha állandóan zenét hallgatsz). Viszont, ha van olyan dolog, amit csak lehet, hogy fogsz használni, de nem akarsz olyankor azzal bajlódni, hogy újra forgass egy kernelt, akkor azt modulba rakod (ha mondjuk csak Linux van a gépeden, de lehet, hogy fog néha valamelyik haver hozni cuccot kivehető vinyón és nála még Windows van, akkor modulban felrakod a fat32, DOS és NTFS fájlrendszereket, és csak akkor töltöd be őket, ha helyzet van (mountoláskor maguktól is betöltődnek, ha szükség van rájuk)).

5.3. A menuconfig kasználata

És akkor most hogyan is megy ez a konfigurálás dolog?

Az eszközmeghajtóprogramok között a föl le nyilakkal tudsz lépkedni, és a space gomb lenyomásával tudod kiválasztani, hogy ne legyen lefordítva a meghajtóprogram, modul legyen, vagy a kernelbe forduljon. A jobbra-balra gombokkal pedig azt tudod kiválasztani, hogy mi történjen a space lenyomására. A select a meghajtóprogik állapotának az állítgatása. Az exit vagy visszalép a menüben egy szintet, vagy ha a menü gyökerében vagy, akkor kilép belőle, a help pedig segítséget ad arról a meghajtóprogramról, amin a kurzorod áll. Innen már sima ügy.

5.4. A menuconfig indítása

Ahhoz, hogy a menuconfigot elindítsad telepítve kell, hogy legyen egy ncurses nevű csomag a gépedn. Ennek a telepítése disztribúciókra lebontva a függelékek között olvasható Ncurses néven.

A menuconfig indításához a /usr/src/linux-ban a következő parancsot kell kiadni:

make menuconfig

Így egy első látásra tlán barátságtalannak tünő, de nagyon kezes menürendszerhez jutunk, amiben a meghajtóprogramok fő és alkategóriákra vannak osztva, hogy könnyebben megtalálhassuk őket.

5.5. A kernelkonfigurálásnál pár fontos dolog (eddigi tapasztalataim alapján)

Ha CD-t akarsz írni Linux alatt és ide cdíród van, akkor a következőket bele kell forgatni a kernelben (modulban nem megy (legalábbis nálam nem ment)):

ATA/IDE/MFM/RLL support ---> IDE, ATA and ATAPI Block devices ---> SCSI emulation support

SCSI support ---> SCSI support ; SCSI CD-ROM support ; Enable vendor-specific extensions (for SCSI CDROM) ; SCSI generic support

Ha nincs más scsi eszközöd, akkor minden mást ki lehet szedni az scsi-ből. (ettől még nem fog menni az scsi emuláció, mert bele kell írni egy sort a lilo.conf-ba, de ezt a végén még részletezem)

Játékport:

Lehet, hogy tényleg nem fogod sokat használni, de ha néha akarod használni, akkor is bele kell forgatni a kernelbe a portot (a dzsojsztikot nem fontos :) , mert anélkül nekem nem ismerte fel a gémpadom.

Multimedia devices ---> Video For Linux

Na ezt érti félre mindenki. Ez nem ahhoz kell, hogy tudjál videót nézni Linux-on. Ez a tv kártyákhoz kell, tehát, ha nincs, akkor ne kapcsold be.

File systems ---> MSDOS fs support

Ez az, ami akkor sem kell, ha van Windows a gépen. Ez csak akkor kell, ha van DOS, és nem akarsz alatta a ~1, meg hasonló fájlnevekkel küszködni (DOS-nak tudok ajánlani egy nagyon jó alternatívát: FreeDOS . Még ma is fejlesztik)

File systems ---> Network File Systems ---> SMB file system support (to mount Windows shares etc.)

Ez kell ahhoz, hogy Windows megosztásokat tudjál használni Linux alatt (a hálózatban).

Sound --->

Ha nem találod a hangkártyád, akkor kapcsold be ezt: OSS sound modules

Input core support --->

Az ebben a menüpontban szereplő cuccok csak USB-s eszközökre vonatkoznak.

Talán ennyi jó tanács elég. És szorgosan olvasni a helpeket a kernelmenün belül!!!

6. Forgassunk kernelt!

Ha mindent beállítgattál konfigolás közben, a menü gyökerében nyomsz egy -et, és azt mondod neki, hogy (tehát mentse a "beállításokat). Ha úgy érzed, hogy valamit elszúrtál, akkor csak elindítod újra a make menuconfig-gal ezt a menüt és kilépésnél megint mentesz.

Most a következő parancsot kell kiadni:

make dep


6.1. Forgatási módok

Több alternatíva is létezik a kernel lefordítására. Ezek közül a 2 legfontosabb:

make bzImage

vagy

make bzlilo

A 2 között az a különbség, hogy míg a make bzImage csak lefordítja a kernelt, addig a make bzlilo be is másolja a megfelelő helyre, ugyanakkor a nevéből is adódóan ez csak akkor használható, ha a disztribúciónk lilo bootmanagert használ (mielőtt ezt a parancsot kiadnánk át kell nézni a lilo.conf-ot, tehát nehogy így vaktában lefuttasd! mindenkép olvasd el a lilo-ról szóló részét a doksink előtte!!!). Ha bzImage-vel forgatsz, akkor a /ahol/a/kernel/forrása/van/arch/i386/boot/bzImage -be kerül a kernel.

6.2. Hová kell rakni?

Én elsőnek fogom a disztróban eredetileg benne lévő kernelt (általában /vmlinuz) és átrakom /vmlinuz.orig-ba (mv /vmlinuz /vmlinuz.orig). Ha bzImga-et használtál, akkor ezután a /ahol/a/kernel/forrása/van/arch/i386/boot/bzImage-t másold be a /vmlinuz fájlba. Ezek után még a bootloaderrel is tudatosítani kell, hogy új kernelt kapott a rendszer. Ez a következő 2 pontban lesz részletezve.

6.3 lilo

Lilo esetén a make bzlilo futtatása a logikus, viszont előtte be kell írni a lilo konfigurációs fájljába pár dolgot. A /etc/lilo.conf-ban találod a lilo beállításait. Ezt szerkeszd a kedvenc szövegszerkesztőddel (nekem emacs).A vége felé találsz egy ilyet:

image=/vmlinuz

label=Linux

read-only

Ez után írd be ezeket:

image=/vmlinuz.old

label=LinuxOLD

read-only

optional

image=/vmlinuz.orig

label=LinuxORIG

read-only

optional

Mostmár futtathatod a make bzlilo-t és a kernel magától helyre kerül, valamint a lilo is tudomást vesz róla.

6.4. grub


6.5. Modulok forgatása

Ok a kernel a helyén bootolásra készen. Vagy mégsem?

A modulokat még nem fordítottuk le. Erre a következő parancs szolgál: make modules. Ezek után a modulokat installálni kell a /lib/modules-be. Szerencsére ezt nem kézzel, hanem a make modules_install paranccsal kell megtenni.

7. reboot

Ezek után reboot, és ha valami nem működne az új kernelben, akkor válaszd ki a LinuxORIG-ot bootolásnál.


Függelékek

A. A kernelverziókról

1. Fővonal

A linux kernelnél a verziószám sokat mond el az avatott szemnek a kernelről. Nézzük az aktuális kernel verziószámát:

2.4.20

Az első pont előtti szám a főverzió. Ez csak nagyon lényeges változásoknál változik (ez látszik abból is, hogy eddig csak 2-nél tart).

A 2. pont előtti szám akkor változik, ha új funkciók kerülnek be a kernelbe. Ha ez páros, akkor stabil, ha páratlan, akkor fejlesztői kernelről van szó.

A 3. pint előtti szám nagyobb hibajavításoknál és hasonló nem funkcionális frissítéseknél változik.

Ennek a változása előtt általában a kernel verziószáma egy kötőjel után kap alverziószámot, ami lehet -preX, vagy -rcX. A -preX olyan verzió, ami biztosan változni fog még, az -rcX, ha nem találnak benne hibát, akkor egyszerűen eltűnik és a kernel verziójának utolsó száma lép egyet.

2. A nemFővonalak

A kernel úgynevezet fővonalát Linus Torvalds tartja karban, ugyanakkor léteznek olyan vonalai a kernelnek, amiket más emberek tartanak karban. Ezek általában alapnak a fővonalat veszik (illetve annak utolsó stabil változatát). A legaktívabb ilyen fejlesztő Alan Cox (röviden ac). Az ő változtatásai a fővonalon általában bele is kerülnek a fővonalba. Az ac vonalba ugyanakkor nem csak ac fejlesztései kerülnek bele, hanem vannak, akik neki küldik el a változtatásaikat és ő illeszti be. Ac kernelverziói a kernel.org-on is megtalálhatóak. Az ő esetében a kernel a kötőjel után egy -acX kiegészítést kap.

Ac kernelén kívül még rengeteg létezik. Az hogy ezeket érdemes -e használni azt a honlapjukon található információk alapján könnyen el lehet dönteni.

B. Patchelés

1. Mik a patch-ek?

A patch-ek arra szolgálnak, hogy, ha új verzió jön ki a kernlből, ne kelljen letölteni az egész forrást, mivel általában nem a teljes forráskód változik, csak bizonyos részei. A patch tehát ezeket a változásokat tartalmazza. A patchekkel mindig csak a verziószámukhoz képest előző kernelverzióról lehet frissíteni.

2. A kernel patchelése

A patcheket 3 formában lehet megtalálni: tömörítetlenül, bz2-be vagy gz-be tömörítve (bz2-ben a legkisebbek a patchek). A 3 között csak a használatukhoz kiadandó parancs a külömbség.

Elsőnek mind a 3 esetben be kell lépni a kernel könyvtárába.

A tömörítetleneknél a parancs:

cat /ahol/a/patch/van/patchfájlneve | patch -p1

bz2-be tömörítetteknél (onnan lehet felismerni, hogy a fájl neve .bz2-re végződik):

bunzip2 -cd /ahol/a/patch/van/patchfájlneve | patch -p1

gz-be tömörítetteknél (onnan lehet felismerni, hogy a fájl neve .gz-re végződik):

gunzip -cd /ahol/a/patch/van/patchfájlneve | patch -p1

3. Patchelés visszavonása

Ha a patchelést vissza kéne vonnod, azt is meg teheted gond nélkül. Belépsz a kernel könyvtárába és a következő parancsot adod ki:

cat /ahol/a/patch/van/patchfájlneve | patch -p1 -R

vagy

bunzip2 -cd /ahol/a/patch/van/patchfájlneve | patch -p1 -R

vagy

gunzip -cd /ahol/a/patch/van/patchfájlneve | patch -p1 -R

C. Ncurses

1. Az Ncurses-ról

Az Ncurses konzolos menuk kirajzolására használt lib. Talán ennyi elég is róla.

2. Az Ncurses telepítése a nagyobb disztribúciókban

Mandrake:


Red Hat:


Gentoo:

emerge -s ncurses

Debian:

apt-get install libncurses5-dev

SuSE:

YaST-al próbáld meg!

Slackware:

D. Kernel a Debian-ban (kernel-package)

1. A kernel-package csomag

A kernel-package csomag egy olyan extra lehetőséggel terjeszti ki a Debian-t, amivel talán egy másik disztribúció sem rendelkezik (kivéve esetleg a debian alapúakat:). Aki Debian-t használ az tudja, hogy az dpkg (apt-get) mennyire megkönnyíti az ember életét. Ezt a könnyedséget terjeszti ki a kernel-package csomag a kernel használatára is. Ezzel a csomaggal ugyan olyan .deb csomagokat csinálhatunk a kernelből, mint amilyen az összes többi csomag, így egy kernel telepítése, vagy eltávolítása másodpercek alatt és jelentősen kevesebb macerával mehet végbe.

2. make-kpkg

A kernel-package használata pofon egyszerű. Elő kell készíteni a kernel forrását, ahogy a doksi elejében van (kitömörítés, majd konfigurálás), de sem make dep-et, sem az után következő parancsokat nem kell lefuttatni. Egyszerűen csak be kell lépni a kernel forrásának a könyvtárába (/usr/src/linux), és ki kell adni ezt a parancsot:

make-kpkg kernel_image

Ez elkészít a kernel könyvtárához képest egy könyvtárral feljebb (../) egy debcsomagot, és innentől már csak ki kell adni a

dpkg -i ./ahol/a/csomag/van/kernel-image-kernelverzioja_10.00.Custom_i386.deb

parancsot, aztán rebootolni és már élvezhetjük is az új kernelünket.

D. Erről a doksiról

1. Miért?

Ez a doksi eredetileg egy játékokkal foglalkozó weboldal fórumában íródott (http://www.mportal.hu/?action=forum_olvas&base=mportal8&thread=

203&hit2=25&page=1), azért, hogy azok is tudjanak kerneltforgatni, akiket a linuxos világ nagy része lamáknak nevez, pedig csak egyszerűen nem úgy születtek, hogy értenének a linuxhoz.

2. Készítő(k)

A doksit BaliHB készítette (azaz én), de szeretnék köszönetet mondani az tanácsaikért és hathatós segítségeikért a következőknek:

A jelenlegi főnököm

szogi

rengeteg fórum és cikkolvasó

2 Fejlesztés

A doksi folyamatos fejlesztés alatt áll. Vannak stabil, dev, pre és rc verziói is. A verziókról bővebben a kernelverziókról szóló függelékben olvashatsz :)

3. Készült

Készült: emacs, linux kernel, OpenOffice.org (office.fsf.hu-s magyarítás, valamint az ebből általm készített .deb csomag (http://savannah.nongnu.org/projects/ooodeb-hu/)), Debian, gnome-terminal, wmaker

felhasználásával.

Minőségét megörzi: amíg én vagy valaki fejleszti.

Hozzászólások

Éppen darabokban hever a rendszerem. pre4-re javítom a dolgot (nemsokára újrarakom az egész debian-omat, mert ezt helyrehozni már évek kellenének).

A kernelbe vagy modulba dolgot valsz nem fogom javítani, mert a kezdőket nem akarom ilyenekkel traktálni.

msdos fs tényleg eléggé hülyeség, azt javítom (azt akartam leírni, amit mondtál, csak nem sikerült :)

System.map-ot javítom (mindíg make bzlilo-val vagy make-kpkg-vel rakom a kernelt, azoknál meg ezzel nem kell szórakázni, úgyhogy elfelejtettem beleírni)

"A kernelbe vagy modulba dolgot valsz nem fogom javítani, mert a kezdőket nem akarom ilyenekkel traktálni."

A kezdő nem érti meg azt a szót, hogy fixen? Szerintem ha a kezdőnek valamit magyarázol, semmibe nem kerül pontos szóhasználattal elmagyarázni, és ebben az esetben nem lesz később azzal gondja, hogy tudomásul vegye: nem pontosan úgy van valami, mint ahogy megismerte.

Néhány korrekció:

5.2. Kernelbe vagy modulba? Ezt én a helyedben nem így fogalmaznám, azt sugallja, hogy a modul nem része a kernelnek, pedig hát de :) Javaslom, hogy 'kernelbe' helyett írd, hogy 'fixen'.

File systems ---> MSDOS fs support: itt megemlíteném a vfatot, erről szerintem elég sokan szoktak elfeledkezni, aztán csodáloznak, hogy nem látják a hosszú file-neveket.

A kézi felrakásnál le kéne azt is írni, hogy a System.map file-t is célszerű System.map-kernelverzió néven betenni a /boot könyvtárba, elég sok program kiabál, ha nem találja meg valahol.