Next Previous Contents

7. Nekatere pasti

7.1 make clean

Če po rutinski nadgradnji jedra vaše jedro počne zares čudne reči, ste morda pozabili napisati make clean pred prevajanjem novega jedra. Simptomi so lahko karkoli, od zmrznjenega sistema, čudnih V/I problemov, do slabega (počasnega) delovanja. Prepričajte se tudi, da boste ukazali make dep.

7.2 Velika ali počasna jedra

Če vaše jedro požira velike količine pomnilnika, je preveliko, in/ali le traja neskončno dolgo, da se prevede, čeprav imate nov procesor 786DX6/440, ste najverjetneje vključili podporo veliko nepotrebnih zadev (gonilnikov naprav, datotečnih sistemov, itd.). Če naprave ne uporabljate, je ne podprite v jedru, saj to zavzema pomnilnik. Najbolj očiten simptom prenapihnjenega jedra je ekstremno izmenjavanje pomnilnika z diskom sem ter tja; če vaš disk nenehno oglaša in ni eden od tistih starih Fujitsujevih Eagles, katerih zvok lahko primerjamo s pristajanjem reaktivnih letal, preglejte nastavitve vašega jedra.

Koliko pomnilnika zaseda jedro lahko izveste z odštevanjem vrednosti ,,total mem`` v izpisu /proc/meminfo ali izhodom ukaza ,,free``, od količine vsega pomnilnika. Pogledate lahko tudi izpis ,,dmesg`` (ali pogledate v jedrov dnevnik, kar pač imate na sistemu). Tam bo vrstica, ki bo izgledala takole:

Memory: 15124k/16384k available (552k kernel code, 384k reserved, 324k data) 

Jedro torej zavzema 552 KB. Moja 386 (ki ima nastavljenih malo manj smeti) pravi takole:

Memory: 7000k/8192k available (496k kernel code, 384k reserved, 312k data) 

Če ,,preprosto morate`` imeti veliko jedro, a vam sistem tega ne pusti, lahko poskusite ,,make bzimage``. Morda boste morali namestiti novo različico programa LILO.

7.3 Jedro se ne prevede

Če se ne prevede, je to verjetno zato, ker je popravek spodletel, ali je vaša izvorna koda nekako pokvarjena. Morda nimate prave verzije prevajalnika gcc, ali je tudi z njim kaj narobe (na primer, vključne datoteke so lahko napačne). Prepričajte se, da so simbolične povezave, ki jih Linus priporoča v datoteki README pravilno narejene. V splošnem, če se standardna jedra ne prevajajo, je nekaj resno narobe s sistemom in ponovna inštalacija nekaterih orodij je neizogibna.

Morda pa prevajate jedro verzije 1.2.x s prevajalnikom ELF (gcc 2.6.3 ali višji). Če dobivate med prevajanjem veliko sporočil ,,so-and-so undefined``, je verjetno to pravi problem. V večini primerov je popravek zelo preprost. Dodajte te vrstice na vrh datoteke arch/i386/Makefile:

AS=/usr/i486-linuxaout/bin/as  
LD=/usr/i486-linuxaout/bin/ld -m i386linux 
CC=gcc -b i486-linuxaout -D__KERNEL__ -I$(TOPDIR)/include

Potem spet ukažite izdelavo make dep in zImage.

V redkih primerih lahko gcc odpove zaradi strojnih problemov. Sporočila o takšnih napakah so nekaj kot ,,xxx exited with signal 15`` in navadno izgledajo zelo skrivnostna. Tega sploh ne bi omenil, a se mi je nekoč zgodilo -- imel sem nekaj slabega predpomnilnika in prevajalnik se je pritoževal povsem naključno. Če imate težave, poskusite najprej ponovno namestiti gcc. Sumničavi postanite samo, če se vaše jedro lepo prevede z izključenim zunanjim predpomnilnikom, zmanjšano količino RAM-a, ipd.

Ljudje so navadno vznemirjeni, ko zvejo, da bi lahko imeli tudi težave s strojno opremo. Hja, jaz si tega ne izmišljujem. Obstajajo tudi pogosto zastavljena vprašanja o tej temi -- najdete jih na http://www.bitwizard.nl/sig11/.

7.4 Novo jedro se noče zagnati

Niste pognali programa LILO, ali pa ga niste pravilno nastavili. Nekoč me je zafrkavala vrstica v LILO-vi konfiguracijski datoteki, ki je bila ,,boot = /dev/hda1`` namesto ,,boot = /dev/hda``. (To je lahko sprva zelo moteče, a ko imate enkrat delujočo nastavitveno datoteko, vam je ni treba spreminjati.)

7.5 Pozabili ste pognati LILO, ali pa se sistem sploh ne zažene

Ups! Najboljše, kar lahko storite ta hip, je, da zaženete operacijski sistem z diskete in potem pripravite še eno zaganjalno disketo (kot bi jo naredil ukaz ,,make zdisk``). Vedeti morate, kje je vaš korenski (/) datotečni sistem in katerega tipa je (npr. second extended, minix). V spodnjem primeru morate vedeti tudi na kakšnem datotečnem sistemu leži vaše drevo izvorne kode /usr/src/linux, njegov tip, in kje je navadno nameščen (z mount).

V naslednjem primeru je / enak /dev/hda1, in datotečni sistem, ki vsebuje /usr/src/linux na /dev/hda3, navadno nameščen na /usr. Oba sta datotečna sistema tipa ext2 (second extended). Delujoča slika jedra v imeniku /usr/src/linux/arch/i386/boot se imenuje zImage.

Zamisel je takšna, da uporabimo delujoče jedro zImage na novi disketi. Še ena možnost, ki lahko deluje bolje, ali pa tudi ne (odvisno od konkretne metode, s katero ste zavozili svoj sistem), je opisana po tem primeru.

Najprej zaženite sistem s kombinacije disket boot in root ali z reševalne diskete in namestite delujočo sliko jedra:

# mkdir /mnt
# mount -t ext2 /dev/hda3 /mnt 

Če vam mkdir pravi, da imenik že obstaja, ga ignorirajte. Zdaj pojdite z ukazom cd na imenik, v katerem je delujoče jedro. Pozorni bodite na to, da je

/mnt + /usr/src/linux/arch/i386/boot - /usr = /mnt/src/linux/arch/i386/boot

V disketni pogon ,,A:`` vložite formatirano disketo (ne vaših diskov boot ali root!), prepišite sliko jedra na disketo in jo nastavite za svoj korenski datotečni sistem.

# cd /mnt/src/linux/arch/i386/boot  
# dd if=zImage of=/dev/fd0 
# rdev /dev/fd0 /dev/hda1 

Naredite cd na / in odmestite običajni datotečni sistem /usr:

# cd /
# umount /mnt

Zdaj lahko še enkrat zaženete svoj sistem z nove diskete. Ne pozabite tokrat po zagonu pognati lilo (ali karkoli je bilo že narobe)!

Kot smo omenili zgoraj, obstaja še ena običajna pot. Če imate delujočo sliko jedra v / (/vmlinuz, na primer), jo lahko uporabite za zagonsko disketo. Če veljajo vsi zgoraj našteti pogoji in je slika jedra /vmlinuz, naredite le te spremembe v zgoraj opisanem primeru: spremenite /dev/hda3 v /dev/hda1 (datotečni sistem / ), /mnt/src/linux v /mnt, in if=zImage v if=vmlinuz. Opombo o tem, kako dobimo /mnt/src/linux lahko spregledate.

Uporaba programa LILO na velikih diskih (večjih od 1024 cilindrov) lahko povzroča probleme. Preberite LILO mini-HOWTO ali LILO-vo dokumentacijo, če potrebujete pomoč pri tem.

7.6 Izpiše ,,warning: bdflush not running``

To je lahko resen problem. Od jedra izdaje po 1.0 (okoli 20. aprila 1994) se je program ,,update``, ki periodično izplakne vmesni pomnilnik datotečnega sistema, posodabljal in nadomestil. Dobite izvorno kodo ,,bdflush`` (najdete jo tam, kjer ste našli jedro) in namestite ta program (verjetno boste medtem pognati vaš sistem pod starim jedrom). Ta program se sam namesti kot ,,update`` in po ponovnem zagonu se novo jedro ne bo več pritoževalo.

7.7 Izpisuje stvari o nedefiniranih simbolih in se noče prevesti

Verjetno imate prevajalnik za ELF (gcc 2.6.3 ali poznejši) in izvorno kodo jedra 1.2.x (ali še starejšo). Navadno zadostuje dodati te tri vrstice na vrh vaše datoteke arch/i386/Makefile:

AS=/usr/i486-linuxaout/bin/as  
LD=/usr/i486-linuxaout/bin/ld -m i386linux 
CC=gcc -b i486-linuxaout -D__KERNEL__ -I$(TOPDIR)/include 

To bo prevedlo jedro 1.2.x s knjižnicami tipa a.out.

7.8 Mojega CD-ROM-a IDE/ATAPI ne prepričam, da bi deloval

Čudno, a veliko ljudi ne more pripraviti svoje pogone ATAPI k delovanju, verjetno zato, ker gre lahko veliko stvari narobe.

Če je vaš CD-ROM edina naprava na konkretnem vmesniku IDE, morate nastaviti skakače kot ,,master`` ali ,,single``. To je menda najbolj pogosta napaka.

Creative Labs (na primer) je postavil vmesnik IDE na njihove zvočne kartice. A to vodi k zanimivem problemu, da imajo nekateri ljudje en sam vmesnik, veliko jih ima dva vmesnika IDE na njihovih matičnih ploščah (navadno na IRQ15), torej je splošna praksa označiti vmesnik SoundBlaster-ja kot tretji IDE port (IRQ11, mi pravijo).

To povzroča probleme z Linuxom, saj verzije 1.2.x ne podpirajo tretjega vmesnika IDE (obstaja podpora v serijah 1.3.x, a to je razvojna verzija, se še spomnite, in ne izvaja avtomatskega iskanja). Temu se lahko izognemo na več načinov.

Če že imate drugi port IDE, ga morda ne uporabljate ali še nima na sebi dveh naprav. Vzemite pogon ATAPI z zvočne kartice in ga povežite na drugi vmesnik. Potem lahko onemogočite vmesnik zvočne kartice, kar tako ali tako privarčuje IRQ.

Če nimate drugega vmesnika, nastavite skakač na vmesniku zvočne kartice (ne na zvočnem delu zvočne kartice) kot IRQ15, drugi vmesnik. Moralo bi delovati.

Če mora biti iz nekega vzroka brezpogojno ravno na ,,tretjem`` vmesniku, ali, če so prisotne še druge težave, nabavite jedro 1.3.x (1.3.57, na primer, to podpira), in preberite datoteko drivers/block/README.ide. Tam je precej informacij.

7.9 Izpisuje čudne reči o zastarelih zahtevah za usmerjanje (obsolete routing requests)

Poiščite novo verzijo programa route in vseh drugih usmerjevalnih programov. Datoteka /usr/include/linux/route.h (ki je pravzaprav v imeniku /usr/src/linux) se je spremenila.

7.10 Požarni zid ne deluje v 1.2.0

Nadgradite vsaj na verzijo 1.2.1.

7.11 ,,Not a compressed kernel Image file`` (datoteka s sliko jedra ni komprimirana)

Ne uporabljajte datoteke vmlinux, ki je narejena v imeniku /usr/src/linux, kot vašo zaganjalno sliko; [..]/arch/i386/boot/zImage je prava datoteka.

7.12 Težave z zaslonskim terminalom po nadgradnji na 1.3.x

Spremenite besedo dumb v linux v opisu zaslonskega terminala v datoteki /etc/termcap. Morda boste morali tudi narediti nov zapis.

7.13 Po nadgradnji jedra ne morem prevajati zadev

Linuxova izvorna koda jedra vsebuje veliko vključnih datotek (datoteke, ki se končujejo na .h), na katere se sklicujejo standardne datoteke v imeniku /usr/include. Na njih se navadno sklicujemo takole (tukaj je xyzzy.h nekaj v imeniku /usr/include/linux):

#include <linux/xyzzy.h>

Navadno je v imeniku /usr/include povezava, imenovana linux, na imenik include/linux vaše izvorne kode jedra (/usr/src/linux/include/linux v tipičnem sistemu). Če te povezave ni tam, ali kaže na napačen kraj, se večina stvari sploh ne bo prevedla. Če ste se odločili, da porablja izvorna koda jedra preveč prostora na disku in ste jo pobrisali, je očitno to problem. Lahko pa, da je kaj narobe z dovoljenji datotek; če ima vaš root nastavitev umask, ki ne dovoljuje drugim uporabnikom, da bi kot privzeto lahko gledali njegove datoteke, in ste izluščili izvorno kodo jedra brez izbire p (ohrani datotečne načine), ti uporabniki ne bodo mogli uporabljati prevajalnika za C. Čeprav lahko uporabite ukaz chmod in to popravite, je verjetno lažje še enkrat izvleči vključne datoteke. To lahko storite enako kot ste storili na začetku z vso izvorno kodo, le z dodatnim argumentom:

# tar zxvpf linux.x.y.z.tar.gz linux/include

Opomba: ,,make config`` bo naredil povezavo /usr/src/linux, če je še nimate.

7.14 Povečanje omejitev

Naslednji primer ukazov je lahko koristen za tiste, ki se sprašujete, kako povečati nekatere mehke omejitve, ki jih privzame jedro:

# echo 4096 > /proc/sys/kernel/file-max
# echo 12288 > /proc/sys/kernel/inode-max
# echo 300 400 500 > /proc/sys/vm/freepages

Next Previous Contents