Kernel
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: