HTML

Bagoj úr blogja

Kíváncsi Bagoj befigyel a Linux belsejébe, illetve különféle Linux terjesztéseket próbál ki. Ha jó napja van, scriptet ír Neked.

Friss topikok

Kernel fordítás - rendszerbetöltő, egyebek

2008.04.07. 11:05 bagoj ur

Kernel fordítás sorozat: [1] [2] [3]
Mivel olyan csodálatosan zuhog az eső és nem tudok hazamenni, gyorsan kedvem lett folytatni a sorozatot... :-)

Münchausentől Linusig

Bemelegítésképpen akkor az initrd-ről: Ahogyan írtam az első részben, egy linux terjesztés nem tud felkészülni minden egyes igényre, minden típusú gépre amelyre valaha is fel fogják telepíteni. A kernelbe nem lehet mindent beszuszakolni, egyrészt mert nagy és lassú lenne, másrészt mert nem is fér bele minden. (Emlékszem, hogy régen a kernel nem lehetett egy bizonyos méretnél nagyobb; de arra nem emlékszem, mekkora volt az.) De ha például a SCSI támogatást modulba rakjuk, akkor a SCSI vinyóról nem tudja felolvasni a megfelelő modult, hiszen épp az a modul kellene hozzá. Viszont az sem járja, hogy minden SCSI kártya és chipset kódját a kernelbe fordítsuk... a saját hajunknál fogva kellene kirántani magunkat a mocsárból. Erre szolgál az initrd. Először betöltjük az initrd-t, amely áthidalja a problémát - ennek mérete nagyobb lehet, mint egy kernel; egy kis RAMdisk-nek kell elképzelni (mint ahogy az is), amelyen scriptek, szélsőséges esetben akár egy nagyon pici alaprendszer is lehet. Ez elvégzi a szükséges feladatokat (merevlemez init, ilyesmik), majd betölti a "rendes" kernelt.

Sokan azt mondják, ez az initrd az esetek nagy részében felesleges; kernelt kell fordítani és bele kell rakni a támogatandó meghajtókat. Ezt mondom én is: az Ubuntu gyári kernele természetesen initrd-s, mert fel kell készülnie mindenre; nade mi optimalizálunk, tehát initrd csak végső esetben kell.


Most pedig térjünk vissza a konfiguráláshoz...

Ha kész a konfiguráció


Ha készen vagyunk, akkor már csak a fordítás van hátra (lépjünk ki az <Exit> gombbal):

make && make modules_install
Ekkor elkezd dolgozni a fordító:


HOSTLD  scripts/kconfig/conf
scripts/kconfig/conf -s arch/x86/Kconfig
  CHK     include/linux/version.h
  UPD     include/linux/version.h
  CHK     include/linux/utsrelease.h
  UPD     include/linux/utsrelease.h
  SYMLINK include/asm -> include/asm-x86
  CC      arch/x86/kernel/asm-offsets.s
  GEN     include/asm-x86/asm-offsets.h
  CALL    scripts/checksyscalls.sh
  HOSTCC  scripts/genksyms/genksyms.o

Stb. stb. Ha nincs hibaüzenet, akkor az elkészült kernelünk a  arch/i386/boot/bzImage relatív útvonalon található. Ezt másoljuk a /boot alá:

cp arch/i386/boot/bzImage /boot/vmlinuz_2.6.24.3bagoj


Majd ezután szerkesszük a rendszerindító fájlt. Feltételezem (ahogy eddig is), hogy Ubuntu gyári rendszerrel, így a grub lemezbetöltővel van dolgunk. Szerkesszük meg ennek a menüjét!

Fontos megjegyzés: Ahhoz, hogy az Ubuntu automatikusan is le tudja generálni a menüt (ha gyári kernelt cserélünk), egy kicsit elbonyolították ezt a menü-fájlt. A lényeg, hogy a "BEGIN AUTOMAGIC KERNELS LIST" elé írjuk, amit írunk. Ez pedig nekem a következő:

# vi /boot/grub/menu.lst

title           Bagoj kernel 2.6.24.3
root            (hd0,0)
kernel          /boot/vmlinuz_2.6.24.3bagoj root=/dev/hda1 ro quiet splash resume=/dev/hda5
quiet


Ezt a kis menüt úgy hoztam össze, hogy lemásoltam az egyik már meglévő kernelét (a fájl végén található), és kicseréltem a szükséges részeket. Nyilván hagyjuk benne a régebbi kernel bejegyzéseket is! Ha valami nem jött össze, akkor azokat kiválasztva be tudjuk tölteni a régi állapotot (Grub visszaszámláláskor ESC, aztán ki kell választani a legutolsó régi kernelt; ez elméletben a második sor lesz ugyebár). Megjegyzés: A "kernel" szócska után először a kernel elérési útját írjuk be; a root= mögé a / partíciónkat. A "resume=/dev/hda5" a hibernálás miatt kell, nekem az a swap partícióm.


Azt mondtam korábban, hogy ezt az sda-hda váltást megoldjuk; de közben rájöttem hogy nem akar sikerülni a dolog. Úgy terveztem, hogy a partíció label-je alapján működni fog (azaz nem a konkrét eszköznevet, hanem a label-t adom meg itt), de szerintem vagy a régi IDE vezérlő kódja nem tart itt, vagy én szúrtam el valamit. Bocsika...

 

Kernelcsomag-gyártás

Ha jól tudom, van egy kernel-package nevű csomag, amelynek segítségével tudunk .deb csomagot készíteni a kernelünkből. Ez akkor jó, ha sok azonos gépet felügyelünk, ilyenkor egy .deb mégiscsak sokkal könnyebben teríthető...

Ekkor a kernel fordítást így végezzük:

apt-get install kernel-package
cd /usr/src/linux
make-kpkg clean
make menuconfig
make-kpkg --revision=2.6.24.20080407 kernel_image

...majd az elkészült .deb csomagot dpkg -i segítségével feltesszük.

Reboot!

Ezek után indítsuk újra a gépet! Ha megáll "Kernel panic" üzenettel és valami VFS-re panaszkodik, akkor három dolog lehet: Nincs meg a merevlemez-támogatás, nincs meg a fájlrendszer-támogatás és végül rossz paramétert adtunk meg a menu.lst-ben. Töltsük vissza a régi kernelt és foglalkozzunk még a témával egy kicsit.

Elképzelhető, hogy ez-az nem fog működni. Nekem például a hibernálás. Nem mintha létfontosságú volna, de mégis. Ezek kiderítése érdekfeszítő agymunka, ne adjátok fel! Én például ott kezdtem, hogy végigolvastam a kernel forrás alatti Documentation/power alatti részeket. :-)


Nézzük, most hány modulom fut:

root@metal:~# lsmod
Module                  Size  Used by
container               4864  0
iptable_filter          3072  0
ip_tables              13000  1 iptable_filter
x_tables               14852  1 ip_tables
sd_mod                 29456  0
lp                     11332  0
loop                   17412  0
usb_storage            72384  0
libusual               18336  1 usb_storage
pcmcia                 39444  0
video                  18960  0
serio_raw               7044  0
ac                      6148  0
thermal                15772  0
uhci_hcd               25484  0
via_agp                10240  1
parport_pc             35236  1
parport                35912  2 lp,parport_pc
via686a                14348  0
yenta_socket           26252  1
rsrc_nonstatic         11392  1 yenta_socket
usbcore               143596  4 usb_storage,libusual,uhci_hcd
evdev                  11776  0
pcspkr                  3072  0


A francba, ez még mindig sok. :-) A boot idő viszont 61%-a a korábbiaknak.

A továbbiakban, ha valakinek van hozzátennivalója, kérdése, azokat megpróbálom összeszedni és esetleg írok belőle még pár postot.

(folyt. köv?)

 

7 komment

Címkék: linux fordítás power boot kernel hibernálás

A bejegyzés trackback címe:

https://bagojur.blog.hu/api/trackback/id/tr53612279

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

bagoj.ur 2008.04.08. 13:52:17

Hozzátenném, hogy annak ellenére hogy megvártam míg eláll az eső, hazafelé a biciklin sikerült egy felhőszakadást kapni a nyakamba... :-)

mavo · http://mavo.blog.hu 2008.04.09. 21:15:30

Hozzátenném, én úgy szoktam, hogy a működő kernelt (jó, én lilót használok, maradi hülye), beteszem második, nem default menüpontnak, mondjuk original néven, és pl. vmlinuz-original néven hivatkozom rá, persze csak miután átmásoltam az aktuális vmlinuzt és System.map-ot ilyen néven. Kezdők egy reboot után tesztelhetik is, hogy az original megy-e.

Ha így csinálja az embör, akkor nem kell vacakolni a bzImage másolásával, egy make install a végére és kész. Csak pár karakterrel kevesebb, de lustaság fél egészség.

mavo · http://mavo.blog.hu 2008.06.05. 19:39:52

Jut eszembe, ha már:

make && make modules && make modules_install.

bagoj.ur 2008.06.09. 16:15:00

@mavo: Aha, meg &&reboot is... :-)

inci88 2009.11.06. 21:50:52

Hali!
Ebből a leírásból forgattam magamnak egy 2.6.30-os kernelt. (2.6.28 helyett), első indítás után, gnome -> terminal -> sudo 2 parancs és kifagyott. (akkor pont nem kapott semmi parancsot).
A következő indításnál már nem volt gond. Csak valami /lib/modules/2.6.30.9inci_1/modules.dep-et nem talált, nem ért el... pedig ott van létezik...

talán nem fog hiányozni. ami kellett (dvr) azt beforgattam kernelbe.

Köszönöm az írást, hasznos volt. :)

(írhattad volna úgy 4 évvel ezelőtt, akkor nem szívok a slackware kernelemmel. :D )

bagoj ur 2009.11.16. 09:43:04

@inci88: örülök, hoyg segíthettem, ajánlom ezt az újabb írást is: bagojur.blog.hu/2009/07/03/jaunty_vs_2_6_31_kernel

Tom Benko 2010.12.17. 22:50:13

Na, amíg kisfiam alszik, kipróbálom a kernelfordítást. Megint. A múltkor már próbálkoztam ugyanis, de kaptam a VFS mount üzenetet, és nem értettem, miért. Most megtudtam... :)