Kernelin kääntäminen
(2.4-sarja)

Sisällysluettelo

1. Johdanto
2. Kernelin kääntämisen pikaohjeet
Mistä hankin kernelin lähdekoodipaketin?
Mikä on uusin kerneliversio?
Miten puran paketin?
3. Kernelin kääntäminen Debianissa
Vanhojen tietojen puhdistus ennen kääntämistä
Make clean
make mrproper
Kernelin konfigurointi
Käytä alkuperäistä kernelin konfigurointitiedostoa hyväksi!
make xconfig
Linux-logo
make menuconfig
make dep
Anna kernelillesi nimi!
Kernelin kääntäminen
make bzImage
make modules ja make modules_install
make install
Make-käskyjen ajaminen peräkkäin
4. Uuden kernelin käyttöönotto
Kernelin kopiointi
System.map-tiedoston kopiointi
Lilon tai Grubin konfigurointi
Buuttidisketti?
Totuuden hetki!
Kun kaikki menee pieleen...
5. Lisätietoa
Debianin 'kernel-package' -systeemi
Vinkkinurkka
6. Screenshots
make xconfig
make menuconfig
7. Kertausta

Johdanto

Kernelin (ydin) kääntäminen kiinnostaa kaikkia Linuxista innostuneita, mutta vain harva uskaltaa ryhtyä siihen, koska asiaan liittyy tavallisen ihmisen mielessä paljon mystiseltä tuntuvia seikkoja. Lisäksi käännösohjeet ovat sekavia eikä niistä tahdo huolellisella lukemisellakaan saada tolkkua. Mutta ei kernelin kääntäminen ole niin vaikeaa, mitä yleensä annetaan ymmärtää ja lähes jokainen pystyy siihen, jos vain noudattaa kernelipaketin mukana tulevia ohjeita (README). Omat ohjeeni olen laatinut 2.4-sarjan kernelin kääntämistä varten. Suosittelen lukemaan ohjeet kokonaan läpi ainakin kerran ennen kääntämistä.

Jos käännät uudempaa 2.6-sarjan kerneliä, noudata sen mukana tulevia ohjeita (muuttuneet ohjeet!), ks. (README) ja (CHANGES). Mm. vaihe make dep on jätetty kokonaan pois ja konfigurointitiedosto .config 2.4.x-sarjasta 2.6.x-sarjaan ei ole yhteensopiva. Uuden 2.6.x.sarjan kernelin asentamiseen tarvitaan myös module-init-tools-paketti. Lisäksi moduulimääritykset on muutettu modules.conf-tiedostosta modprobe.conf-tiedostoon ja tiedostojen nimissä on tapahtunut muutoksia. Kuitenkin alias- ja options-määrittelyt ovat säilyneet suunnilleen samoina, joten yleensä rivien kopiointi modules.conf:sta modprobe.conf:iin riittää. Yksityiskohtaiset ohjeet 2.6-kerneliversion kääntämiseen löydät sivulta http://kerneltrap.org/node/view/799. Hyvät ohjeet 2.6-sarjan kernelin kääntämiselle Debianille on sivulla http://www.desktop-linux.net/debkernel.htm.

Ennen kääntämistä kannattaa vielä asettaa itselle kysymys: miksi haluan kääntää kernelin? Linuxin toiminnan kannalta on tietenkin turvallisinta pysyä Updaten kautta tulevissa päivityksissä. Mutta hyvä syy kernelin kääntämiseen on vaikkapa usb-tuen puuttuminen 2.2-sarjan kernelistä tai bluetooth-tuen puuttuminen vielä 2.4.18-kernelistä - jos näitä tarvitsee. Toki myös hyvä syy kernelin kääntämiseen on tehdä se ihan vain omaksi huvikseen ja uteliaisuuttaan :)

Kernelin kääntämisen pikaohjeet

Lyhyesti esiteltynä kernelin kääntäminen sisältää seuraavat vaiheet, joihin paneudumme myöhemmin riittävän yksityiskohtaisesti:

  1. Tee käynnistyslevyke, jos sitä ei ole ennestään
  2. Pura kernelipaketti ja mahdolliset päivitykset (patch) kotihakemistoosi. Siirry kernelin hakemistoon.
  3. make clean tai make mrproper
  4. make menuconfig tai make xconfig
  5. make dep
  6. make bzImage
  7. make modules
  8. make modules_install
  9. make install (ei yleensä välttämätön)
  10. kopioi tiedosto /arch/i386/boot/bzImage boot-hakemistoon haluamallasi nimellä esim. /boot/tapsa-2.4.20
  11. kopioi tiedosto System.map boot-hakemistoon Makefilessa määrittelemälläsi nimellä /boot/System.map-2.4.20-xxxxx
  12. konfiguroi Lilo uutta kerneliä vastaavaksi ja aja lilo (tai jos käytät Grubia, niin tee tarvittavat muutokset Grubin konfigurointitiedostoon)
  13. make clean (jos haluaa vapauttaa levytilaa, ei välttämätön)
  14. Käynnistä kone uudelleen

Kernelin kääntämisessä käytetään make-ohjelmaa, joka hakee toimintaohjeensa Makefile-tiedostosta.

Mistä hankin kernelin lähdekoodipaketin?

Uusimman paketin saat aina osoitteesta: ftp://ftp.fi.kernel.org/pub/linux/kernel/ tai http://www.kernel.org/.

Huomaa, että parilliset versiot ovat vakaita eli tuotantoversioita ja parittomat kehitysversioita. Jos kernelille on olemassa päivityksiä (patch), joilla on suurempi versionumero kuin itse kernelillä, imuroi myös päivitys.

Mikä on uusin kerneliversio?

Uusimmat kerneliversiot näet osoitteesta http://www.kernel.org/kdist/finger_banner seuraavan mallin mukaisesti (listaus haettu sivulleni 9.9.2003):

The latest stable version of the Linux kernel is:           2.4.22
The latest prepatch for the stable Linux kernel tree is:    2.4.23-pre3
The latest snapshot for the stable Linux kernel tree is:    2.4.22-bk13
The latest beta version of the Linux kernel is:             2.6.0-test5
The latest 2.2 version of the Linux kernel is:              2.2.25
The latest 2.0 version of the Linux kernel is:              2.0.39
The latest prepatch for the 2.0 Linux kernel tree is:       2.0.40-rc6
The latest -ac patch to the stable Linux kernels is:        2.4.22-ac1
The latest -ac patch to the beta Linux kernels is:          2.6.0-test1-ac3

Miten puran paketin?

Pura kernelin lähdekoodipaketti (esimerkissä linux-2.4.20.tar.gz) kotihakemistossasi komennolla gzip -cd linux-2.4.20.tar.gz | tar xfv - (kernelin purkaminen teki kotihakemistoosi alihakemiston linux-2.4.20, johon lähdekoodi purettiin).

Päivitys (patch) puretaan komennolla gzip -cd patch-2.4.20.gz | patch -p0. Huom! Jos sinulla on jo samannumeroinen lähdekoodipaketti, ei päivitystä tarvitse tietenkään ajaa. Mutta jos patch olisi vaikkapa 2.4.4x, silloin on tullut jotain korjattavaa ja päivitys kannattaa ajaa. Jos vahingossa yrität ajaa samanumeroista päivityspakettia kuin kernelipaketti, niin saat siitä virheilmoituksen. Keskeytä ohjelma esim. Ctrl-c:llä.

Huom! Aikaisemmissa versioissa (2.2 ja sitä edeltävät) käännettiin kerneli /usr/src/linux/-hakemistossa, mutta 2.4-ytimillä ja uudemmilla on suositeltavin tapa kääntää kerneli kotihakemiston alla tavallisena käyttäjänä. Sinun ei siis tarvitse kirjautua sisään roottina kääntääksesi kernelin, mutta itse asennus vaatii kirjautumisen superuserina (su).

Jos käytät paketinhallinnan kautta (esim. Red Hatin 'Update Agent') saatavaa lähdekoodipakettia (kernel-source), niin kernelin kääntö tehdään edelleen /usr/src-hakemistossa.

Kernelin kääntäminen Debianissa

Esitän esimerkkinä kernelin kääntämisen Debianissa (3.0r0, 'Woody') tavallisen käyttäjänä omassa kotihakemistossaan, josta aika hyvin selviää, mikä voi mennä pieleen ja syy, miksi kääntäminen ei aina onnistu.

Vanhojen tietojen puhdistus ennen kääntämistä

make clean

Make-ohjelman komento make clean puhdistaa kaikki vanhan kääntämisen jäljiltä jääneet tiedostot. Älä ohita make clean -vaihetta, jos käännät kernelin uudelleen! Jos ohitat tämän vaiheen, niin älä ihmettele, jos saat omituisia virheilmoituksia, kun käynnistät koneen uudella kernelillä (jos se ylipäänsä edes käynnistyy!). Make clean ei poista kernelin konfigurointitiedostoa (.config). Tämän käskyn voi ajaa uudestaan myös kernelin kääntämisen jälkeen.

make mrproper

Käsky make mrproper tekee saman kuin make clean, mutta perusteellisemmin. Se poistaa mm. vanhat kernelin käännönaikaiset tiedostot, konfiguroinnin (ei kuitenkaan omaa itse tekemääsi konfigurointitiedostoa!), entisen käännetyn kernelin (bzImage) /arch/i386/boot-hakemistosta sekä System.map-tiedoston kernelin lähdekoodihakemiston juuresta, ja kun seuraavan kerran käännät kernelin, niin kaikki tiedot pitää syöttää taas uudelleen alusta asti, jos ei ole nimennyt omaa konfigurointitiedostoa tai tallentanut .config-tiedostoa jonnekin talteen.

Useimmissa kernelin kääntämisohjeissa mainitaan, että make mrproper on nykyään tarpeeton ja että riittää, kun ajaa käskyn make clean sen tilalla. Näin usein onkin, mutta otan tämän vaiheen mukaan ohjeisiin, koska kernelin 2.4 README-tiedostossa se on mainittu käskyn make clean tilalla. Vaihe on ehdottoman tärkeä, jos olet saanut virheilmoituksia aikaisemman kernelin käännön yhteydessä. Seuraavia ohjeita huolellisesti noudattamalla voit ajaa tässä vaiheessa make mrproper-käskyn ilman pelkoa, että menetät joitakin tärkeitä tiedostoja ja rikot kernelin jollakin tavoin.

Kernelin konfigurointi

Ohjelmat make xconfig ja make menuconfig ovat helppoja graafisia kernelin konfigurointityökaluja, joista xconfig vaatii X:n toimiakseen ja ohjelmaa käytetään hiirellä. Toinen vaihtoehto menuconfig on täysin tekstipohjainen ohjelma, jossa valikosta valitaan halutut kernelin asetukset ja ohjelmaa käytetään näppäimistöltä. Kumpaa ohjelmaa siten tulisi käyttää? Aloittelijan kannattaa mielestäni käyttää xconfigia (mukana on hyvät help-tiedostot kaikista kernelin mukaan valittavista komponenteista). Jos taas on kääntänyt kernelin aikaisemmin, niin menuconfig on silloin nopeampi ja ehkä myös loogisempi käyttää. Myös menuconfigissa on help-tiedostot, jotka avataan kysymysmerkillä (?). Jos haluat tehdä kaiken kaikista vaikeimman kautta, niin silloin käytät kolmatta vaihtoehtoa make config ja vastaat yksitellen jokaisen eteen tulevaan kysymykseen.

On myös järkevää käyttää hyväksi vanhan kernelin konfigurointitiedostoa käyttämällä make oldconfig -vaihtoehtoa, joka toimii kuten 'make config', mutta kysyy vain muuttuneista kohdista. Yleensä kannattaa vain selata kohdat läpi ja tutustua muutoksiin ja tehdä sitten valinnta make menuconfig tai make xconfig -valinnoilla.

Käytä alkuperäistä kernelin konfigurointitiedostoa hyväksi!

Kernelin kääntöä nopeuttaa huomattavasti, jos käyttää entisen kernelin konfigurointitiedostoa pohjana uudelle kernelille. Silloin tarvitsee vain muuttaa halutut asiat eikä tarvitse käydä kaikki vaihtoehtoja lävitse.

Alkuperäisen kernelin konfigurointitiedosto on /boot-hakemistossa ja esim. Red Hat 9:ssä se on config-2.4.20-8-niminen (FTP:n kautta asennetussa SuSE 8.2:ssa konfigurointitiedoston nimi taas on itselläni vmlinuz-2.4.21-4-athlon.config). Jos olet hakenut Red Hatiin kernel-source-paketin Updaten kautta, niin lähdekoodipaketti asennetaan /usr/src/linux-2.4.x-x-hakemistoon (minulla versionumero on tällä hetkellä 'linux-2.4.21-4') ja konfigurointitiedosto on nimeltään .config (. tiedoston edessä tarkoittaa piilotettua tiedostoa) samassa hakemistossa. Paketinhallinnan kautta asennettu kernel-source siis käännetään eri hakemistossa (/usr/src/linux) kuin itse haettu lähdekoodipaketti (käyttäjän omassa kotihakemistossa). Tiedosto /usr/src/linux on symbolinen linkki /usr/src/linux-2.4.x-x-hakemistolle.

Lisäys ohjeeseen (9.4.2004):
Mistä sitten tietää, mihin tiedostoon jokin symbolinen linkki viittaa? Asian voi tarkistaa helposti komennolla la (tai ls -la). Listauksessa nuolenpäät (->) osoittavat symboliset linkit ja mihin hakemistoon ja tiedostoon ne viittaavat, esimerkiksi:

lrwxrwxrwx    1 root     root           19 2004-03-27 20:35 vmlinuz -> boot/vmlinuz-2.6.3-1-686
lrwxrwxrwx    1 root     root           19 2004-03-27 20:35 vmlinuz.old -> boot/vmlinuz-2.4.25
make xconfig

Siirry kotihakemistostasi kernelin hakemistoon (esim. cd linux-2.4.20), jossa kääntäminen suoritetaan. Jos olet asentanut Debianin peruspaketeilla, niin kääntämiseen tarvittavia kirjastotiedostoja ja kääntäjää ei ole asennettu, ja tässä on osa ruudulle tulostuvasta tekstistä, jos kirjoitat make xconfig:

wish -f scripts/kconfig.tk
make: wish: Command not found
make: *** [xconfig] Error 127

Tuloste osoittaa, että TkWish (Tk/Tcl) puuttuu. Miten ne sitten saa asennettua ja mistä ne löytyvät? Debianissa tämä on hyvin helppoa, kun kirjoittaa superuserina (su) vain jotain käskyihin liittyvää, esim. apt-get install tk8.3 (heinäk. -03 uusin versio on 8.4). Syötä sitten CD-asemaan ohjelman pyytämä 1. CD, niin tarvittavat kirjastot ja kääntäjä on hetkessä asennettu! Samalla tavalla voit asentaa muutkin tarvittavat ohjelmat, jos niitä ei ole asennettu. Itse jouduin lisäksi asentamaan (olin tehnyt minimaalisen asennuksen) ohjelmat make, patch, ja gcc.

Nyt voit käynnistää ohjelman make xconfig ilman virheilmoituksia (ks. kuvaruutukaappaus xconfigista). En puutu tässä tarkemmin kerneliin mukaan otettaviin komponentteihin, mutta vaihtoehtoina on asentaa halutut osat joko itse kerneliin tai erikseen ladattaviksi moduuleiksi. Yleisimmin käytetyt komponentit kannattaa lisätä itse kerneliin ja vähemmän käytetyt moduuleiksi. Muista, että jos lisäät komponentteja itse kerneliin, sen koko kasvaa. Jos haluat tutkailla ytimeen ladattavia moduuleja, niin moduulien määritykset löydät Debianissa /etc/modutils-hakemistossa olevista tiedostoista (muissa distroissa tiedostosta /etc/modules.conf).

Huom! Ennen kuin tallennat tekemäsi muutokset ja poistut ohjelmasta (Save and Exit), tee oma konfigurointitiedosto klikkaamalla kohtaa Store Configuration to File ja anna tiedostolle haluamasi nimi. Tiedosto tallentuu puretun kernelipaketin juureen. Jos et tee omaa konfigurointitiedostoa, niin seuraavan kerran kun ajat make mrproper, kaikki konfigurointitiedot häviävät. Mutta oma konfigurointitiedosto ei häviä ja voit seuraavan kerran, kun käynnistät make xconfig, ladata ohjelman käynnistymisen jälkeen vanhat asetukset (ja muuttaa vain niitä, joita haluat muuttaa) Load Configuration from File (ks. malliksi oma konfigurointitiedostoni, älä käytä sellaisenaan, koska tiedosto on vain omalle koneelleni sopiva!).

Pieni boot logo saadaan näkyviin käynnistyksen yhteydessä, jos kerneli käännetään framebuffer-tuella.

# Frame-buffer support
#
CONFIG_FB=y

Valitse myös

Aloituskuvan voi tehdä myös itse sivun http://en.tldp.org/HOWTO/Framebuffer-HOWTO-19.html ohjeen mukaan vaihtamalla /include/linux/linux_logo.h-kuvan Gimp pluginilla http://registry.gimp.org/plugin?id=376.

make menuconfig

Jos olit valinnut xconfigin sijasta make menuconfig -vaihtoehdon, niin saat Debianin oletusasennuspaketeilla seuraavan virheilmoituksen:

>> Unable to find the Ncurses libraries.
>>
>> You must have Ncurses installed in order
>> to use 'make menuconfig'

Nyt näyttävät puutttuvan Ncurses-kirjastot. Ne voi asentaa superuserina (su) esim. seuraavasti: apt-get install ncurses*. Asennusohjelma pyytää CD:t 1, 6, 3 ja 5 mainitussa järjestyksessä. Tämän jälkeen make menuconfig toimii (ks. kuvaruutukaappaus menuconfigista).

make dep

Käsky make dep ajetaan juuri tässä vaiheessa heti kernelin konfiguroinnin jälkeen (esim. make xconfig) ja on välttämätön, koska se tarkistaa kaikki riippuvuudet (dependencies).

Anna kernelillesi nimi!

Anna tässä vaiheessa kernelille oma persoonallinen nimi muokkaamalla kernelipaketin juuressa olevan Makefile-tiedoston alkua:

VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 20
EXTRAVERSION = -mh5
KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)

Edellä mainitun kernelin versio on siis 2.4.20-mh5. Voit katsoa nykyisen kernelisi version kirjoittamalla konsolissa cat /proc/version tai uname -a.

tapsa:/home/tapsa # uname -a
Linux tapsa 2.4.20-4GB-athlon #1 Wed Apr 16 08:52:03 UTC 2003 i686 unknown
tapsa:/home/tapsa # cat /proc/version
Linux version 2.4.20-4GB-athlon (root@Athlon.suse.de) (gcc version 3.3 20030226
(prerelease) (SuSE Linux)) #1 Wed Apr 16 08:52:03 UTC 2003

Tämä vaihe on tärkeä, jos teet useita kernelikäännöksiä, koska myöhemmin tehtävät moduulit tulevat nimeämäsi kerneliversion nimiseen alihakemistoon (samoin System.map voidaan nimetä tämän Makefile-tiedoston perusteella, System.map-2.4.20-mk5, mutta siitä sitten vähän myöhemmin). Edellä mainitun käännöksen moduulit sijaitsevat /lib/modules/2.4.20-mh5-hakemistossa. Näin toimien voit kääntää kernelin turvallisesti niin usein kuin haluat, koska jokaisella kernelillä on oma yksilöllinen nimensä ja omat ko. kerneliä vastaavat moduulit.

Kernelin kääntäminen

make bzImage

Seuraava vaihe make bzImage on itse käännösvaihe ja kestää hitaalla koneella melko pitkään. Vaihe on täysin automaattinen ja jos lopussa ei ole virheilmoitusta (error), voi siirtyä eteenpäin seuraavaan vaiheeseen. Jos taas jostain syystä saat virheilmoituksen, niin palaa takaisin vaiheeseen make mrproper ja aloita uudelleen.

make modules ja make modules_install

Tässä vaiheessa rakennetaan moduulit ja seuraavassa vaiheessa asennetaan ne. Jos jostain syystä teet saman nimisen kernelin kuin käytössä oleva (et ole antanut Makefile-tiedostossa kernelille uutta nimeä), niin tee backup kerneliä vastaavasta moduulihakemistostasi ennen make modules_install käskyn ajamista. Silloin voit ottaa vanhaa kerneliä vastaavat moduulit vielä käyttöön, jos uusien kanssa on ongelmia. Ladattavat moduulit ovat /lib/modules-hakemistossa.

make install

Tämä käsky tekee tiedoston /etc/initrd*.img ja asentaa sen oikeaan paikkaan. Samoin asennetaan System.map ja uusi kerneli oikeaan paikkaan ja päivitetään Grub tai Lilo. Käsky ajetaan ehdottomasti vasta make modules_install jälkeen. Debianissa tätä vaihetta ei välttämättä tarvita.

Make-käskyjen ajaminen peräkkäin

Voit ajaa make-käskyt kernelin konfiguroinnin (make xconfig) jälkeen myös kätevästi peräkkäin make dep bzImage modules modules_install. Itselläni tähän meni aikaa 20-25 min. hitaalla (AMD 400 MHz, 64 Mt) koneella ja nopeahkolla koneella (Athlon 1.3 GHz, 512 Mt) 5-10 min.

Jos koneessasi on monta suoritinta, voit nopeuttaa kääntöä käyttämällä valitsinta -j4 (jolloin make osaa kääntää useaa tiedostoa yhtäaikaa) make -j4 dep && make -j4 bzImage jne. Huomaa, että tällöin pitää eri vaiheet komentaa yksitellen edellisen mallin mukaisesti (käytetään && komentojen välissä).

Jos vielä osaat käyttää ram-levyä, niin kääntäminen sujuu jopa reippaasti alle minuutin :)

Uuden kernelin käyttöönotto

Js ajoit viimeksi valinnaisen käskyn make install, kaiken pitäisi olla nyt valmiina. Debianissa 'make install'-käskyä ei tarvitse ajaa välttämättä vaan voit kopioida kernelin ja System.mapin käsin, jolloin init*.rd-tiedostoa ei tehdä (init*.img-tiedostoa ei siis Debianissa vättämättä tarvita)! Sen voi kuitenkin tehdä halutessa myöhemmin konsolissa mkinitrd-komennolla.

Mikä sitten on initrd-tiedosto ja koska sitä tarvitaan? Initrd: (An initrd image is a kernel image that expects to use an INITial Ram Disk to mount a minimal root file system into RAM and use that for booting [infoa initrd:stä kernelin asennuksen yhteydessä]). Ide-kiintolevyjen kanssa initrd:tä ei tarvita ollenkaan. Mutta initrd on välttämätön, jos tietokone sisältää tiedostojärjestelmä- tai massamuistiajureita, joilla ei voida käyttää suoraa tukea kernelissä ja juuriosio (/, root) on tällaisella laitteella. Kyseessä on tällöin lähinnä RAID 5-taso tai LVM.

Jos käytössäsi on Grub-käynnistyslataaja, voit testata initrd:n tarpeellisuutta, painamalla valikossa kirjainta e, jolloin pääseet muokkaustilaan. Poista sitten alimmainen initrd:n sisältävä rivi painamalla kirjainta d. Seuraavaksi buuttaat Linuxiin painamalla kirjainta b. Jos kone käynnistyy normaalisti, et tarvitse initrd:tä. Huom! Tämä 'testausmahdollisuus' on Grubin etu Liloon nähden - muutokset eivät siis tule pysyviksi. Pysyviksi muutokset tulevat vasta, kun ne tehdään /boot/grub/grub.conf-tiedostoon tai joissakin distroissa /boot/grub/menu.lst-tiedostoon.

Jos kaikki on tähän asti mennyt hyvin, niin uusi bzImage-niminen kerneli on lähdekoodihakemiston /arch/i386/boot/ alihakemistossa ja System.map-tiedosto on lähdekoodihakemiston juuressa.

Kernelin kopiointi

Debianisa kerneli pitää kopioida oikeaan paikkaan ja antaa sille haluttu nimi (paitsi jos käytit komentoa make install, kaikki on jo kopioitu valmiiksi). Kerneli (bzImage) kopioidaan lähdekoodin alihakemistosta /arch/i386/boot/ juuriosion (/) boot-hakemistoon ja nimetään halutulla tavalla esim. tapsa-2.4.20. Järkevintä olisi kyllä käyttää Makefile-tiedostossa olevaa nimeä, esimerkissä vmlinuz-2.4.20-mh5 (ks. Anna kernelillesi nimi!), jolloin kerneli ja siihen kuuluvat System.map ja moduulit (/lib/modules-hakemistossa) olisi helpompi hahmottaa itselleen. Kerneleitä kun tahtoo väkisinkin kerääntyä useampia :)

System.map-tiedoston kopiointi

System.map:n saat kopioitua seuraavasti: cp System.map /boot/System.map. System.map on purkamasi kernelipaketin juurihakemistossa.

System.map-tiedostoa käyttää hyväksi kernelin lokiprosessi (klogd) ja voit tutkia käynnistyksen aikaisia lokitietoja tiedostosta /var/log/kern.log. Jos siellä on kohdan Inspecting /boot/System.map jälkeen teksti Cannot find map file, niin System.map-tiedostoa ei löydy. Jos taas tekstinä on Symbols match kernel version, on kaikki kohdallaan. Klogd osaa etsiä myös /boot/System.map-kerneli_versio -nimistä tiedostoa, joten tiedosto kannattaa nimetä kerneliversiota vastaavaksi. Kernelin version saa selville cat /proc/version. Minulla se on siis 'Linux version 2.4.20-mk5'. Huom! Vanhat klogd-versiot eivät välttämättä tunnista System.map-kerneli_versio nimeämiskäytäntöä (itselläni on klogd 1.4.1, joka ainakin toimii. Versionumeron näet /var/log/kern.log -tiedoston alusta).

Jos teet useita kernelikäännöksiä, anna jokaiselle System.map-tiedostolle kerneliversiota vastaava nimi, niin voit myös käynnistää eri nimiset kernelit oikeilla moduuleilla eikä uusi System.map tuhoa vanhaa. Esimerkkikäännöksessä siis ei kopioidakaan System.map-tiedostoa suoraan vaan sille annetaan ensin nimi, System.map-2.4.20-mk5 (sama kuin Makefile-tiedostossa, ks. Anna kernelillesi nimi!). Koska myös alkuperäiselle tiedostolle on annettu nimi System.map-2.4.18-bf2.4 (eikä pelkkä System.map), niin uusi tiedosto ei tuhoa vanhaa. Samoin jatkossa uusien käännösten yhteydessä myös vanhat System.map-tiedostot säilyvät, koska kaikilla on yksilöllinen nimi.

Lilon tai Grubin konfigurointi

Uudempi Grub on helppo konfiguroida lisäämällä vain uusi kerneli /boot/grub/menu.lst-tiedostoon (joissakin distroissa /boot/grub/menu.conf). Vanhemman käynnistyslataajan, Lilon (Debiianissa oletuksena), konfigurointitiedosto on /etc/lilo.conf ja siinä voi kommentoida vanhan kuvatiedoston risuaidalla pois # image=/vmlinuz ja antaa uuden kernelin nimi ja sijainti vastaavasti image=/boot/tapsa-4.2.20 (kirjoita tähän oman kernelisi nimi!). Huomaa, että boot-hakemisto lisätään kernelin eteen. Älä kommentoi vanhaa kerneliä pois käynnistyslataajasta ennen kun olet varma, että uusi kerneli tosiaan käynnistyy. Muista ajaa käsky lilo lopuksi!

Buuttidisketti?

Jos buuttidisketti on edelleen tekemättä, jolla saat vanhan kernelin käynnistettyä, niin nyt on vielä mahdollisuus sen tekemiseen! Debianissa se tehdään käskyllä mkboot (tai mkrescue).

Totuuden hetki!

Sammuta kone (shutdown) ja käynnistä uudelleen (reboot) seuraavasti: shutdown -r now. Jos Linux käynnistyy, niin kääntäminen on ainakin päällisin puolin onnistunut. Jos olit valinnut väärän prosessorityypin make xconfig -vaiheessa, niin Linux ei käynnisty ollenkaan. Myös väärät käynnistyslataajan tiedot (Lilo tai Grub) estävät käynnistymisen uudella kernelillä. Luultavasti Linuxisi kuitenkin käynnistyy, mutta jotain on ensimmäisellä kerralla varmastikin jäänyt huomaamatta komponenttien valinnassa. Itselläni ensimmäinen käännös sujui hyvin, mutta vfat- ja udf-tuki jäivät asentamatta ja disketit ja CD-RW:t eivät siksi toimineet. Usein myös APM / ACPI jää konfiguroimatta kernelistä, jolloin kone ei sammukaan shutdownilla vaan virta jää päälle.

Koska kääntäminen on niin helppoa, niin voit tehdä kääntämisen koska tahansa uudelleen ja korjata huomaamatta jääneet asiat. Jos tallensit make xconfig-vaiheessa kernelisi konfiguraation jollakin nimellä, voit huoletta tehdä uuden käännöksen ajamalla ensin make mrproper-käskyn. Itse tekemäsi konfigurointitiedosto ei siis häviä! Mutta jos et tallentanut sitä erikseen jollakin nimellä, niin joudut käymään kaikki konfigurointivaiheet uudelleen läpi, jos joudut puhdistamaan lähdepaketin tiedot vanhan käännöksen jälkeen make mrproper. Yleensä kyllä pelkkä make clean riittää, jolloin konfigurointitiedosto (.config) säilyy.

Debianin oma konfigurointitiedosto sijaitsee /boot-hakemistossa ja on config-2.4.18-bf2.4 -niminen. Voit käyttää tätä pohjana kernelin käännössä, jos haluat säilyttää kernelin lähes alkuperäisenä ja muuttaa vain joitakin kohtia (suositeltavaa).

Jos et jostain syystä ole tyytyväinen uuteen kerneliisi, niin voit ottaa vanhan takaisin käyttöön koska tahansa tekemällä tarvittavat muutokset käynnistyslataajaan, jos olet jostain syystä halunnut kommentoida sen pois (muista ajaa lilo sen jälkeen!) tai käynnistämällä koneen aikaisemmin tekemälläsi buuttidisketillä.

Voit myös koska tahansa ajaa uudelleen ohjelman make xconfig tai make menuconfig. Kokeile molempia, niin näet, mitä eroja niissä on. Katso myös kuvaruutukaappaukset make xconfig ja make menuconfig. Tekemäsi muutokset tallentuvat muistiin konfigurointitiedostoon ja 'make clean' ei edes poista sitä, mutta muista, että 'make mrproper' poistaa. Mutta jos tallennat konfiguroinnin jollakin haluamallasi nimellä 'make xconfig'-vaiheessa, Store Configuration to a File, tiedosto ei katoa. Konfigurointi tallentuu kernelipaketin juureen, jos et määritä sille jotakin toista polkua.

Jos päätät tyytyä kuitenkin aikaisempiin asetuksiisi, niin voit lopettaa ohjelman ajamisen tallentamatta muutoksia. Voit myös tehdä muutoksia ja jättää itse kääntämisen tekemättä. Et vain mene eteenpäin ajamalla seuraavia komentoja make dep jne. ja homma on sillä selvä. Mitään tietoja ei katoa.

Kernelin kääntäminen on loppujen lopuksi hyvin yksinkertainen asia eikä vahingoita järjestelmääsi millään tavoin, kun vain pidät huolen siitä, että saat käynnistettyä koneen tarvittaessa vanhalla kernelillä. Vasta sitten, jos päätät poistaa vanhan kernelin, eikä uusi toimikaan jossain kohden kuten haluat (huomaat ongelman vasta myöhemmin), saatat olet vaikeuksissa! Mutta ainahan voi kääntää kernelin uudelleen... :)

Kun kaikki menee pieleen...

Jos kohdallasi on kaikki mahdollinen mennyt pieleen eikä uusi kerneli käynnisty ja käynnistysdisketti on jäänyt tekemättä tai ei toimi, niin peli ei ole siitäkään huolimatta menetetty!

Lähes kaikissa uusimmissa distroissa on jonkinlainen System Recovery -mahdollisuus käynnistämällä kone ensimmäiseltä käynnistys-CD:ltä. Näin esim. voidaan palauttaa entinen käynnistyslataaja, ks. malliksi mandrake92.htm#rescue.

Toinen mahdollisuus on käyttää Knoppix-CD:tä ja kirjautua konsolista pääkäyttäjäksi toiselle osiolle chroot-käskyllä ja tehdä sieltä tarvittavat huoltotoimenpiteet. Tällainen mahdollisuus Linuxeissa on erittäin tärkeä esim. silloin, kun Lilo tai Grub on sekaisin eikä buuttidiskettiä ole tehty.

knoppix@ttyp0[knoppix]$ su
root@ttyp0[knoppix]# mount /dev/hda1 /mnt/hda1
root@ttyp0[knoppix]# chroot /mnt/hda1
root@Knoppix:/#

Ensin vaihdetaan konsolissa rootiksi (su) ja sen jälkeen liitetään osio (huom. sekä /dev että /mnt ja haluttu osio), jonka jälkeen vaihdetaan liitetylle osiolle (chroot), ks. kuva chrootin käytöstä. Voit nyt siis tehdä osiolla kaikkea tarvittavaa pääkäyttäjänä aivan samoin kuin olisit kirjautunut sinne sisälle suoraan!

Myös IBM on huomannut Knoppixin mahdollisuudet, josta osoituksena on artikkeli IBM:n sivulla Knoppixin käyttämisestä pelastus-CD:nä: System recovery with Knoppix.

Lisätietoa

Lisätietoa kernelin kääntämisestä saat kernelipaketin mukana tulevasta README-tiedostosta sekä sfnet.atk.linux-FAQ ja Kernel-HOWTO -sivuilta. Jos koneessasi on vanha distro, niin lue kernelipaketin mukana tulevasta Changes-tiedostosta (Documentation alihakemistossa) tarvittavien ohjelmen minimivaatimukset. Tarkista erityisesti seuraavat ohjelmat (jos sinulla ei ole esim. pcmcia-laitteita, voit ohittaa sen kohdan jne.):

o  Gnu C             2.95.3       # gcc --version
o  Gnu make          3.77         # make --version
o  binutils          2.9.1.0.25   # ld -v
o  util-linux        2.10o        # fdformat --version
o  modutils          2.4.2        # insmod -V
o  e2fsprogs         1.25         # tune2fs
o  jfsutils          1.0.12       # fsck.jfs -V
o  reiserfsprogs     3.6.3        # reiserfsck -V 2>&1|grep reiserfsprogs
o  pcmcia-cs         3.1.21       # cardmgr -V
o  PPP               2.4.0        # pppd --version
o  isdn4k-utils      3.1pre1      # isdnctrl 2>&1|grep version

Jos haluat tutustua ennen kääntämistä kernelin konfigurointivaihtoehtoihin (esim. 'make xconfig'), lue muutokset kernelipaketin mukana tulevasta Configure.help-tiedostosta.

Hyvä sivusto kernelin kääntämisestä etenkin aloittelijoille on http://www.kernelnewbies.org/.

Debianin 'kernel-package' -systeemi

Debianissa voi kernelin kääntää hieman yksinkertaisemmallakin tavalla, mitä edellä esitin ja siitä mainitaan mm. sivulla sfnet.atk.linux-FAQ. Yksityiskohtainen käännösohje on sivulla Creating custom kernels with Debian's kernel-package system. Idea on siinä, että kernelistä voi tehdä .deb-paketin ja asentaa sen, jolloin kaikki tarvittava tulee tehtyä automaattisesti oikein. Kääntämisesssä tarvitaan make-kpkg -ohjelmaa, joka on osa kernel-package -pakettia. Asenna paketti Aptilla seuraavasti:

# apt-get install kernel-package

Debianissa kannattaa kuitenkin ennen kääntämistä katsoa apt-ohjelmalla, onko haluttu kernelipaketti saatavana valmiina, jolloin kääntämistä ei välttämättä tarvita. Luettelon paketeista saat apt-cache search kernel-image.

Vinkkinurkka

Kätevä apuväline tiedostojen kopiointiin, lähdekoodipaketin purkuun ym. on Midnight Commander, ja sen voi asentaa Debianissa käskyllä apt-get install mc. Ohjelma pyytää 1. CD:tä ja voit käynnistää ohjelman asennuksen jälkeen komennolla mc

Screenshots

make xconfig

Tutustu myös Configure.help-tiedostoon, niin voit jo etukäteen suunnitella ja kirjoittaa paperille ylös, minkä laitteiden tuen tarvitset uuteen kerneliisi!

make menuconfig

Kertausta

Kernelin kääntämisen vaiheet:

Jos käytit käskyä make install uuden kernelin asentamiseen, niin kernelin, System.mapin ja käynnistyslataajan konfigurointia ei tarvita, koska 'make install' tekee kaiken puolestasi (joten voit ohittaa ne kohdat ohjeiden lopussa). Samoin myös kerneliä vastaava initrd-tiedosto on tehty valmiiksi. Tarkista kuitenkin käynnistyslataajan tiedot ennen uudelleen käynnistämistä ja varmista, että saat Linuxin käynnistettyä tarvittaessa vanhalla kernelillä joko käynnistyslataajasta tai buuttidisketiltä.

Päivitetty viimeksi: 9.4.2004

Windowsista Linuxiin abc!