Kernel: Porovnání verzí
Bez shrnutí editace |
|||
(Není zobrazena jedna mezilehlá verze od stejného uživatele.) | |||
Řádek 37: | Řádek 37: | ||
make-kpkg clean | make-kpkg clean | ||
fakeroot make-kpkg --revision=kernel-dvb kernel_image | 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= | =Problémy= |
Aktuální verze z 26. 7. 2010, 16:35
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: