LILO (Linux Loader) ja Kernel

teejuht
 
 
1. Sissejuhatus
2. LILO, kernel ja source'id
3. Kerneli kompilleerimine
4. Kerneli konfigureerimine
5.
Moodulid
6. LILO (512 B) taas-kirjutamine
 

1. Sissejuhatus

LILO  (Linux Loader) asub ketta nullindat sektorit ehk boot sectorit (floppy puhul selline nimi) ehk MBR'i (master boot record - kõvaketta puhul) moodustavas 512 baidis (tegelikult võtab LILO enda alla esimesed 446 B ja 64 B on ketta partitsioonitabel) . Kui tegemist on kõvakettaga ja CMOS SETUP -is (see koht kuhu saab peale voolu sisselülitamist del-ga sisse) on paika pandud, et antud kettalt saab bootida siis toimub järgmine:

1. Masin loeb infot sellest nullindast sektorist (446 B, seda seal olevat infot nim. ka boot loaderiks) ja saab teada millise kõvaketta partitsiooni peal ja millisel füüsilisel asukohal on /boot/boot.b ja /boot/map failid.
2. Neist failidest saab ta omakorda teada kerneli ja bootimisel muude vajalike (nt. message faili)  füüsilise asukoha.

Selguse huvides ütleme, et cp käskuga ei saa ligi boot sectoris (so. 512 esimest B) infole. Küll aga võttega:

bash# dd if=/dev/fd0 of=/512B bs=512 count=1

(ketas võiks olla mountimata)

Ja, esimese 446 B 'ga tegeleb programm lilo, järgmise 64 B 'ga fdisk.

Ilma LILO'ta on keerulilne linuxit üles bootida. Nii, et teda on igal juhul vaja.

Kernel on üks fail mille suurus on ca 400 kB ja ta asub tavaliselt /vmlinuz -i nime all. Kernelisse on kontsentreeritud OS-i tuum, reeglid ja oskused ümberkäimiseks:

- mäluga
- võrgukaartidega
- kõvaketastega
- failisüsteemidega
- protsessoriga

Järgnevas vaatame kuidas ühele töötavale süsteemile teha ja kasutusele võtta uus kernel. Selguse ja lihtsuse huvides olgu tegemist ühe kõvaketta ja kahe partitsiooniga:

/dev/hda1 - swap
/dev/hda2 - root, seal on kataloog /boot ja kernel /vmlinuz

2. LILO, kernel ja source'id

Kui slackware installeerida, siis on tavaliselt distributsiooniga töötav kernel kaasa pandud (fail bare.i). Normaalne on seda vähemalt esimese kernelina kasutada. Peale linuxi installeerimist ja oma vajaduste üle mõtisklemist (modem, võrgukaart, failisüsteemid ...) tuleks kompilleerida enda vajadusi rahuldav kernel. Tavaliselt tuleb see väiksem ja väiksem on kiirem ja muidu hea meel, et ikka ise kompilleeritud! Kerneli kompilleerimiseks on vaja

- source't - see on distributisooni K - seeria või netist tõmmatud (ftp.kernel.org /... /kernel-2.0.35.bz2)
- kompillaatorit - D - seeria

LILO -ga on nii, et slackware installeerimise käigus pakutakse võimalust LILO peale panna (512 B mõttes). Seda võimalust tuleks kasutada. Samuti küsitakse kas LILO kui programm installeerida. Samuti võtta. Nii saab ise hiljem LILO parameetreid muuta.  LILO source't talaliselt distributisooniga kaasa ei ole. Et asi oleks selge:

- netist võib tõmmata LILO source ( tgz)
- source kompilleerimiseks on gcc (D - seeriast) vajalik ja tulemuseks on muude seas programmid lilo ja liloconfig
- programmiga liloconfig või muutes käsitsi faili /etc/lilo.conf saab muuta LILO (esimesse 512 B'i minevaid vääratusi)
- lilo käivitamine kirjutab lilo.conf failile vastavalt esimesed 512 B üle.

Niisiis, edasises eeldame, et teil on olemas programmid lilo ja liloconfig ja kerneli source lahtipakituna või nii nagu ta peale K seeria installimist on:

/usr/src/linux/Makefile, README, ...

3. Kerneli kompilleerimine

Failis README on sellest ka juttu, ma lihtsalt toon sellest olulisema siin ära.
 
 
1.  Teeme ära lingid uutele include failidele 
 - make sure your /usr/include/asm, /usr/include/linux, and /usr/include/scsi 
   directories are just symlinks to the kernel sources: 

                cd /usr/include 
                rm -rf asm linux scsi 
                ln -s /usr/src/linux/include/asm-i386 asm 
                ln -s /usr/src/linux/include/linux linux 
                ln -s /usr/src/linux/include/scsi scsi

mina tegin selle osa shell scriptiks /root/kernel.sh, mõnusam

2. koristame vanad objekti faiid ära (*.o) 
 - make sure you have no stale .o files and dependencies lying around: 

                cd /usr/src/linux 
                make mrproper

3. konfigureerime kerneli (vt. altpoolt)
cd /usr/src/linux 
make menuconfig või make config
4. make dep; make clean; make zImage 
tulemusena tekib fail 
/urs/src/linux/arch/i386/boot/zImage 
ja see ongi kernel
5. teeme ka moodulid (laetavad kerneli osad) 
esmalt liigutame vanad moodulid mujale nii, et kataloog
/lib/modules on tühi
6. cd /usr/src/linux 
make modules 
make modules_install 
mille tulemusena tekivad /lib/modules/2.0.xx alamkataloogid ja moodulid ise (ne.o, vfat.o jne)
7. kopeerime vana kerneli asemele uue (vana kuhugi ehk tagavaraks alles jättes)
8.  uuendame esimest 512 B -i andes käsu 
lilo 
õnnestumisel on teade 
Added linux *
 
 
4. Kerneli konfigureerimine (2.0.34 näitel)

Kui kernelit konfigureerida on ehk mõistlik valida make menuconfig, sest make config puhul ei saa ümber mõelda. Kernelite kohta on tehtud (muidu ka) kokkulepe, et kui teine arv on paaris on kernel nö. stabiilne (nt. 2.0.xx) ja kui paaritu (nt. 2.1.xx) siis on tegu development'iga.

märkused:

- osa feature'sid lähevad kernelisse (*) ja osa saab panna sisse või laadida moodulitena (M); osa saab kasutada ainult moodulitena
- kui menuconfig käivitada on ees ./usr/src/linux/.config failile vastavad vaikimisi valikud, neid tuleb natuke muuta
- menuconfig sektsioonidesse sisseliikumine käib reavahetusega
- valimine käib tühikuga
- Esc -ga sektsioonist väljumine
- ? - ga saab help'i iga asja kohta lugeda
- kõige lõpus tuleb ütelda et save configuration (mitte ilmtingimata faili)
 
Kõiki võimalikke kerneli juures määratavaid settinguid pole ehk siin mõtet tuua. Sest, kes asja veel ei jaga sel pole neist kõigist nii kui nii kasu; aga kes juba teab see saab ise hakkama. Asi suhtleb inglise keeles.

Niisiis, konfigureerimine tavalisi nõudeid rahuldava kerneli:

- oskab mountida CD-ROM'i ja msdos ja vfat failisüsteemiga partitsioone
- osakab modemiga ppp ühendust pidada
- on dummy net driver support, et ise oma masinas internet'ti mängida (teha ftp, telnet'i, webiserver'it)
 
 
code maturity level options [ ] Prompt for development and/or incomplete code/drivers
loadable modules support [*] Enable loadable module support
general setup [ ] Kernel math emulation  
[*] Networking support  
[ ] Limit memory to low 16MB  
[*] PCI bios support  
[*] System V IPC  
<*> Kernel support for a.out binaries  
<*> Kernel support for ELF binaries  
[*] Compile kernel as ELF - if your GCC is ELF-GCC
floppy, IDE and other block devices <*> Normal floppy disk support  
[*] Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support  
--- Please see Documentation/ide.txt for help/info on IDE drives  
[ ] Use old disk-only driver on primary interface  
[*] Include IDE/ATAPI CDROM support  
[ ] Include IDE/ATAPI TAPE support  
[ ] Include IDE/ATAPI FLOPPY support (new)  
[ ] SCSI emulation support  
[ ] Support removable IDE interfaces (PCMCIA)  
[*] CMD640 chipset bugfix/support  
[ ] CMD640 enhanced support  
[*] RZ1000 chipset bugfix/support  
[*] Intel 82371 PIIX (Triton I/II) DMA support  
[ ] Other IDE chipset support  
--- Additional Block Devices  
< > Loopback device support  
[ ] Multiple devices driver support  
< > RAM disk support  
< > XT harddisk support 
networking options [*] TCP/IP networking  
[*] IP: Drop source routed frames  
[*] IP: Allow large windows (not recommended if <16Mb of memory)
network device support [*] Network device support  
<M> Dummy net driver support  
<M> PPP (point-to-point) support
filesystems [*] /proc filesystem support  
<M> VFAT (Windows-95) fs support  
<*> Second extended fs support  
< > xiafs filesystem support  
<M> Native language support (Unicode, codepages)  
<M> ISO9660 cdrom filesystem support  
<M> DOS FAT fs support  
<M> MSDOS fs support
character devices <*> Standard/generic serial support 
 
Võib tähele panna, et SCSI ja Soundi sektsioonides pole siin õhkagi, neid ei maksa esialgu puutuda ja kui vastavaid seadmeid ka pole seda enam. Minul näiteks ei ole. Niisiis, mida siin pole pole enable'tud.
 

5. Moodulid

Moodulid on kerneli osad ja need saab sisse laadida ja maha laadida. Nad asuvad kataloogis /lib/modules/3.0.34. Moodulite laadimine toimub ` masina bootimisel:

/etc/rc.d/rc.S

if [ -x /etc/rc.d/rc.modules ]; then
  . /etc/rc.d/rc.modules
fi
insmod vfat
/sbin/mount -avt nonfs

Pange tähele, et rc.modules loeb sisse osa mooduleid aga mooduleid saab sisse ka käsuga insmod vfat. Failisüsteemi moodulid on vaja enne sisse viia kui failisüsteeme mountida: mount -avt nonfs - mountida kõik peale NFS -de (Network FIle System)

failis /etc/rc.d/rc.modules on nt. sellised olulised read:

# Update module dependencies:
echo "Updating module dependencies for Linux `uname -r`:"
/sbin/depmod -a

/sbin/modprobe ppp
/sbin/modprobe ne io=0x300
# Binary format/filesystem support.
#/sbin/modprobe binfmt_elf
#/sbin/modprobe ext
#/sbin/modprobe ext2
#/sbin/modprobe hpfs
/sbin/modprobe isofs
#/sbin/modprobe minix
/sbin/modprobe msdos
/sbin/modprobe nfs
/sbin/modprobe smbfs
#/sbin/modprobe sysv
#/sbin/modprobe umsdos
#/sbin/modprobe xiafs

moodulitega telelevad programmid:
 
lsmod näitab mis moodulid on sisse loetud (kui asi on kernelisse sisse kompileeritud kuigi võik olla moodul siis seda ei näidata.
insmod sisestab mooduli
modprobe sisestab mooduli ja sellele moodulile tööks vajalikud muud moodulid
rmmod laeb mooduli maha
depmod valmistab ette info modprobe jaoks (käivitada enne modprobe kasutamist)
 
Niisiis, moodulite laadimisel on mõnel juhul oluline järjekord ja kuigi neid võib laadida/maha laadida ka peale bootimist (selleks nad ju ongi mõeldud :). Aga on ebanormaalne, kui oleme vfat failisüsteemi külge mountinud ja enne selle mahamountimist laeme maha vfat mooduli.

6. LILO (512 B) taas-kirjutamine

Nüüd on loodetavasti uus kernel valimis ja kohal ning viimane asi on lilo üle lasta. Toimingu mõte on

- 446 B kõvaketta algusest üle kirjutada
- luua uued failid kataloogi /boot

Meenutan, et antud juhu oli kõvaketta peal kaks partistsiooni:

/dev/hda1 - swap
/dev/hda2 - root st. see kus on kernel vmlinuz

sellele olukorrale vastav /etc/lilo.conf võiks olla selline:

# LILO configuration file
# generated by 'liloconfig'
#
# Start LILO global section
boot = /dev/hda2
#compact        # faster, but won't work on all systems.
# delay = 5
vga = normal    # force sane state
# ramdisk = 0     # paranoia setting
# End LILO global section
# Linux bootable partition config begins
image = /vmlinuz
  root = /dev/hda2
  label = linux
  read-only # Non-UMSDOS filesystems should be mounted read-only for checking
# Linux bootable partition config ends

Tõsi, siin on küll kommentaare rohkem kui asja ennast, kuid selliseid faile see liloconfig genereerib :)

ja nüüd anda käsk:

bash# lilo
Added linux *
bash#

siis peaks asi valmis olema.

Ja kui nüüd läks kõik hästi, siis uuel boodil tuleb asi üles ilma veateadete ja olululiste featuredega :) Esimene kerneli kompilleerimine õnnestub aga vähestel: Oskar Luts, Napoleon, Leonid Kutzma ...