Tigu lahkamas, ehk ekskursioon UNIXi maailma

Autor: Anto Veldre, 1995

Protsessid

ehk raamatupidamise tähtsusest

UNIXi sisemuses peetakse kõige toimuva üle raudset arvestust. Vähe sellest, et masin fikseerib sisselogimise kuupäeva ja kellaaja, UNIX peab eraldi arvestust ka kõigi protsesside üle, mis süsteemis käima lastakse. Kusagil mälusopis on protsessitabel, kus kirjas kõik protsessid koos käivitamise kellaaja ja omaniku nimega. Igal protsessil on oma number (PID -- process identificator), mille järgi saab iga protsessi masinast üles leida. Ühemehesüsteemiga harjunud arvutisõbral on päris raske mõista, MILLEKS kõik need numbrid ja tabelid, niikuinii saab protsessor korraga vaid ühtainukest programmi täita.

Tõepoolest, protsessor suudab korraga järada vaid ühte masinkäskude järjestust. Siin aga astub mängu säärane protsessori omadus nagu kaitstud rezhiim (protected mode). Paarkümmend korda sekundis viiakse protsessor sundkorras kaitstud rezhiimi, kus ta vaatab läbi kogu käivitamist ootavate protsesside tabeli ning annab juhtimise mõnele järjekorras seisvatest protsessidest. Kui säärane ümberlülitamine toimub piisavalt kiiresti, siis jääb mulje, nagu lahendaks masin korraga mitut ülesannet. Mida rohkem on protsessitabelis ootavaid ülesandeid, seda aeglasemaks muutub masina töö. Oma individuaalse PID saavad kõik masinas toimuvad protsessid, olenemata sellest, kas on tegu käsurealt käimalastud programmiga või siis keerulisema jadaga, kus üks programm kasutab oma töös teisi abiprogramme. PID suurus on tavaliselt limiteeritud arvuga 2 astmel 16 , siis algab numeratsioon taas algusest.

MS-DOSi all on programmeerija nuhtluseks programmid, mis ühel või teisel põhjusel kinni jooksevad. Tuleb ju siis masinale alglaadimine korraldada. UNIXi puhul on olukord kardinaalselt erinev. Mingi üksik protsess ei halva süsteemi tegevust. Ta lihtsalt EI SAA seda teha, sest juba järgmisel sekundikümnendikul võtab kaitstud rezhiimis tegutsev UNIXi tuum (kernel) tema käest juhtimise ära ning annab selle mõnele muule protsessile. Nüüd on paras aeg uurida, MILLINE protsess kinni jooksis. Käsuga ps saate UNIXis igal ajal ekraanile protsessitabeli ning teha järeldusi, milline on kinnijooksnud protsessi number. Teine asjakohane käsk on kill, millega saab maha tappa iga protsessi. Lihtsustatult võib öelda, et kill lihtsalt kustutab vastava nime protsessitabelist. Mõnikord on selline laustapmine ka ohtlik --- näiteks kill -9 29587 tapab armutult ja aega viitmata protsessi, mille PID=29587 , küsimata temalt, kas ta oma failid kinni pani ja muud maised tegemised tehtud sai. Seevastu kill -15 <PID> tapab veidi "viisakamalt".

Isad ja emad, pojad ja tütred.

Vaadeldes protsessitabelit täies ulatuses ( ps -ef või siis mõnedes süsteemides ka ps -ax), saate Te näha, et iga protsessi puhul on kirjas ka tema vanemate koordinaadid ( PPID -- Parent Process ID ). Näiteks käivitasite Te just nüüdsama käsu ps. See kiikas korraks protsessitabelisse, tõi tulemused ekraanile ning andis juhtimise tagasi teda sünnitanud protsessile, (antud juhul oli selleks Teie login-shell). Seda poleks saadud teha, teadmata PPID numbrit. Võimalik on ka teisesuunaline side -- oma login-shelli kill-käsuga tappes tapate te automaatselt ka kõik muud protsessid, mis temast pärinevad.

UNIX pakub protsesside loomisel päris huvitavaid võimalusi. Kui Teil on soov käivitada mingi pikem arvutusprogramm ja ise hoopis koju magama minna, siis andke käsk:

nohup proge_nimi

Nüüd lõigatakse protsessitabelis läbi side protsessi ja tema ema vahel. Ema tapmine ei põhjusta enam tütre surma. Te võite ennast rahulikult masinast välja logida, Teie programm aga jätkab tegevust (nohup -- no hang up). Soovi korral saab sünnitada kaksikuid, selle nähtuse nimi on fork ehk kahvel ning tüüpiliseks käsuks, mis seda nõksu kasutab -- tee (tee on oma nime saanud T-tähe kuju järgi):
write john | tee faili_nimi

Kui John sel hetkel masinas asub ning soovib Teile samaga vastata, saate ekraani ja klaviatuuri vahendusel juttu vesta, kusjuures kõik, mis Teie ekraanil toimub, salvestatakse täiendavalt ka faili.

Viimane trikk, mida me siinkohal käsitleme, on seotud programmi panekuga background'i . Kirjutades käsurea lõppu "&"-märgi:

proge_nimi&

lõikate jällegi läbi sideme ema- ja tütarprotsessi vahel. Te saate koheselt tagasi oma login-shelli prompti, tütarprotsess ( Teile teatatakse selle number ) aga jätkab iseseisvat tegutsemist. Sel võttel on mingi väline sarnasus DOSi TSR-programmidega. Ärge kunagi pange background'i protsessi, mis ekraani risustab. Häda on selles, et kui ta risustab Teie ekraani piisava kiirusega, siis ei jõua Te fikseerida selle õnnetu protsessi numbrit ning Teil jääb üle kirjutada kas exit või kill -9 0.

Igaks juhuks on masinasse ka piir seatud, mis ei lase protsesside arvul lõpmatusse tõusta. Harju keskmisel UNIX-süsteemil on protsessitabeli pikkuseks mõnisada rida ning ühel kasutajal pole luba käivitada üle 25 protsessi korraga. Edasi tulevad teated: No more processes, Region Table Overflow ...

Kest tema ümber

UNIXi keskpunktiks on tuum (kernel). Süsteemi üleslaskmisel lisandub poole kuni megabaidise suurusega op-süsteemile veel mitmesuguseid mäluosasid, mistõttu kogu kerneli poolt haaratav mälumaht võib ulatuda päris mitme megabaidini. Tuumaga on väga lähedalt seotud hulk draivereid, mis võimaldavad konkreetsete välisseadmetega suhelda. See osa UNIXist on täiesti individuaalne, ning lastud kokku täiesti konkreetse raua peale, ning seetõttu pole mingit mõtet üritada seda teist tüüpi raua otsas käivitada. Op-süsteemi koossseisu kuulub terve pesakond utiliite (cp, rm, ps, who...), mis annavad tuumale tõelise väärtuse. Enamikku utiliitidest saab kohapeal kokku kompileerida ning nende lähtetekst pole raua suhtes kuigi kriitiline. Utiliite on korralikus UNIXis vähemalt paarkümmend megabaiti. UNIXi, eriti SYSTEM V loosungiks on mitte leiutada jalgratast, vaid ehitada oma programm üles teiste poolt valmistatud tükkidele. Öeldakse, et üks korralik utiliit peab tegema ainult ühte asja, kuid peab tegema seda korralikult. Kogu selle utiliitide loomaaia kasutamiseks ja vaoshoidmiseks on igas UNIX-süsteemis programm nimega shell. Shell võtab käsurealt ( või tekstifailist) korraldusi ning tõlgib UNIXi tuumale arusaadavasse keelde. Elukutseline programmeerija võib ju suhelda tuumaga ka C-keelse progise ja system call'ide tasemel, aga enamik inimesi vajaksid nagu midagi lihtsamat. Muide, neile, kes ka käsureaga hakkama ei saa, on olemas X/Windows ja see maksab palju raha :-)

SHELL kui töökeskkond

Shell on peaaaegu seesama, mis DOSis COMMAND.COM , ehkki tema võimalused on tohutult suuremad. Tegelikult võib vaielda, kas shell ongi käsuinterpretaator või on ta hoopis programmeerimiskeel? Fakt on see, et iga kord, kui Te end UNIXisse sisse logite, sattute Te igatahes shelli prompti otsa, nii et shellist ei pääse Te mingil moel. Laisa süsadmini puhul on promptiks "%" või "$", ruudu (root'i) promptiks on shellist sõltumata "#". Veidike vaeva nähes saate oma prompti palju sisukamaks kirjeldada, pistes sinna masina nime, username'i, kellaaja või kataloogi nime. Kui Teil parasjagu muud teha pole, võite oma prompti poole ekraani pikkuseks kasvatada ning ESC-koodidega vikerkaarevärviliseks muuta... Muide, kuna shell kujutab endast kasutajakeskkonda, mis peab konkreetse UNIXi erinevused kasutaja eest ära peitma, siis sealt on ta oma nimegi saanud: shell - koorik, teokarp.

Shelle on mitu erinevat nimetust, kuid algaja programmeerija ei peaks erinevusi esialgu märkamagi. Üks shell on süsteemi administraatori poolt seatud Teie login-shelliks -- so shelliks, kuhu Te satute kohe sisselogimise järel. Kui soovite, võite alati käivitada mõne teise shelli. Kirjutades shelli prompti otsa mingi korralduse ning vajutades ENTERit, annate Te oma lausekonstruktsiooni shellile hindamiseks. Kui ta leiab, et see on grammatiliselt õige, teeb ta asendused ja väärtustab muutujad ning annab siis kogu selle käsurea täitmiseks.

Näiteks, kirjutades:

proge <ENTER>

Te lihtsalt käivitate oma programmi nimega "proge";. Kirjutades
sh proge <ENTER>

määrate Te ühtlasi ära, et seda programmi käivitatakse Bourne'i Shelli ( sh ) abil. Siiski on võimalikud ka palju keerulisemad konstruktsioonid. Nagu näiteks:

kill -15 `ps -u root | awk '/uugetty/ && !/awk/ {print $1}'` > /dev/null

Sellest tuleks aru saada umbes nii, et protsessitabelist otsitakse välja kõik root'ile kuuluvad protsessid, leitakse rida, mis vastab käsule uugetty, eraldatakse awk-käsuga sellest reast PID-number, edastatakse argumendina kill-käsule ning lastakse see kill käima. Tulemuseks on muidugi programmi uugetty seiskamine. Kõik, mida sel käsul öelda on, suunatakse olematusse (> /dev/null).

Vahelduseks üritage midagi sarnast teostada COMMAND.COMi vahenditega...

STDIN, STDOUT, STDERR ja toru

Kuni Teil pole erisoove, arvab shell, et kõik käsud ja korraldused tuleb võtta klaviatuurilt, kogu väljundvoog aga tuleb suunata ekraanile. Siiski saab mistahes protsessi sisendit ja väljundit ka ümber suunata, kui selleks tahtmine peaks tekkima. UNIXis on olemas säärane tore asi nagu "toru" (ingl.k. pipe ), mille abil saab ühe programmi väljundi suunata järgmise programmi sisendisse, ilma et vahelt midagi ekraanile pudeneks. Nii näiteks käsukonveier (inglise k. pipeline)

cat yks_tekstifail | sort | tr "A" "b" | pr -30 | lp -or -depson

oleks täiesti võrdväärne jadaga
sort yks_tekstifail > teine_fail  
tr "A" "b" teine_fail > kolmas_fail 
pr -30 kolmas_fail > neljas_fail
lp -or -depson neljas_fail

(Pange tähele, faili suunatakse märgiga >, programmi standardsisendisse toruga | ). Eelnenud näitest aga tuleks aru saada umbes nii, et üks_tekstifail sorditakse reakaupa, vahetatakse temas kõik suured A-tähed väikeste b-tähtedega, paigutatakse see kenasti 30 rea kaupa leheküljele ning lastakse Roman-kirjas trükki Epson-printerile. Käsk tr tähendaks translate, pr -- print, lp -- line print.

Niisiis on toru justkui voolik, mille abil saab erinevaid käske kokku ühendada. Loomulikult ei takista Teil keegi vahetulemusi failidesse salvestamast ( kui Winchesteri kõrin Teile rõõmu teeb ):

cat file | tee file | 
sort | tee file | tr "A" "b" | tee file | ja nii edasi...

Siiski on igal programmil veel üks väljundkanal, mis lihtlabasele ümbersuunamisele ei allu. See on veavoog ehk standard error (stderr). Täiesti mõistetav, et kui konveieris midagi vussi läheb, sooviksite Te veateadet ikka ekraanil näha, mitte sordituna ja tõlgituna väljundfailis või dokumendi ridade vahel. Veavoog ilmutab mingeid teateid üksnes siis, kui Teie programm või käsurida oma tööga normaalselt hakkama ei saa.

Eriti enesekindlatele häkkeritele soovitaksin programmi suu sulgemiseks järgmist käsurida (suunab tühjusse nii stdout kui stderr):

sh enesekindel_proge > /dev/null 2>&1

Mis tähendab, et veavoog (1) suunatakse sinnasamasse, kuhu standardväljund (2). Seega siis kuhu? :-)

SHELL-script

Ei ole midagi uut siin ilma peal, shell-script on peaaegu täpselt seesama, mis *.BAT fail MS-DOSis. Selle pisikese erinevusega, et Teil on lubatud kasutada suvalisi muutujaid, tsükleid, IF-lauseid, CASE-konstruktsiooni ja palju muud, mida batch-failid iialgi suutma ei hakka. Nii näiteks kasutan ma UNIXi kataloogipuust ülevaate saamiseks järgmist scripti:

# Selle proge nimi on /u/anto/bin/tree
tyhik='.######'
algus='+-----|'
slash='/'
for i in `ls`
    do
      if test -d $i
      then (t=$tyhik$t ; export slash ; export algus ; \
      export t ; echo $slash$t$algus$i ; cd $i  ; /u/anto/bin/tree )
      fi
    done

Script on rekursiivne, st kutsub iseennast välja seni, kuni kõik varjulised nurgakesed kataloogipuus on läbi käidud.

Muutuja $tyhik='######' on kasutusel põhiliselt seetõttu, et minu poolt kasutatav shell keeldub jonnakalt vahet tegemast tühikute ja tühjuse (NULL) vahel. Pärast teisendan ma tr käsu abil trellid kenasti tühikuteks tagasi ning saadud pilt ei erine kuigi palju sellest, mida väljastab Norton-Tree. Ettevaatust - skript sellisel kujul ei töötle nn symbolic linke.

Konfiguratsioonifailid

MS-DOSi all on tarbijal teatavasti võimalik konfigureerida oma töökeskkonda failidega AUTOEXEC.BAT ning CONFIG.SYS . Ka UNIXis on olemas sarnase otstarbega konfiguratsioonifailid. Iga kord, kui Te end sisse logite, täidetakse failis .login sisalduv käsujada. Lisaks sellele, iga kord kui Te uue alamshelli välja kutsute, täidetakse fail .profile (Bourne'i ja Korn- shelli puhul) või .cshrc (C-shelli puhul). Nendes failides saate ära määrata muutujad $PATH ja $EDITOR ning kirjeldada oma aliased (va Bourne'i shell, mis aliasi ei tunnista). Kui Te arvate, et kataloogi vaadatakse käsuga dir, mitte ls -la; , siis kirjutage oma .loginisse:

alias dir 'ls -la'

Siiski hakkab see muudatus mõjuma alles järgmisest sisselogimisest alates. kui soovite kohest efekti, andke sama käsk käsurealt. Oma töökeskkonnast ülevaate saamiseks kasutaage käske env, @ ja alias.

Märkimisväärne on veel see, et kuna iga UNIXi kasutaja sattub peale sisselogimist erinevasse kataloogi (nn kodukataloog), siis on kõigi konfiguratsioonifailid täiesti sõltumatud. Kodukataloogist võib leida muidki initsialiseerimisfaile:

.newsrc     -- uudissüsteemi konfigureerimiseks,
.mailrc     -- postimasina häälestamiseks,
.exrc       -- tekstiredaktorite vi ja ex taltsutamiseks,
.xDefaults  -- graafilise keskkonna initsialiseerimiseks.

Allpool üks näide tüüpilisest SCO UNIXi .login-failist:


set ignoreeof
set history=20
alias p lp -ob -or -oi $1
alias pg "pg -p \"---PAGER pg %d--->\" -s"
alias h history
echo "Terminaal $LOGTTY on kirjeldatud kui $TERM"
echo "Terminfo tarvitab kataloogi $TERMINFO"
alias lock lock -v
alias news "news | pg"
alias setprompt 'set prompt="`pwd` \! >"'
alias cd 'chdir \!* || setprompt'
setprompt
mesg y

Failisüsteem

(Austus eraomanduse vastu)

UNIXi failisüsteem võrdluses MS-DOSi omaga oleks umbes sama, kui võrrelda omavahel elevandi paindlikku lonti ning kolme liigendiga puujalga. UNIXi failidel on tunduvalt enam parameetreid. Faili üheks kõige olulisemaks parameetriks on tema kuuluvus. Igal failil on omanik (owner), kellel on selle faili suhtes eriõigused (näiteks õigus kustutada isegi, kui kustutamine on keelatud). Järgmiseks eristab UNIX omaniku sõpru. Igal UNIXi kasutajal on lisaks username'ile veel grupitunnus. Enamasti valivad ühisee projekti kallal töötavad inimesed endale ühe ühise grupitunnuse (näiteks staff, research, bookkeep või millise iganes kuni 8-tähelise nime ).

Nüüd osutub võimalikuks faile valikuliselt kättesaadavaks teha -- mõned omanikule, mõned tema grupile, mõned aga kõigile soovijaile. Loomulikult saab üks kasutaja vaheldumisi võtta erinevaid grupitunnuseid nende hulgast, mis administraator talle kasutamiseks on võimaldanud.

Teine tähtis mõõde UNIXi failisüsteemis sisaldab endas infot selle kohta, kas faili on lubatud lugeda (read, r), kas tema kallal tohib kasutada salvestus- ja kustutusoperatsioone (write, w) ning kas seda faili tohib käivitada (execute, x). Täiesti normaalsena mainigem olukorda, kus mingi shell-script on omanikule salvestamiseks kinni (et kogemata ei kustutaks), sõpradele lahti vaid lugemiseks (las kopeerivad oma koju ja lasevad seal käima), võõrastele aga üldse kinni. Sellise faili loabitid oleksid järgmised:


-rwxrwxrwx  Need oleksid maksimaalsed õigused
-r-xr-----  Need on vaadeldava faili loabitid
 ^^^        See on omaniku õigusi tähistav kolmik rwx (r-x)
    ^^^     See on grupi õigusi tähistav kolmik   rwx (r--)
       ^^^  See viimane kolmik kehtib ülejäänutele rwx (---)

Loabitte on programmeerijal eriti mugav meeles pidada arvu astmetena: r=4, w=2, x=1 . Ülaltoodud näites on esimese (omaniku-)kolmiku väärtuseks 5 (r+x), grupi kolmiku väärtuseks 4 (r) ning muidumeeste kolmiku väärtuseks 0 . Need numbrid yksteise järel näeksid välja niimoodi: 540 . Lühidalt, kui soovite, et Teie failil oleksid just sellised loabitid, nagu just esitatud näites, andke käsk:

chmod  0540 <failinimi>

UNIX hoiab iga faili juures kolme kuupäeva koos kellaajaga. Üks neist on loomise aeg (Creation Time) ehk tunnusbittide muutmise aeg, teine faili sisu muutmise aeg (Modification Time), kolmas aga Access Time, mis annab aimu, kuna faili viimati kasutati. Tavaline kataloogilisting esitab Modification Time'i, kuid eri võtmetega on võimalik kätte saada ka ülejäänud kaks daatumit. Mõned nuditud UNIXid ei erista loomise ja muutmise aegu. Failiaegu loetakse alates 1. jaanuarist 1970 kella 0:00 Greenwichi järgi ning tehakse seda sekundi täpsusega. Miks just Greenwichi järgi? Aga seepärast, et UNIX suhtleb vahel omasuguste masinatega teistest ajavöönditest ning teeb aeg-ajalt katset mitmesuguseid daatumeid kohaliku aja peale ümber rehkendada. Eesti dekreediaja tähistuseks on EDT, suvel on see sama mis GMT-2, talvel GMT-3.

Kataloogid

UNIX vaatleb katalooge tavaliste failidena, millel on olemas kõik needsamad loabitid. Kataloogi tunnuseks on täht "d":

drwxr-xr-x    1  omanik     grupp       DATE      LENGTH    FILENAME

See on kataloog, mis kuulub kasutajale omanik, kõigil teistel on keelatud sinna midagi juurde salvestada või olemasolevat modifitseerida. Kataloogi sisenemine ja failinimestiku saamine on kõigile lubatud. Kataloogi puhul saavad tähed r; ja x veidi teistsuguse tõlgenduse -- r tähistab õigust kataloogi listingu saamiseks, x aga õigust kataloogi sisenemiseks. Nii on võimalik luua olukord, kus alamkataloogis sisalduvat programmi saab käivitada üksnes see, kes A) teab et seal on executable programm; B) teab programmi täpset nime.

Teatud avalikel kataloogidel seisab x-tähe asemel hoopis T-täht. See märgib kitsendust, kus kataloogi sees saab faili maha kustutada üksnes tema omanik, väitku siis loabitid mida tahes.

Iga UNIX-süsteemi administraator on seadnud teatavad vaikimisi väärtused, millised bitid seatakse vastloodud kataloogidele, (kui kasutada käsku mkdir, tavaliselt drwxr-xr-x) ning vastloodud failidele. Kui teile sysadmin'i valik ei meeldi, seadke omaenda mängureeglid käsuga umask, näiteks umask 022 failis .login on vajalik, kui Te ei soovi oma failide kallal näha kedagi peale iseenda.

Failisüsteemi võimalustest

UNIXi failinime pikkus pole põhimõtteliselt piiratud. Enamik realisatsioone võimaldavad kuni 255-märgilisi failinimesid. Nuditud versioonidel on nime pikkuseks 14 märki, väidetavalt on olemas süsteeme, mis lubavad isegi tuhandeid märke sisaldavaid nimesid (kuigi, kas sel on erilist mõtet). MS-DOSi seisukohalt on vaja märgata, et failinimes tohib kasutada nii suuri kui väikesi tähti, kusjuures süsteem peab selliseid nimesid erinevateks. UNIX ei tunne laiendi mõistet. Te võite ju lisada oma faili lõppu .EXE , UNIXil pole sellest sooja ega külma. Temal on vaid üks käivitamise kriteerium -- x-biti olemasolu. Kui Te seate x-biti püsti oma armastuskirjale, siis saab seda käivitada koos kõigi sellest tulenevate tagajärgedega. Allpool näide, milline võib olla failinimi UNIXis:


total 8
drwxrwxrwt   2 mmdf     mmdf          32 Jun 04  1992 :saved
-rwsr-x--x   1 666      59810          0 Apr 07 12:08 EXECUTABLE
-rw-------   1 root     other          7 Apr 07 12:07 See on
üks experimentaalne_FAILINIMI-mis.DeMoNsTrEeRiB! UNIX'i
failisysteemi omadusi,.<>?~$%^&*()_+
-rw-------   1 root     other          0 Apr 07 12:10 dirlist
-rw-------   1 loll     group        284 Apr 04 14:43 loll
-rw-------   1 root     other          0 Apr 07 11:59 root
-rw-------   1 sys      sys            0 Mar 31 21:30 sys
-rw-------   1 uucp     uucp         602 Apr 06 23:45 uucp

Siiski on sümboleid, mille toppimist failinimedesse peaks vältima. Esmajoones on need kaldkriips / -- UNIX kasutab katalooginimede vahel just sedapidi kaldkriipsu -- ning tärn *. Kustutades faili nimega * võib juhtuda midagi hoopis hullemat :-) . Samasuguseid sekeldusi tekib miinusmärgi puhul. Pole midagi lihtsamat, kui luua fail nimega -r , kuid eks katsuge sellest lahti saada! Shell tõlgendab failinime -r käsu rm võtmena ning nõuab sinna taha veel &umul;hte failinime...

UNIX vaatleb failidena ka välisseadmeid. Kõik sellised seadmed alates ketastest ja lõpetades terminaalidega, on koondatud kataloogi nimega /dev. (Tavalise device-faili loabittide ees seisab täht c või b.) Prooviks kirjutame sõbra terminaaliekraanile sõgedusi käsuga:

echo "Tere Vasja!" > /dev/ttyA

(seda muidugi eeldusel, et see fail on Teile kirjutamiseks lahti). Firma SUN tääjaamadel on kasutusel UNIXi versioon, mis peegeldab /proc kataloogi isegi masinas toimuvad protsessid. Vabalt hangitavas Linuxis on /proc failisüsteem kenasti olemas. Soovi korral võite minna /proc kataloogi ning näha kõiki protsesse koos omaniku nime ja loabittidega.

Eraldi kokkulepe on seotud failidega, mille nime esisümboliks on punkt (.). Tavaline kataloogilisting (ls , ls -li) sääraseid faile ei näita. See on mugav viis varjata tavakasutaja eest faile nimega . (mis tähistab sedasama kataloogi, kus Te parasjagu olete) ning .., (mis tähistab ülemist, nn parent-kataloogi). Ka enamik konfiguratsioonifaile varjavad endid punkti abil, neid saab nähtavale tuua käsuga ls -la.

Võrreldes MS-DOSiga

MS-DOSi failistruktuur on parasjagu puine sellest küljest, et Te saate ühte kataloogi luua vaid piiratud hulga faile (konkreetne arv oleneb ketta tüübist). 720 KByte flopide puhul on maksimumiks veidi üle 100 faili. Rohkem pole failitabelis lihtsalt ruumi, kavaldage palju tahate! Samasugune lugu on faili maksimaalse lubatud pikkusega. Ketta tüübist olenevalt lõpeb FAT varem või hiljem füüsiliselt otsa.

UNIXi failisüsteemis on need piirangud suhteliselt kaugemale liigutatud. UNIX peab eraldi arvestust vabade blokkide (Free Data Blocks) ning vabade i-node'ide (Free i-node List). Termin i-node [i:noud] on midagi täiesti spetsiifilist, millele ei julge isegi eestikeelset vastet pakkuda. See oleks vast iga faili isiklik FAT, kui tohib termineid nii vabalt ümber sõnastada.

Oletame, et Te plaanite luua hästi pika faili. UNIX eraldab Teile ühe i-node'i vabade i-node'ide nimekirjast. Iga i-node sisaldab infot faili omaniku, loabittide ja kõige muu säärase kohta. Sellele järgneb koht, kuhu salvestatakse esimese andmebloki numbrid (midagi FATi taolist). Bloki suuruseks on enamasti 1024 baiti, ehkki pole mingeid takistusi loomaks 512 või 2048-baidiste blokkidega failisüsteeme. Niisiis saab sel viisil maha märkida faile, mille maht on kuni 10240 baiti ( 10 blokki a' 1024 baiti).

i-node'i 11. positsioonile salvestatakse viit (pointer) blokile, mis sisaldab omakorda 1024pointerit andmeblokkidele. Sellise "teist järku" bloki kasutamine võimaldab viiteid kuni 10+256 andmeblokile a' 1024 baiti, nii et kokku saab maha märkidakuni 272384 baidi pikkusi faile. Kui ka sellest ei piisa, siis vastava i-node 12. positsioonile salvestatakse pointer, mis osutab "e;kolmandat järku blokile"e;, tolles on omakorda viited 256 "teist järku" bloki kohta. Taoline mehhaanika võimaldab ära mahutada faile, mille pikkuseks on 1024*(10+256+256^3)=67.381.248 baiti. Ning lõpuks, kui ka sellest väheks jääb, siis sama i-node 13. positsioonil paiknev "neljandat järku" pointer teeb võimalikuks 1024*(10+256+256^2+256^3)=17.247.250.432 baiti pika faili salvestamise. Sellest 7 Gigabaidist peaks piisama ka kõige nõudlikumale häkkerile.

Analoogselt toimub kataloogide manipuleerimine. Näiteks SCO UNIX eraldab kataloogile vaikimisi ruumi 32 sissekande tegemiseks (sealhulgas failid . ja .., mis on vajalikud süsteemi enda tööks). Kui sellest ei piisa, eraldatakse täiendav teist järku blokk ja sissekannete (failinimede) arv kataloogis tõuseb kuni 288-ni. Põhimõtteliselt pole takistusi ka kolmandat ja neljandat järku blokkide hõivamiseks. Ometi ei maksaks erilise vajaduseta sääraseid mammutfaile ja katalooge luua. Igasuguste otsimiskäskude töö aeglustub ekspotentsiaalselt iga järgmist järku bloki jaoks. Ka ei pruugiks põhjuseta kasutada ülipikki failinimesid. Vaadake juuresolevat listingut (saadud käsuga hd .) ning te näete, kuidas lohisev failinimi ruumi raiskab.


0000 3a 18 2e 00 00 00 00 00  00 00 00 00 00 00 00 00  :...............
0010 e7 03 2e 2e 00 00 00 00  00 00 00 00 00 00 00 00  ................
0020 3b 18 3a 73 61 76 65 64  00 00 00 00 00 00 00 00  ;.:saved........
0030 f2 19 75 75 63 70 00 00  00 00 00 00 00 00 00 00  ..uucp..........
0040 f1 19 72 6f 6f 74 00 00  00 00 00 00 00 00 00 00  ..root..........
0050 93 1a 73 79 73 00 00 00  00 00 00 00 00 00 00 00  ..süs...........
0060 4a 1a 6c 6f 6c 6c 00 00  00 00 00 00 00 00 00 00  J.loll..........
0070 b9 18 45 58 45 43 55 54  41 42 4c 45 00 00 00 00  ..EXECUTABLE....
0080 ff ff 53 65 65 20 6f 6e  20 79 6b 73 20 65 78 70   ..See on üks exp
0090 ff ff 65 72 69 6d 65 6e  74 61 61 6c 6e 65 5f 46  ..erimentaalne_F
00a0 ff ff 41 49 4c 49 4e 49  4d 49 2d 6d 69 73 2e 44  ..AILINIMI-mis.D
00b0 ff ff 65 4d 6f 4e 73 54  72 45 65 52 69 42 21 20  ..eMoNsTrEeRiB! 
00c0 ff ff 55 4e 49 58 27 69  20 66 61 69 6c 69 73 79   ..UNIX'i failisy
00d0 ff ff 73 74 65 65 6d 69  20 6f 6d 61 64 75 73 69   ..steemi omadusi
00e0 ff ff 2c 2e 3c 3e 3f 7e  24 25 5e 26 2a 28 29 5f  ..,.<>?~$%^&*()_
00f0 7a 1a 2b 00 00 00 00 00  00 00 00 00 00 00 00 00  z.+.............
0100 ad 18 64 69 72 6c 69 73  74 00 00 00 00 00 00 00  ..dirlist.......
0110 25 1a 68 65 78 6c 69 73  74 00 00 00 00 00 00 00  %.hexlist.......
0120 

UNIXi failisüsteemi ühe pisipuudusena võib märkida seda, et temas puuduvad vahendid kõvaketta kasutuse optimeerimiseks (et blokid paikneksid järjest). Samuti on probleeme kasutatud blokkide tagastamisega. Kui Te olete oma kodukataloogi üheainsa korra üle mainitud lävede kasvatanud ( 30 või 288), siis jääbki töökiirus selles kataloogis madalamale astmele, olgugi et seda põhjustanud failid on ammu kustutatud. Sellise probleemi vastu aitab backup'i tegemine ning failide taastamine backup-magnetlindilt. Korralikus UNIX-süsteemis tehakse backup'i sagedamini, kui kõvaketas väga ära jõutakse jupitada, nii polegi keegi kunagi hakanud Norton SpeedDisk'i -taolisi programme UNIXi jaoks tarvitama.

Mis läind, see läind

UNIXis pole mingit võimalust kustutatud faile tagasi saada. Kui süsteemis tegutseb paarkümmend kasutajat, siis antakse vabanenud blokid küllalt kiiresti järgmisele soovijale, nii et mõni sekund hiljem on Teie õnnetult kustutatud andmed juba üle kirjutatud. Siiski pakutakse suure kettamahuga süsteemidele kavalat lahendust, kus kustutamise asemel antakse failile mingi punktiga algav nimi ning hoitakse siis sellise olekus päev või kaks, et äpu kasutaja jõuaks oma faili tagasi küsida. Siingi päästab õigeaegne backup. Kui Te kogemata midagi maha kustutate, saab päev vanad failid alati magnetlindilt taastada. Muide, backup on tehtav täiesti automaatselt öisel kellaajal, tuleb vaid õige lindikassett vastavasse auku pista.



Järgmine osa, Eelmine osa

The Artwork: PiiX aka Piia Maiste, Fido: 2:490/25.2505