Priprava korenskega datotečnega sistema

Izdelava korenskega datotečnega sistema pomeni izbrati potrebne datoteke, da bo sistem deloval. V tem razdelku bomo obravnavali izdelavo stisnjenega korenskega datotečnega sistema. Manj običajna možnost je izdelava nestisnjenega datotečnega sistema na disketi, ki se ga neposredno pritrdi kot korenskega; ta alternativa je obravnavana v razdelku Korenski datotečni sistemi brez pomnilniškega diska.

Pregled

Korenski datotečni sistem mora vsebovati vse potrebno za podporo polnemu sistemu Linux. Da lahko zadostimo temu pogoju, mora biti na disk vključeno vsaj naslednje:

Sistem seveda šele postane uporaben, ko lahko na njem kaj poženete in korenska disketa ponavadi šele postane uporabna, ko lahko naredite kaj od naslednjega:

  • Pregledate datotečni sistem na drugem disku, npr. da pregledate korenski datotečni sistem na vašem trdem disku, morate najprej znati zagnati Linux z drugega diska (npr. s korensko disketo). Potem lahko poženete ukaz fsck za preverjanje datotečnega sistema na disku, kjer se nahaja vaš siceršnji datotečni sistem, ne da bi ta disk sploh bil pritrjen.

  • Obnovite rezervne kopije celotnega ali dela diska z uporabo orodij za arhiviranje in stiskanje, npr. cpio, tar, gzip in ftape.

Obravnavamo izdelavo stisnjenega datotečnega sistema, tako se imenuje, ker se na disketi nahaja stisnjen in se ob zagonu razširi v pomnilniški disk. S stisnjenim datotečnim sistemom lahko na standardno 1440 kB disketo spravite precej datotek (za pribl. 6 MB). Ker je datotečni sistem precej obsežnejši od kapacitete diskete, ga ne morete pripraviti na disketi. Najprej ga je treba izdelati nekje drugje, ga stisniti in nato prepisati na disketo.

Izdelava datotečnega sistema

Za izdelavo takšnega korenskega datotečnega sistema potrebujete dodatno napravo z dovolj veliko kapaciteto, da boste lahko nanjo že pred stiskanjem spravili vse datoteke. Na tej napravi potrebujete okoli 4 MB prostora. Na voljo je več možnosti:

Ko ste izbrali eno izmed teh možnosti, pripravite NAPRAVO z ukazom:

        dd if=/dev/zero of=NAPRAVA bs=1k count=4096

Ta ukaz zapolni prostor za NAPRAVO z ničlami (angl. to zero).

Important

Zapolnitev z ničlami je zelo pomembna, ker bo datotečni sistem kasneje stisnjen. Zato naj bi bili vsi neuporabljeni predeli zapolnjeni z ničlami, s čimer dosežemo največjo možno stisljivost. Na to pomislite vsakič, ko prestavljate ali brišete datoteke v tem datotečnem sistemu. Datotečni sistem bo pravilno odstranil bloke iz svoje tabele, vendar njihovih mest ne bo zapolnil z ničlami. Če veliko brišete in prepisujete po datotečnem sistemu, bo lahko stisnjeni datotečni sistem na koncu precej obsežnejši, kot bi lahko bil.

Nato izdelajte datotečni sistem. Linuxovo jedro prepozna dve vrsti datotečnih sistemov za korenske diskete, ki se samodejno prepišejo v pomnilniški disk. To sta minix in ext2, pri čemer se priporoča uporaba slednjega. Ob uporabi ext2 bo morda koristna izbira -N, s katero lahko določite večje število vozlišč (angl. inodes) od privzetega; predlaga se izbira -N 2000, tako vam vozlišč ne bi smelo zmanjkati. Po drugi strani lahko prihranite nekaj vozlišč z odstranitvijo precej nepotrebnih datotek iz imenika /dev. Ukaz mke2fs bo na 1,44 MB disketi privzeto naredil 360 vozlišč. Avtor sicer poroča, da za njegovo reševalno disketo zadostuje že 120 vozlišč, vendar če vključite vse datoteke gonilnikov naprav v /dev, boste zlahka presegli 360 vozlišč. S stiskanjem je mogoč obsežnejši datotečni sistem in s tem privzeto več vozlišč, vendar boste še zmeraj morali bodisi zmanjšati število datotek bodisi povečati število vozlišč.

Tako bo ukaz, ki ga boste vtipkali, podoben naslednjemu:

        mke2fs -m 0 -N 2000 NAPRAVA

(Če uporabljate povratnozančno napravo, nadomestite NAPRAVO z imenom uporabljene datoteke.)

Ukaz mke2fs samodejno ugotovi količino prostora, ki je na voljo, in v skladu s tem nastavi vse potrebno. Izbira ``-m 0'' prepreči, da je nekaj prostora (privzeto 5%) namenjenega samo sistemskemu upravitelju (uporabnik root), tako ostane na disku več uporabnega prostora.

Nato pritrdimo napravo:

        mount -t ext2 NAPRAVA /mnt
(Če še ne obstaja, morate narediti imenik /mnt, ki bo služil kot točka vpetja na datotečni sistem.) V preostalih razdelkih bomo predpostavili, da so imena ciljnih imenikov relativna glede na /mnt.

Naselitev datotečnega sistema

Tukaj je naveden razumen najmanjši nabor imenikov za vaš korenski datotečni sistem [1]:

Trije izmed naštetih imenikov bodo v korenskem datotečnem sistemu prazni in jih je potrebno le ustvariti z ukazom mkdir. Imenik /proc je v osnovi le mesto, kamor se bo namestil datotečni sistem proc. Imenika /mnt in /usr sta samo priklopni točki, ki se uporabljata, ko zagonski/korenski sistem že teče. Še enkrat, te tri imenike je potrebno samo ustvariti.

Ostali štirje imeniki so opisani v naslednjih razdelkih.

/dev

Imenik /dev, ki vsebuje posebne datoteke za vse v sistemu uporabljane naprave, je obvezen v vsakem sistemu Linux. Sam po sebi je to običajen imenik in ga lahko na običajen način ustvarimo z ukazom mkdir. Zato pa je potrebno posebne datoteke naprav ustvariti na poseben način z ukazom mknod.

Obstaja tudi lažji način, mogoče je namreč prepisati datoteke iz obstoječega imenika /dev na trdem disku. Zahtevano je edino, da se ukazu za prepisovanje (cp) doda še izbira -R. Tako prepišete imenik brez prepisovanja vsebine datotek. Prepričajte se, da bo izbira R vtipkana kot velika črka. Primer:

        cp -dpR /dev/fd[01]* /mnt/dev
        cp -dpR /dev/tty[0-6] /mnt/dev
ob predpostavki, da je disketa pritrjena na imenik /mnt. Stikali dp poskrbita, da se simbolne povezave prepišejo kot povezave (ne pa datoteke, kamor te povezave kažejo) in da se ohranijo prvotni atributi datotek ter skupaj z njimi tudi podatki o njihovem lastništvu.

Če hočete to storiti na težji način, z ukazom ls -l ugotovite višje (major) in nižje (minor) številke naprav za želene naprave in jih naredite na disketi z uporabo ukaza mknod.

Kakorkoli že naredite datoteke gonilnikov naprav, preverite, ali ste na disketo namestili datoteke gonilnikov naprav, ki jih potrebujete. Na primer, ftape uporablja datoteke gonilnikov naprav za tračne enote, zato boste morali prepisati vse te datoteke gonilnikov naprav, če nameravate po zagonu s pripravljene diskete uporabljati tračno enoto.

Upoštevajte, da vsaka datoteka gonilnikov naprav porabi eno vozlišče in vozlišč lahko hitro zmanjka, kar še posebej velja za datotečne sisteme na disketah. Zato boste morali skrbno izbrati, katere datoteke gonilnikov naprav vključiti na disketo. Če npr. nimate diskov SCSI, lahko mirno izpustite vse datoteke /dev/sd*; če ne nameravate uporabljati serijskih vrat, lahko izpustite /dev/ttyS* itn.

Če se ob pripravi korenskega datotečnega sistema izpiše sporočilo No space left on device (Na napravi je zmanjkalo prostora), ukaz df pa pokaže, da je prostor še na razpolago, vam je zelo verjetno zmanjkalo vozlišč. Porabo vozlišč lahko ugotovite z ukazom df -i.

Important

Vsekakor pa naj bodo vključene naslednje datoteke iz tega imenika: console, kmem, mem, null, ram0 in tty1.

/etc

Imenik /etc vsebuje nastavitvene datoteke. Njegova vsebina je odvisna od programov, ki jih nameravate poganjati. Na večini sistemov lahko njegovo vsebino razdelimo v tri skupine:

  1. Vedno obvezne datoteke, npr. rc, fstab, passwd.

  2. Datoteke, ki so lahko obvezne, vendar ni nihče 100% prepričan v to.

  3. Šara, ki se je, kdo ve, kako, znašla tu.

Ponavadi lahko neobvezne datoteke razkrinkamo z ukazom:
        ls -ltru
Ta ukaz nam razvrsti datoteke glede na čas zadnjega dostopa do njih, začenši s tistimi s časovno najbolj oddaljenimi dostopi. Če se torej katera datoteka odpira neredno, je ni potrebno prepisovati na korensko disketo.

Kot poroča avtor, je število nastavitvenih datotek na korenski disketi oklestil na 15. Na ta način je mogoče prihraniti nekaj dela z razdelitvijo na tri množice datotek:

  1. Datoteke, ki jih je treba posebej nastaviti za zagonsko/korenski sistem:

    1. rc.d/* -- skripti za zagon sistema in spremembe načinov delovanja

    2. fstab -- seznam datotečnih sistemov, ki jih je mogoče pritrditi

    3. inittab -- parametri za proces init, prvi proces, ki steče ob zagonu.

    4. gettydefs -- parametri za proces init, prvi proces, ki steče ob zagonu.

  2. Datoteke, ki jih je potrebno le ``počistiti'' za uporabo na zagonskem/korenskem sistemu:

    1. passwd -- seznam uporabnikov, domačih imenikov itd.

    2. group -- uporabniške skupine.

    3. shadow -- gesla uporabnikov. Ni rečeno, da jo imate.

    4. termcap -- zbirka podatkov o zmožnostih terminala.

    Če je varnost pomembna, bi morali biti datoteki passwd in shadow okleščeni. Na ta način ne razširjamo naokrog uporabniških gesel brez potrebe, obenem pa ob zagonu z diskete onemogočimo neželene prijave.

    Prepričajte se, da datoteka passwd vsebuje vsaj sistemskega upravitelja (root). Če nameravate omogočiti dostop tudi drugim uporabnikom, poskrbite, da obstajajo tudi njihove lupine in domači imeniki.

    termcap, zbirka podatkov o terminalu, je običajno dolga več 100 kB. Različica za zagonsko/korensko disketo naj bi bila toliko okleščena, da vsebuje samo terminal(e), ki ga (jih) uporabljate, to pa je ponavadi samo vnos linux ali linux-console.

  3. Ostalo. Ker trenutno delujejo, jih avtor pusti pri miru.

Poleg tega je potrebno nastaviti dve datoteki in izkaže se, da je njuna vsebina presenetljivo kratka.

  • rc naj vsebuje:

            #!/bin/sh
            /bin/mount -av
            /bin/hostname Kangaroo
    Poskrbite, da je izvršljiva (nastavljena dovoljenja za izvrševanje), da se prva vrstica prične z "#!" in da so vsa absolutna imena datotek pravilna. Ukaza hostname niti ni potrebno pognati, če ga, je izgled nekoliko prijaznejši.

  • fstab naj vsebuje vsaj:

            /dev/ram0       /               ext2    defaults
            /dev/fd0        /               ext2    defaults
            /proc           /proc           proc    defaults
    Prepišete lahko vnose z vaše obstoječe datoteke fstab, vendar ne bi smeli samodejno pritrditi kar vseh razdelkov trdega diska, zato zraven dopišite še ključno besedo noauto. Ko uporabljate zagonsko disketo, je vaš trdi disk namreč lahko poškodovan ali pokvarjen.

Datoteko inittab je potrebno preurediti tako, da vrstica s sysinit požene rc ali katerikoli osnovni zagonski skript boste že uporabili. Če nočete, da se uporabniki prijavljajo prek serijskih vrat, zakomentirajte vse vnose za getty, ki imajo na koncu vrstice vključeno napravo ttys ali ttyS. Vrata tty pustite, da se bo mogoče prijavljati prek konzole.

Minimalna datoteka inittab je videti nekako takole:

        id:2:initdefault:
        si::sysinit:/etc/rc
        1:2345:respawn:/sbin/getty 9600 tty1
        2:23:respawn:/sbin/getty 9600 tty2
Datoteka inittab določa, kaj bo sistem pognal v različnih stanjih, vključujoč zagon, premik v večuporabniški način itd. Pozorno preverite imena datotek, omenjena v datoteki inittab; če init ne najde tam omenjenih programov, se bo sistem obesil in verjetno ne boste videli niti sporočila o napaki.

Upoštevajte, da nekaterih programov ni mogoče prestavljati drugam, ker imajo drugi programi že vprogramirane (angl. hardcoded) poti do njih. Primer je /etc/shutdown, ki ima v sebi že vprogramirano pot do /etc/reboot. Če prestavite reboot npr. v /bin/reboot in nato poskusite pognati ukaz shutdown, vam to ne bo uspelo, ker shutdown ne bo našel datoteke reboot.

Kar se tiče ostalega, samo prepišite vse tekstovne datoteke v imeniku /etc, poleg njih pa še vse izvršilne datoteke v tem imeniku, za katere niste prepričani, da jih ne potrebujete. Poskusite se zgledovati po vzorčnem seznamu v dodatku Vsebina vzorčnega korenskega sistema. Verjetno bo zadostovalo, če prepišete samo te datoteke, vendar se lahko sistemi kar precej razlikujejo med seboj, zato ne morete biti prepričani, da je ta ista množica datotek v vašem sistemu enakovredna datotekam na tem seznamu. Edini zanesljiv način je, da si ogledate inittab in ugotovite, kaj vse se zahteva.

Dandanes večina sistemov uporablja imenik /etc/rc.d/, ki vsebuje lupinske skripte za različne načine delovanja. Vsebovati mora najmanj skript rc, vendar je morebiti enostavneje kar prepisati inittab in vsebino imenika /etc/rc.d z obstoječega sistema ter nato oklestiti skripte v imeniku rc.d, da tako odstranite vse, česar ne potrebujete za delovanje sistema, zagnanega s sistemske diskete.

/bin in /sbin

Imenik /bin je primerno mesto za dodatne pripomočke, ki jih potrebujete za izvajanje osnovnih opravil, pripomočkov, kot so ls, mv, cat in dd. Oglejte si dodatek Vsebina vzorčnega korenskega sistema kot referenčni seznam datotek, ki sodijo v imenika /bin in /sbin. Na tem seznamu ni pripomočkov za obnavljanje rezervnih kopij, kot so cpio, tar ali gzip. Vzrok temu je, da se te datoteke praviloma nahajajo na posebni disketi s pripomočki, tako se prihrani prostor na zagonski/korenski disketi. Ko je sistem enkrat zagnan z zagonske/korenske diskete, se njena vsebina prepiše v pomnilniški disk, disketni pogon pa se sprosti za pritrditev dodatne diskete, t.j. pomožne diskete. Ponavadi se jo pritrdi na /usr.

Izdelava pomožne diskete je opisana v podrazdelku Priprava pomožne diskete. Verjetno je pametno, da na pomožno disketo shranite orodja za obnavljanje rezervnih kopij, ki naj bodo enake različice, kot tista, s katerimi ste rezervne kopije tudi naredili. Tako ne boste tratili časa z namestitvijo različic, ki ne znajo prebrati vaših trakov z rezervnimi kopijami.

Important

Nikar ne pozabite vključiti naslednjih programov: init, getty ali enakovredna zamenjava, login, mount, lupina, ki lahko poganja vaše skripte rc, povezava sh, ki kaže na to lupino.

/lib

V imenik /lib boste namestili potrebne deljene knjižnice in nalagalnike. Če sistem potrebnih knjižnic ne najde v imeniku /lib, se ne bo mogel zagnati. Če boste imeli srečo, boste morebiti celo videli sporočilo o napaki.

Skorajda vsak program zahteva vsaj knjižnico libc, libc.so.N, kjer N pomeni številko trenutne različice. Preverite vaš imenik /lib. Datoteka libc.so.N je ponavadi simbolična povezava do datoteke, ki v imenu vsebuje popolno številko različice:

% ls -l /lib/libc*
-rwxr-xr-x   1 root     root      4016683 Apr 16 18:48 libc-2.1.1.so*
lrwxrwxrwx   1 root     root           13 Apr 10 12:25 libc.so.6 -> libc-2.1.1.so*

V tem primeru potrebujete datoteko libc-2.1.1.so. Do seznama preostalih potrebnih knjižnic se pride tako, da vsaki izvršljivi datoteki, ki jo želite vključiti na disketo, ugotovite njene odvisnosti z ukazom ldd. Na primer:

        % ldd /sbin/mke2fs
        libext2fs.so.2 => /lib/libext2fs.so.2 (0x40014000)
        libcom_err.so.2 => /lib/libcom_err.so.2 (0x40026000)
        libuuid.so.1 => /lib/libuuid.so.1 (0x40028000)
        libc.so.6 => /lib/libc.so.6 (0x4002c000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Dodati je potrebno vse datoteke na desni strani zgornjega izpisa. Datoteka je lahko tudi simbolična povezava.

Upoštevajte, da so nekatere knjižnice kar obsežne in jih ni lahko spraviti na korenski datotečni sistem. Primer je zgoraj navedena knjižnica libc.so, ki obsega približno 4 MB. Preden prepišete knjižnice na korenski datotečni sistem, jih boste verjetno morali oskubiti (angl. strip). Za nadaljnja navodila si oglejte razdelek Zmanjšanje velikosti korenskega datotečnega sistema.

V imeniku /lib ne sme manjkati tudi nalagalnik knjižnic. Nalagalnik bo ali ld.so (za knjižnice A.OUT, ki se postopoma opuščajo) ali ld-linux.so (za knjižnice ELF). Novejše različice ldd (kot je npr. v zgornjem primeru) tudi natančno povedo, kateri nalagalnik je potreben, starejše različice pa morda ne. Če niste prepričani, katerega potrebujete, poženite ukaz file nad knjižnicami. Na primer:

% file /lib/libc.so.4.7.2 /lib/libc.so.5.4.33 /lib/libc-2.1.1.so
/lib/libc.so.4.7.2: Linux/i386 demand-paged executable (QMAGIC), stripped
/lib/libc.so.5.4.33: ELF 32-bit LSB shared object, Intel 80386, version 1, stripped
/lib/libc-2.1.1.so: ELF 32-bit LSB shared object, Intel 80386, version 1, not stripped
Besedica QMAGIC pove, da je različica 4.7.2 za knižnice A.OUT, ELF pa pove, da sta različici 5.4.33 in 2.1.1 za knjižnice ELF.

Nalagalnik(e), ki jih potrebujete, prepišite na korenski disk, ki ga pripravljate. Temeljito preverite ali ste prepisali vse knjižnice in nalagalnike, ki jih potrebujejo vključene izvršilne datoteke. Če jedro ne more naložiti kakšne izmed knjižnic, se utegne obesiti brez opozorila o napaki.

Podpora za PAM in NSS

Vaš sistem lahko zahteva tudi dinamično naložene knjižnice, ki jih ldd ne vidi. Če ne omogočite podpore za te knjižnice, utegnete imeti težave ob prijavi ali uporabi zagonske diskete.

PAM (Pluggable Authentication Modules - vtični moduli za avtentikacijo)

Če vaš sistem uporablja PAM, morate na zagonski disketi poskrbeti za nekaj zaloge zanjo, Na kratko, PAM je sofisticirana modularna metoda za avtentikacijo uporabnikov in nadzor njihovega dostopa do storitev. Preprost način, da ugotovite, ali vaš sistem uporablja PAM, je, da poženete ukaz ldd na izvršilni datoteki login; če v izpisu vidite libpam.so, potem potrebujete PAM.

Na srečo varnost ne igra pomembne vloge pri uporabi zagonskih disket, kajti vsak, ki ima fizični dostop do računalnika, lahko tako ali tako počne, kar hoče. Zato lahko učinkovito onemogočite PAM, če v vaš korenski datotečni sistem dodate preprosto datoteko /etc/pam.conf, ki je videti takole:

OTHER   auth       optional     /lib/security/pam_permit.so
OTHER   account    optional     /lib/security/pam_permit.so
OTHER   password   optional     /lib/security/pam_permit.so
OTHER   session    optional     /lib/security/pam_permit.so
Prepišite tudi datoteko /lib/security/pam_permit.so v vaš korenski datotečni sistem. Ta knjižnica zasede samo 8 kB, tako da predstavlja minimalne dodatne prostorske zahteve.

Takšna nastavitev dovoli vsakomur popoln dostop do datotek in storitev. Če vam je iz kakršnegakoli vzroka varnost pri uporabi zagonskega diska pomembna, boste morali s trdega diska prepisati nekaj ali kar vse nastavitve za PAM v vaš korenski datotečni sistem. Pazljivo preberite dokumentacijo za PAM in prepišite vse potrebne knjižnice v imeniku /lib/security v vaš korenski datotečni sistem.

Na zagonsko disketo morate dodati tudi /lib/libpam.so. Vendar to že veste, saj ste datoteki /bin/login z ukazom ldd preverili odvisnosti in to ugotovili.

Moduli

Če imate modularno jedro, se morate odločiti, katere module želite naložiti ob zagonu z zagonske diskete. Če delate rezervne kopije na trak, boste tako verjetno vključili modula ftape in zftape, če imate naprave SCSI, boste verjetno dodali module z gonilniki zanje, morda pa boste dodali še module za podporo PPP ali SLIP, če želite tudi v sili dostopati do interneta.

Ti moduli se običajno nahajajo v imeniku /lib/modules. Ne smete pozabiti še na ukaze insmod, rmmod in lsmod. Če želite samodejno nalaganje modulov, pa ne smejo manjkati še ukazi modprobe, depmod in swapout. Če uporabljate kerneld, ga dodajte v /etc/conf.modules.

Glavna prednost uporabe modulov je, da lahko module, ki niso nujni za zagon, spravite na pomožno disketo in jih naložite, ko jih potrebujete, tako porabite manj prostora na korenski disketi. Če boste imeli opravka z veliko različnimi napravami, je ta način primernejši od gradnje obsežnega monolitnega jedra s precej vgrajenimi gonilniki.

Important

Za zagon stisnjenega datotečnega sistema ext2 morata biti podpori za pomnilniški disk in ext2 že vgrajeni v jedro. Podpora zanju v obliki modulov ni mogoča.

Nekaj končnih podrobnosti

Nekateri sistemski programi, npr. login, se bodo pritoževali, če datoteka /var/run/utmp in imenik /var/log ne obstajata. Zatorej naredite naslednje:

        mkdir -p /mnt/var/{log,run}
        touch /mnt/var/run/utmp

Na koncu, ko ste nastavili vse potrebne knjižnice, poženite še ukaz ldconfig, ki ustrezno prikroji datoteko /etc/ld.so.cache na korenskem datotečnem sistemu. Iz te datoteke bo nalagalnik knjižnic črpal podatke, kje najti knjižnice. To lahko storite takole:

        ldconfig -r /mnt

Ko je končno vse pripravljeno...

Ko končate s pripravljanjem korenskega datotečnega sistema, ga odklopite, prepišite v datoteko in stisnite:

        umount /mnt
        dd if=NAPRAVA bs=1k | gzip -v9 > rootfs.gz
Ko se ta postopek konča, boste dobili datoteko rootfs.gz. To je vaš stisnjen datotečni sistem. Preverite njegovo velikost in se prepričajte, da je dovolj kratek, da ga je mogoče spraviti na disketo; če to ni mogoče, se boste morali vrniti na enega prejšnjih podrazdelkov in zbrisati nekaj datotek. Nekaj namigov za zmanjšanje korenskega datotečnega sistema lahko najdete v razdelku Zmanjšanje velikosti korenskega datotečnega sistema.

Notes

[1]

Tukaj predstavljena imeniška struktura velja samo za korenske diskete. Resnični sistemi Linux imajo kompleksnejši in strožje določen pravilnik, imenovan Filesystem Hierarchy Standard (standard za hierarhijo datotečnega sistema), ki določa, kje naj bo katera datoteka.