kernel fordítás, boot halál fekete képernyővel
Majd 15 éve használok Unix/Linux variánsokat. Mindíg is saját kernelt használtam, nem csak a stabilakat de az -rc -ket is.
Viszont egy jó ideje nem tudok működő kernelt fordítani. Legutolsó ami a mai napig biztosan működik, az a 2.6.30-rc2. Azóta az összes -rc és stabil kernelt próbáltam életre kelteni valahogy így:
Adott patch letölt, előző kernel könyvtár törlése. Kernel kitömörítése, patch bele. 2.6.30-rc2 konfigurációjának bemásolása .config -ként majd make oldconfig. Esetlegesen felmerülő kérdésekre értelemszerűen válaszolok. make && make modules_install install . Beállítom a grub-ben majd boot.
Eredmény: fekete képernyő a grub után és sokszor lefagy vagy csak ctrl+alt+del -re reagál. Van amikor sípolás van fekete képernyővel. Legvizuálisabb amikor simán újraindul rögtön a grub után a kernel betöltése helyett. Elég ritkán simán CRC hibát ír és azt hogy a rendszer halt állapotba került.
Amiket próbáltam: make allnoconfig, majd egyesével engedélyezni azokat a részeket amelyek szükségesek. Egyszer eljutottam odáig (folyamatosan engedélyezve a plusz lehetőségeket) 2.6.30(.1?)-al hogy ment a boot, volt hang, ment a hálózat és ment az Xorg-is. Sőt, hozzá tudtam adni a VirtualBox 3.0 kernel driver-eket és ment is a VirtualBox. Egy gond volt vele, nem volt hang a virtuális gépben. Engedélyeztem az ALSA OSS emulációját, majd reboot. Innentől megint halál, fekete képernyő. Időnként mentegettem a működő .config-ot, de valamit rosszul csinálhattam vagy nem tudom mi történt, de már azzal újrafordítva sem boot-ol.
Ami számíthat: Asus P5B alaplap, Core2Duo proci és 6 Gb RAM van a gépemben kétfejes ATI grafikus kártyával. 64 bites Debian testing/sid a rendszer, naprakészen tartva. A root FS az JFS.
Bármilyen ötletet szivesen veszek. Sajnos próbáltam Debian kernel-eket is, azok sem boot-olnak.
Egyszer úgy volt hogy meg kell néznem működik-e egy SB Audigy hangkártya. Ehhez visszaálltam 2.6.30-rc2 forrásra, bemásoltam a futó konfigurációt és csak az Audigy-t fordítottam pluszban bele. Tanulva az előzőekből extra névnek hozzátettem a -audigy jelzőt. Boot -> kernel halál. Innentől gyanakszom az új gcc-kre, libc6-ra, bármire ami userland. Hardware változtatás ugyanis nem volt. Egy szálon fordítok, régebben néha két szálon ment és akkor sem volt gond. Jó ideje már frissítettem BIOS-t, azaz nem az eredeti van az alaplapon (de hivatalos) és hosszú ideje semmi gondom nem volt vele. Most sem hiszem hogy az lenne a gond.
Hogyan tudnék ilyen problémát debug-olni? Ami eszembe jutott hogy felteszek egy stable chroot-ot és abban fordítok kernelt. Hazamegyek, ki is próbálom. Ha az abban fordított kernel sem működik, akkor végképp nem lesz ötletem mit csináljak. :-|
Olvastam valami JFS bugról, amely akadályozta a kernel helyes betöltését, de azt javították, nemde?
Ha memória hiba lenne, akkor a régi kernel sem boot-olna szerintem, valamint egyszer nem sikerült volna többszöri fordítással és többszöri boot-tal felépíteni egy egyre funkcionálisabb kernelt.
Update #1:
Régi saját fordítású kernelek akkor is boot-olnak, ha a modul könyvtárakat előzőleg leszedtem alóluk. Régi Debian kernelek közül egy ad crc error - System halted üzenetet, többi boot-ol.
Régi saját kernelek a következő üzenettel kezdenek (régen is így volt és sokáig működtek):
Decompressing Linux... Parsing ELF... done.
Booting the kernel.
[ 0.236787] PCI: BIOS Bug: MCFG area at e0000000 is not E820-reserved
[ 0.236816] PCI: Not using MMCONFIG.
Loading, please wait...
[ 1.144098] hub 4-0:1.0: unable to enumerate USB device on port 2
INIT: version 2.86 booting
[...]
Amely kernelek reset-elnek, azoknál a
Decompressing Linux...
villan fel közvetlen a reset előtt.
HW hiba szerintem kicsukva, gép napi 24 órában simán megy. Kb hat Firefox ablak ötven füllel + virtualizált OS + dnetc mindkét processzormagon + torrent miatt ami a hálózaton kifér három HDD-ről gyönyörűen megy. Memtest-et futtattam, 6 Gb-al elég lassan megy, de 37%-ig lefuttatva az összes tesztet egyetlen hibát sem kaptam.
Működő kernel újrafordítása ugyanazzal a konfigurációval (csupán kapott egy -retry verziónév toldást) fekete képernyőt ad. Ugyan nem fagy le (ctrl+alt+del -re újraindul), de a fekete képernyőn túl más nincsen.
Kérdés, mit jelent a parsing ELF közvetlenül a kernel betöltése után? Az a binárisok felépítése és azt leszámítva hogy a kernel tudja őket kezelni még nem tudom mit keres ott amikor még a root FS sincs csatolva?
Update #2:
Csomagfrissítés volt ismét. Rohanvást voltam, de mintha gcc is benne lett volna.
Letöltöttem a legújabb Karmic napi live CD-t, szépen boot-olt 2.6.31-3 csomagverziójú kernellel. Felmount-oltam a Debian partíciómat és lefordítottam az azon lévő 2.6.30.1-es kernelt a korábban mentett és működő konfigurációval. Ezzel ismét boot-ol a gép és a már futó rendszer alatt fordítottam VirtualBox 3.0.2 kernel modulokat. Azokat hiba nélkül betöltötte és működik is a virtualizáció. Ugyanaz az egy gond van vele mint előzőleg. Mivel kihagytam az ALSA OSS emulációját a kernel-ből, a virtualizált OS alatt nincs hang.
Ebből én azt a következtetést vonom le hogy a Debian gcc-je az ami nem bír a kernellel (vagy megint szerencsém lett volna?). Távoli ismeretségem van Martin Michlmayr GCC teszterrel (fejlesztővel?), majd megpróbálom izolálni a problémát a segítségével.
Update #3:
Ubuntu alatt bekapcsoltam még az ALSA OSS emulációját plusz egy-két kimarad USB-s opciót. Továbbra is boot-ol. Elkapott a kisértés, lefordítottam Debian alatt, most ott is boot-ol. Meglehet hrgy84 soraiban van némi igazság, vagy mégis az a bug, amiért kiadták a 2.6.30.2-őt:
commit d7de59fb74b6e9b94af8b9fcbfdf39eeae3b27be
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date: Sun Jul 12 11:25:04 2009 -0700
Don't use '-fwrapv' compiler option: it's buggy in gcc-4.1.x
commit a137802ee839ace40079bebde24cfb416f73208a upstream.
This causes kernel images that don't run init to completion with certain
broken gcc versions.
This fixes kernel bugzilla entry:
http://bugzilla.kernel.org/show_bug.cgi?id=13012
I suspect the gcc problem is this:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28230
Fix the problem by using the -fno-strict-overflow flag instead, which
not only does not exist in the known-to-be-broken versions of gcc (it
was introduced later than fwrapv), but seems to be much less disturbing
to gcc too: the difference in the generated code by -fno-strict-overflow
are smaller (compared to using neither flag) than when using -fwrapv.
Forrás.
Fordítottam 2.6.30.2-őt az előző konfiguráció alapján, szépen boot-ol és működik.
- Tovább (kernel fordítás, boot halál fekete képernyővel)
- 2964 megtekintés