Č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
.
Č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.
Č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/
.
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.)
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.
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.
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.
Č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.
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.
Nadgradite vsaj na verzijo 1.2.1.
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.
Spremenite besedo dumb
v linux
v opisu zaslonskega terminala v datoteki
/etc/termcap
. Morda boste morali tudi narediti nov zapis.
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.
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