teejuht
1.
|
Sissejuhatus |
2.
|
Boot ketas |
3.
|
Root ketas |
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
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