Kernel

Z Wiki UnArt Slavičín
Skočit na navigaciSkočit na vyhledávání

Kompilace

Nainstalujeme potřebné balíky.

apt-get install kernel-package ncurses-dev fakeroot wget bzip2

Stáhneme si potřebnou verzi kernelu ze stránek http://www.kernel.org/pub/linux/kernel/v2.6/.

cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.tar.gz

nebo

wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.tar.bz2

a rozbalíme

tar zxvf linux-2.6.30.tar.gz

nebo

tar xjf linux-2.6.30.tar.bz2

Přejdeme do složky

cd linux-2.6.30


Pod debianem zkompilujeme kernel následujícím způsobem.


Nakonfigurujeme kernel pomocí

make menuconfig

nebo použijeme nastavení aktuálního kernelu

make oldconfig

No a přeložíme kernel. Vznikne nám deb balíček a ten jednoduče nainstalujeme pomocí dpkg -i

make-kpkg clean
fakeroot make-kpkg --revision=kernel-dvb kernel_image

Kompilace modulů

Pokud je potřeba do stávajícího kernelu přeložit pouze nějaký novější modul, není potřeba překládat celý kernel - stačí mít jen správný balíček kernel-headers-x-y a správné symlink-y v /usr/src.

Nejjednoduší je ovšem použít module-assistant:

apt-get install module-assistant
m-a update
m-a prepare

Příkaz m-a umí stáhnout deb balíček se zdrojákem modulu přímo z repozitáře debianu, přeložit ho a nainstalovat, např.:

m-a a-i ndiswrapper

Pokud ale chceme modul, který debian v repozitáři nemá - např. poslední verzi driveru ath5k nebo e1000, pak role m-a končí příkazem "m-a prepare". Následuje běžné stažení a pak kompilace a instalace modulu přes "make install".

Problém s initrd

Po instalaci takto zkompilovaného modulu můžete narazit na tento fenomén:

  • nový modul je instalován v /lib/modules/{verze kernelu}/x/y/neco.ko
  • modinfo /lib/modules/{verze kernelu}/x/y/neco.ko píše správnou verzi

ale po rebootu se natáhne stará verze modulu, která přitom na disku už nikde není. Odkud se tedy tahá?

Pravděpodobně z initrd, kde jsou moduly natahované při boot-u kernelu. Ty už totiž v paměti zůstávají po celou dobu běhu Linux-u až do příštího reboot-u.

Co s tím? Buď po rebootu uděláte rmmod a modprobe, nebo musíte nový modul doinstalovat i do souboru initrd a to buď pomocí příkazu:

mkinitrd

nebo pokud se chcete podívat, co to vlastně ten initrd je, zkuste si toto cvičení:

$ mkdir initrd
$ cd initrd
$ gzip -dc /boot/initrd-2.6.16-026test014.4-smp | cpio -id

Tento příkaz vám vytvoří adresář initrd a v něm následující adresářovou strukturu:

bin
dev
etc
init
initrd-2.6.16-026test014.4-smp.cpio
lib
loopfs
proc
sbin
sys
sysroot

Na správné místo do adresáře lib nahrajte svůj nový modul (soubor.ko) a pak udělejte:

$ find ./ | cpio -H newc -o > new-initrd.cpio
$ gzip new-initrd.cpio
$ mv new-initrd.cpio.gz /boot/initrd-2.6.16-026test014.4-smp

A to je vše.

Problémy

Překlad vlastního linux kernelu je vždy porod - s novými verzemi přichází stále nová překvapení.

Momentálně zápasím s Romanovým 2.6.21.7-smp-xeon, který ve VmWare jede, ale při bootu se objeví tato chybová hláška: