Boot ja root disk'i valmistamine

teejuht
 
1.
Sissejuhatus
2.
Boot ketas
3.
Root ketas

1. Sissejuhatus

Minul isiklikult oli nende kahe kettaga väga ebameeldiv esimene kogemus 1997. aasta sügisel. Ja see oleks võinud saada ka saatuslikuks. Või tegelikult saatuslikuks ta sai nii ehk nii. Nimelt, ei olnud asi ei minus aga arvutis, vaid selles, et bootdisk oli vigane :(

Aga asja juurde. Linux'i installeerimisel või kui süsteem mingil põhjusel ise HDD'lt ei boodi on vaja kasutada nn. boot ketast. Või boot ja root ketast.

Võimalik et sama ketta peal on nii boot kui root mõlemad. Minu jutt algab kirjeldusega kuidas teha neid erinevatele ketastele. Ning ilma LILO'ta (st. ei saa anda nn. boottime parameetreid).

Ilma pikema seletuseta nimetame, et

boot ketas on tegelikult kernel, mis peale arvutisse voolu sisselülitamist mällu loetakse. See kernel on natuke spetsiifiline ja sellepärast, võimalik, et tuleb ta kompilleerida ning ei saa kasutada olemasolevat. Aga ka olemasolev kõlbab mõnel puhul. Kernel sisaldab endas põhilist teavet arvuti funktsioneerimise ja seadmetega suhtlemise kohta. Ilma kernelita pole OS'i.

root kettal on tegelikult linux'i vähendatud kuid funktsionaalne failisüsteem mille järgi arvuti küsib peale seda kui ta on boot kettaga ära tegelenud. Meie kernel peab olema nii, tark, et ta peab oskama küsida root ketta järgi ja seejärel ta mällu lahti pakkima. Tulemusena tekib mällu nö. RAM (Random Access Memory) disk millel on root failisüsteem (st. juurikas mis harilikult asub kõvakettal).
Ilma root failisüsteemia pole OS'i.

Ja tulemusena on meil olemas piiratud võimalustega kuid põhimõteliselt funktsionaalne süteem olemas. Mis teeb asja eriti huvitavaks on see, et kui tehes ise boot ja root ketta, siis saab sinna peale panna just neid rakendusi mida te oluliseks peate. Tõsi, 1,44 MB piirab, aga ikkagi.

Ja asjaolu mis mulle eriti sümpatiseerib on see, et komplekteerides ise need kettad saab toreda kogemuse ja sügavama arusaamise süsteemi kui terviku struktuurist (a la aga mille jaoks on vaja '/sbin/init' programmi)
 

ILMA LILO'ta

2. Boot ketas

Sellel kettal pole failisüsteemi, data on nö. toorelt peal alatest ketta päris algusest st. esimesest sektorist. Ja see data pole midagi muud kui kompressitud kernel (ma ei teagi kas on olemas ja saab kasutada mittekompressitud kernelit) - zImage ehk /vmlinuz.

Kui see ketas hetk peale voolu sisselülitamist seadmesse pista, siis peaks arvuti sealt nö. bootima. Ta nimelt loeb siis floppylt operatsioonisüsteemi mällu.

Kui floppy on DOS'i oma läheb arvuti tööle DOS'i rezhiimis, Kui OS/2 siis OS/2'na ja Linux'i puhul Linux'ina. Siin on veel see asi, et CMOS setupis saab floppylt OS lugemise ehk bootimise ka ära keelata ja näidata nende seadmete järjekord millelt bootida (tavaliselt /dev/fd0; CD-ROM; /dev/hda). Edaspidises eeldame, et siiski on floppylit bootimine lubatud.

Ütleme kohe ära, et boot ja root kettaid saab teha kahte moodi:

- kasutades valmis nö. image faile (vt. Linuxi Installeerimise lehe juurest)
- koostades ise need image failid (just seda järgnev jutt püüabki kirjeldada)

Niisiis esimene asi on vaadata kuidas saada kernel tehtud ja teine asi kuidas see viia kettale nii, et ta sealt bootima hakkaks.

Kerneli konfigureerimine ja kompilleerimine

Kernelit konfigureerides tuleb võtta arvesse seda mida see kernel pärast tegema peab hakkama:

- võrk
- failisüsteemid
- hiir
- masquerade (ilus oleks teha nt. linuxi route millel polegi kõvaketast sees)
- sound

Mina soovitaksin võimalikult vähe aga kõik moodulid kernelisse sisse kompilleerida. Kui on pärast vaja anda moodulitele parameetreid mida modprobe'ga teha saaks, siis võib seda teha ka LILO'ga. Kuigi LILO panek on omaette kunst, või mis seal siis ikka on ...

Asi mida kernel kindlasti teha osakama peab on RAMDISK:

kompilleerige sisse, mitte mooduliks - Floppy, IDE and other block devices - > RAM disk support!

Ja seejärel make dep; make clean; make zImage;

kui tegite ka mõned moodulid:

make modules; make install_modules

aga root ketta tegemisel ei tohi neid ära unustada!
 

Kerneli floppyle viimine

Valmis kernel tuleb floppyle viia, nt. nii (mountida pole vaja):

bash# cat /usr/src/linux/arch/i386/boot/zImage > /dev/fd0
bash# rdev /dev/fd0 /dev/fd0
bash# rdev -r /dev/fd0 49152

- viime kerneli floppyle (NB! failisüsteemi seal ei ole, või enam ei ole :)
- näitame, et root loetakse  /dev/fd0'lt
- see kaval rida tähendab, et root failisüsteemi saamiseks peab kernel küsima floppyit ning selle alguses peab olema kohe root'i image.

rdev'i käsu idee on selles, et ta muudab binary (st. kerneli enda) teatud bitte mis näitavad asju mida tavaliselt LILO ütleb:

kui kasutada LILO't siis saab kernel LILO käest teada

- kus seadmelt ja millise nn. offset'ist alates root failisüsteemi otsida või
- milline on videorezhiim

Kui aga LILO't ei  kasuta, siis saab kernelile rdev'iga otse olukorra ära näidata.
 

Ning nüüd võib valmis boot floppy välja võtta.

Järgmine samm on tekitada root failisüsteem

3. Root failisüsteemi loomine ja floppyle viimine

Eesmärk on luuga kuhugi alamkataloogi, nt. /kraam linuxi võimalikult minimaalne root failisüsteem. Seal peavad olemas olema:

/dev - device failid, neid kasutab linux seadmetega suhtlemiseks
/etc - põhilised konfiguratsioonifailid
/lib - library'd - need on failid mida on vaja programmide käivitamiseks. Piltlikult üteldes on kõigil programmidel mingi ühisosa ja kui see esineks iga programmi bianary sees oleks binary'd suured. Targad ameeriklased aga mõtlesid välja library'ite süsteemi: iga käivitatav programm kasutab ld'd (linkerit) ja leiab oma puuduva osa librarist ülesse.

(muuseas, C kasutab samu librareid pluss header faile)

Et näha mis programm mis librarit tahab võib vaada:

bash# ldd /sbin/init
        libc.so.5 => /lib/libc.so.5 (0x4000a000)
bash#

bash# ldd /usr/bin/mc
        libtermcap.so.2 => /lib/libtermcap.so.2 (0x4000a000)
        libgpm.so.1 => /usr/lib/libgpm.so.1 (0x4000d000)
        libc.so.5 => /lib/libc.so.5 (0x40011000)
        libcurses.so.1 => /lib/libcurses.so.1 (0x400d3000)
bash#

veel on abiks käsk 'file' kontrollikaks kas binary on nn. vana a.out või uut ELF tüüpi:

bash# file /usr/bin/mc
/usr/bin/mc: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked, stripped
bash#

(stripped tähendab, et binary on ilma debugimist aitavate lisasümboliteta ja nõnda suhteliselt väike)

Näeme, et kui soovime panna init'i tööle on vaja kindlasti võtta kaasa ka /lib/libc.so.5.

Ja nii võib kõik binary'd järele proovida :)

Hakkame siis otsast pihta vaatama millised faile selle /kraami alla panna:

Loome /kraami alla järgmised kataloogid:

/bin, /sbin - binarid ehk programmid

/proc esialgu jääb tühjaks kuid seda hakkab OS kasutama protsesside jaoks

/tmp ajutised failid

/usr mõned alamkataloogid

/var log failid

/mnt nn. mount point
 

Konktreetselt:

tegelikult tuleb mõne faili sisu ka muuta:

/etc/fstab:

/dev/ram0           /            ext2    defaults
/dev/fd0            /            ext2    defaults
/proc               /proc        proc    defaults

/etc/rc.r/'st allapoole jäävad: sealt võtta maha daemonid mida pole tarvis (nt. printimine)

/bin

bash# ls
bash        dd          false       killall     more        setterm
cat         df          free        ln          mount       sh
chgrp       dircolors   gzip        login       mv          stty
chmod       dmesg       head        ls          ps          sync
chown       domainname  hostname    mkdir       pwd         ttysnoops
cut         du          ipmask      mkfifo      rm          umount
date        echo        kill        mknod       rmdir       uname
bash#

/etc

bash# ls -R
DIR_COLORS      ftpaccess       isapnp.conf     named.conf      sendmail.hf
HOSTNAME        ftpconversions  issue           networks        services
NETWORKING      ftpgroups       ld.so.cache     nntpserver      shadow
aliases         ftpusers        ld.so.conf      passwd          shadow-
aliases.db      gateways        ld.so.conf~     passwd-         shells
asound.conf     group           lilo.conf       passwd.OLD      slip.hosts
at.deny         group-          localtime       profile         slip.login
bootptab        host.conf       login.access    protocols       snooptab
csh.cshrc       hosts           login.defs      psdevtab        syslog.conf
csh.login       hosts.allow     magic           rc.d            termcap
devinfo         hosts.deny      makedev.cfg     resolv.conf     ttys
exports         hosts.equiv     minicom.users   rmt             utmp
fastboot        inet            motd            rpc             wtmp
fdprm           inetd.conf      mtab            securetty       wtmplock
fstab           inittab         mtools.conf     sendmail.cf
fstab~          ioctl.save      named.boot      sendmail.cw

rc.d:
rc.0        rc.K        rc.S        rc.inet2    rc.local~
rc.4        rc.M        rc.cdrom    rc.inet2~   rc.modules
rc.6        rc.M~       rc.inet1    rc.local    rc.serial
bash#

/lib

bash# ls -R
libext2fs.so.2            libpthread-mpegtv.so.0
ld-linux.so               libext2fs.so.2.3          libpthread-mpegtv.so.0.7
ld-linux.so.1             libgdbm.so.1              libpthread.so.0
ld-linux.so.1.9.5         libgdbm.so.1.7.3          libpthread.so.0.7
ld.so                     libm.so.4                 libtermcap.so.2
libc.so.5                 libm.so.4.6.27            libtermcap.so.2.0.8
libc.so.5.4.33            libm.so.5                 libuuid.so.1
libcurses.so.1            libm.so.5.0.9             libuuid.so.1.1
libcurses.so.1.0.0        libncurses.so.3.0
 

/sbin

bash# ls -R
agetty      init        lilo        rarp        runlevel    telinit
arp         initscript  lsmod       rdev        setserial   umount
clock       insmod      mke2fs      reboot      shutdown    update
fdisk       kerneld     mkswap      rmmod       sulogin     vidmode
fsck        killall5    modprobe    rmt         swapdev
halt        ksyms       mount       rootflags   swapoff
ifconfig    ldconfig    ramsize     route       swapon
bash#

/usr

bash# ls -R
adm   bin   lib   sbin

bin:
joe

lib:

sbin:
crond        inetd        klogd        rpc.mountd   rpc.portmap  syslogd
bash#

/var
 

bash# ls -R
adm  run

adm:
cron  utmp  wtmp

run:
utmp
bash#

/dev -is on väga palju faile, tegelikult on seal enamus mittevajalikud aga nad võtavad väga vähe ruumi - seega parem juba kõik vähemalt esialgu.

Kui tavalisi failie saab kopeerida niisama cp'ga  või mc's kusjuures isegi lingid jääviad vist nii kui peab; device'e
soovitatakse kompeerida selliselt:

bash# cp -dpR /dev /kraam
 

(muide 'ls -ltru' näitab faile 'last access'i aja tagurpidi järjekorras, vahest vajalik)

Tulemusena peaks kõik vajalik olema /kraam'i all:

Järgmisena tuleb librarite cache ld.so.cache korda teha:

bash# chdir /kraam; chroot /kraam /sbin/ldconfig

Kõige viimaseks sammuks on selle kataloogi /kraam alla loodu failisüsteemi kokkupakkimine ja viimine floppyle.

Et mitte nii palju jutustada vaadake ise seda shell scripti mis ülejäänud töö ära teeb:

#!/bin/sh
modprobe rd
dd if=/dev/zero of=/dev/ram1 bs=1k count=4096
mke2fs -vm0 -i 2000 /dev/ram1 4096
mount -t ext2 /dev/ram1 /cdrom
cp -vdpR /kraam/* /cdrom
cd /cdrom;  chroot /cdrom /sbin/ldconfig; cd /
dd if=/dev/ram1 bs=1k count=4096 | gzip -v9 > /kraam.gz
ls -l /kraam.gz
rm -fr /cdrom/*
umount /cdrom
rmmod rd
sleep 3
dd if=/kraam.gz of=/dev/fd0 bs=1k

Selle kasutamise eelduseks on, et

- kernel toetab moodulite laadimist ja ramdiski (rd) moodul on olemas
- /cdrom kataloog on parasjagu vaba

sleep on selle jaoks, et kui kraam.gz suurus on suurem kui 1,44MB, siis saab Ctl -C'ga katkestada.
Arusaadavalt tuleb, floppy seadmesse panna sobiv floppy ja mitte mountida.

Olles siiamaani jõudnud peaks olema teil kaks floppyit:

boot ja root

Ja neil peaks saama bootida!

Vaevalt, et see asi esimese korraga kohe perfektselt õnnestub, aga lugege veateateid ja proovige.

Samuti on oluline hankida Slackware 3.6 f1 seeria failid - uued doc'id; ning lugeda 2.0.36 kerneliga kaasas olevaid /Documentation faile (esp. ramdisk.txt).
 

LILO'GA

gggg