V najpreprostejšem primeru je celotni datotečni sistem Unixa shranjen na enem samem razdelku. Čeprav na tako situacijo naletimo včasih na majhnih sistemih za osebno rabo, ni običajna. Navadno se sistem razteza prek več razdelkov, včasih celo prek več diskov. Tako imamo lahko na primer en čisto majhen razdelek za jedro, večji razdelek za druge datoteke, ki spadajo k operacijskemu sistemu, in ogromen razdelek z uporabniškimi datotekami.
Edini razdelek, do katerega imamo dostop takoj ob zagonu računalnika, je korenski razdelek. Ta je skoraj vedno tisti razdelek, s katerega smo zagnali sistem. Vsebuje korenski imenik datotečnega sistema - vrh razvejene drevesne strukture imenikov.
Da lahko dostopamo do podatkov na ostalih razdelkih, morajo biti ti pridruženi korenskemu. Unix omogoči dostop do njih nekje sredi zagonskega postopka z operacijo, ki ji pravimo priklop (angl. mount). Razdelke priklopimo na obstoječi imenik na korenskem razdelku.
Če imamo, denimo, imenik /usr, je to verjetno priklopna točka za razdelek, ki vsebuje številne programe Unixa, vendar pa noben od njih ni nujno potreben ob zagonu.
Zdaj lahko na datotečni sistem spet pogledamo od vrha. Ko odpremo datoteko, denimo /home/esr/WWW/ldp/fundamentals.sgml, se zgodi naslednje.
Jedro začne iskati pri korenu datotečnega sistema (ta leži vedno na korenskem razdelku), in išče imenik /home. Navadno je /home le priklopna točka za velik razdelek z uporabniškimi programi, ki leži kje drugje, zato jedro sledi na ta razdelek. V vrhnji imeniški strukturi razdelka z uporabniškimi podatki jedro poišče vnos esr in prebere številko pripadajočega inoda. Ko inodu sledi, ugotovi, da gre za imeniško strukturo, in v njej poišče vnos WWW. Ko sledi temu inodu, pride spet do podimenika in v njem poišče ldp, kar ga privede do še enega imeniškega inoda. Odpre ga in v njem poišče inod za fundamentals.sgml. Ta inod ni imenik, ampak vsebuje seznam diskovnih blokov, ki pripadajo datoteki s podanim imenom.
Da programi namerno ali nenamerno ne bi poškodovali podatkov, katerih ne smejo poškodovati, ima Unix urejen sistem dovolilnic. Prvotno - v času, ko je Unix tekel predvsem na velikih in dragih miniračunalnikih - so se uporabljale na sistemih z dodeljevanjem časa, na katerih so uporabnike varovale pred drugimi uporabniki.
Da bi razumeli dovolilnice za datoteke, se moramo spomniti opisa
uporabnikov in skupin v razdelku
Kaj se zgodi, ko se prijavimo v sistem. Vsaka datoteka pripada določenemu lastniku
in določeni skupini. Na začetku ti zavzameta vrednosti, kot ju ima
tisti, ki je datoteko ustvaril, pozneje pa ju lahko spremenimo z
ukazoma chown(1)
in chgrp(1)
.
Osnovna dovoljenja, ki jih lahko vsebuje dovolilnica, so dovoljenje za branje, dovoljenje za pisanje (tudi brisanje ali spreminjanje) in dovoljenje za izvajanje (če je datoteka program). Dovolilnica vsebuje tri nabore dovoljenj: za lastnika; za kogarkoli drugega v skupini, ki ji datoteka pripada; ter za kogarkoli drugega. Pravice, ki jih pridobimo ob prijavi v sistem, so pravice do branja, pisanja in izvajanja tistih datotek, katerih dovolilnice se ujemajo z našo identifikacijsko številko ali katero od identifikacijskih številk skupin, ki jim pripadamo, ali pa datotek, ki so dostopne vsem.
Oglejmo si izpis hipotetičnega sistema, da vidimo, kako stvari delujejo in kako Unix prikaže dovolilnice:
snark:~$ ls -l notes -rw-r--r-- 1 esr users 2993 Jun 17 11:00 notes
To je navadna podatkovna datoteka. Izpis seznama kaže, da je njen
lastnik esr
, skupina, ki ji pripada, pa
users
. Najverjetneje sistem, v katerem je bila ustvarjena,
privzeto postavi vsakega uporabnika v to skupino. Druge skupine, na
katere tudi naletimo na večuporabniških sistemih, so staff
(osebje), admin
(uprava) in wheel
(sistem). Na
enouporabniških sistemih skupine nimajo posebnega pomena. Na nekaterih
sistemih je privzeta skupina lahko drugačna - dostikrat je kar enaka
uporabniškemu imenu.
Niz znakov -rw-r--r--
je dovolilnica za dano
datoteko. Prvi minus kaže imeniški bit. Če bi bil namesto datoteke
imenik, bi tam pisalo d
. Sledijo mu tri mesta, ki kažejo
dovoljenja lastnika (rw-
); sledijo tri mesta, ki kažejo
dovoljenja skupine (r--
) in nazadnje so tri mesta z
dovoljenji za vse ostale (r--
). To datoteko lahko bere in
spreminja samo lastnik (esr
); berejo jo lahko vsi člani
skupine users
, in berejo jo lahko tudi vsi ostali. Takšna
dovolilnica je precej običajna za navadne datoteke.
Zdaj pa še zgled datoteke z nekaj drugačno dovolilnico. Ta datoteka je GCC, prevajalnik GNU C.
snark:~$ ls -l /usr/bin/gcc -rwxr-xr-x 3 root bin 64796 Mar 21 16:41 /usr/bin/gcc
Datoteka pripada uporabniku root
in skupini
bin
. Spreminja jo lahko samo lastnik, bere in izvaja pa
kdorkoli. Takšna dovolilnica je običajna za privzeto nameščene
sistemske ukaze. Skupina bin
je na nekaterih Unixih lastnica
sistemskih ukazov (bin
je okrajšava od ,,binaren``, kar naj
bi namigovalo, da gre za programe). Na vašem sistemu morda ta datoteka
pripada skupini root
(razlikovati moramo med uporabnikom
root
in istoimensko skupino!).
Uporabnik root
z identifikacijsko številko 0 je poseben
uporabniški račun s pravico, da zaobide vse varnostne mehanizme. To je
obenem zelo uporabno in zelo nevarno. Napaka pri tipkanju, ko smo
prijavljeni kot root
, lahko poškoduje kritične sistemske
datoteke, ki se jih isti ukaz, pognan z navadnega uporabniškega
računa, ne bi dotaknil.
Ker je račun root
tako močan, mora biti dostop do njega
varovan zelo skrbno. Geslo za uporabnika root
je najbolj
kritičen element varnosti sistema, in zatorej informacija, ki jo bodo
morebitni vlomilci najprej iskali.
Ko smo že pri geslih - ne zapisujte si jih nikamor, in ne izbirajte gesel, ki jih je enostavno uganiti, kot denimo ime dekleta, fanta, žene... To je osupljivo pogosta slaba navada, ki vlomilcem izjemno olajša delo. V splošnem se izogibajte besedam iz slovarja - obstajajo programi, ki si pri ugibanju gesel pomagajo s slovarji. Dobra so gesla sestavljena iz besede, ki ji sledi števka, in še ena beseda, denimo ,shark6cider` ali ,jump3joy`. S tem razširimo prostor možnih besed toliko, da navadno ugibanje z iskanjem po slovarju ni več uporabno. Seveda ne uporabite podanih zgledov - vlomilci so jih zdaj verjetno že dodali v svoje slovarčke. Zelo uporabna navodila za spisal tudi Mark Martinec z IJS, najdemo jih na naslovu http://www.ijs.si/dobro_geslo.html.
Pa še tretji zgled.
snark:~$ ls -ld ~ drwxr-xr-x 89 esr users 9216 Jun 27 11:29 /home2/esr snark:~$
Ta datoteka je imenik, kar spoznamo po oznaki d
, s katero se
začne dovolilnica. Vidimo tudi, da lahko nanj piše le lastnik
(esr
) berejo in izvajajo pa vsi.
Dovoljenje za branje nam dovoljuje, da izpišemo seznam datotek (in podimenikov) v danem imeniku. Dovoljenje za pisanje pomeni, da lahko v danem imeniku ustvarjamo in brišemo datoteke - slednje le, če imamo tudi dovoljenje za pisanje izbrane datoteke. Če se spomnimo, da je imenik seznam imen datotek in podimenikov, se nam bodo ta pravila zdela smiselna.
Dovoljenje za izvajanje pri imenikih pomeni, da lahko posežemo v imenik in v njem odpiramo datoteke in podimenike. Dejansko nam dovoli dostop do inodov v tem imeniku. V imeniku, ki nima dovoljenja za izvajanje, ne moremo početi nič.
Občasno srečamo imenike, ki jih lahko vsi ,,izvajajo``, ne pa tudi berejo. To pomeni, da lahko kdorkoli dostopa do datotek in podimenikov v tem imeniku, vendar le, če pozna njihovo celotno ime, saj izpis seznama datotek ni dovoljen.
Pomembno je, da se zavedamo, da so dovolilnice za dani imenik povsem neodvisne od dovolilnic za datoteke, ki jih ta imenik vsebuje. Tako nam dovoljenje za pisanje dovoljuje ustvarjanje novih datotek in spreminjanje obstoječih, vendar slednje le, če ni v nasprotju z dovolilnicami za te datoteke. Nikakor pa z dovoljenjem za pisanje v imenik ne dobimo avtomatično tudi dovoljenja za pisanje v vse datoteke v njem.
Za konec si poglejmo dovolilnico za sam program login
.
snark:~$ ls -l /bin/login -rwsr-xr-x 1 root bin 20164 Apr 17 12:57 /bin/login
Datoteka ima dovolilnico, kot jo pričakujemo za programe - z edino
razliko, da na mestu, kjer bi pričakovali dovoljenje, da jo lastnik
izvaja (torej x
), stoji s
. Tako v seznamu datotek
izgledajo datoteke, ki imajo posebno dovoljenje, imenovano
,,set-user-id`` ali na kratko setuid.
Dovoljenje setuid navadno izdamo programom, ki morajo navadnim
uporabnikom izjemoma dovoliti katero od pravic uporabnika
root
, vendar seveda nadzorovano. Ko poženemo program, program
teče s pravicami lastnika programa in ne s pravicami tistega, ki je
program pognal, kot je običajno.
Kot uporabniški račun root
so tudi programi setuid uporabni,
a nevarni. Kdorkoli, ki si lahko podvrže ali spremeni program setuid,
katerega lastnik je root
, lahko požene novo ukazno lupino s
pravicami uporabnika root
. Zato vsi sodobni sistemi Unix
pobrišejo bit setuid
tisti trenutek, ko datoteko odpremo za
pisanje. Veliko vdorov v sisteme Unix je povezanih z izkoriščanjem
varnostnih vrzeli v programih setuid. Sistemski skrbniki, ki se
zavedajo teh težav, so zato pri njih posebej previdni in neradi
nameščajo nove.
Površno smo pri razpravi o dovolilnicah preskočili nekaj pomembnih podrobnosti, namreč, kako se novo ustvarjeni datoteki določi dovolilnica, lastnik in skupina. Lastnik je tisti, ki je datoteko ustvaril, pri skupini pa stvari niso tako jasne, saj je uporabnik lahko član več skupin. Vendar pa je med njimi le ena privzeta skupina (tista, ki je navedena v /etc/passwd), in vse novo ustvarjene datoteke bodo pripadale tej skupini.
Zgodba z začetnimi dovolilnicami je nekoliko bolj zapletena. Privzeta
dovoljenja lahko spreminjamo s spremenljivko umask
v
okolju. Spremenljivka umask
določa, kateri biti naj bodo
izključeni, ko ustvarimo novo datoteko. Običajna vrednost na
večini sistemov je -------w-
oziroma 002, ki uporabnikom
izven privzete skupine ne dovoljuje spreminjanja datoteke. Več o
spremenljivki umask
lahko preberete v priročniku za ukazno
lupino.
Tudi izbira skupine pri imeniku je nekoliko zapletena. Na nekaterih
Unixih vsak novo ustvarjeni imenik postane član privzete skupine
tistega, ki je imenik ustvaril (dogovor izvira iz sistemov Unix System
V), na drugih pa podeduje skupino od nadrejenega imenika (kot v
sistemih BSD). V sodobnih sistemih Unix, vključno z Linuxom, je
privzeta prva možnost, drugo pa lahko vklopimo z nastavitvojo bita
set-group-ID
, kar storimo z ukazom chmod g+s
.
Že prej smo povedali, da so datotečni sistemi občutljive zadeve. Zdaj vemo, da moramo včasih prehoditi precej dolgo pot prek vnosov v imenikih in tabelah inodov, da pridemo do datoteke. Zdaj pa si predstavljajmo, da kakšen od sektorjev na disku postane slab.
Če imamo srečo, je napaka nastala na podatkovnem delu, kar pomeni samo nekaj izgubljenih podatkov v datoteki. Če je nimamo, je lahko napaka nastala v imeniški strukturi ali pa v tabeli inodov. To pomeni, da je cel podimenik sicer ostal na disku, vendar ne moremo do njega. Ali še slabše, struktura lahko ostane okvarjena, tako da kaže na napačne inode ali diskovne bloke. Takšna vrsta okvare je zoprna, ker se zaradi napačne evidence širi tudi izven prvotnega območja in kvari podatke na disku.
Na srečo so tovrstne težave s tem, ko diski postajajo vse bolj zanesljivi, vse redkejše. Vseeno pa Unix vsake toliko časa preveri integriteto datotečnega sistema, da bi odkril morebitne težave. Sodobni sistemi Unix opravijo hiter preizkus integritete sistema ob zagonu vsakič, preden priklopijo razdelek. Vsakih nekaj ponovnih zagonov pa opravijo temeljitejši preizkus, ki traja nekaj minut.
Če vse to daje vtis, da je Unix strahotno zapleten in nagnjen k napakam, bo morda v majhno tolažbo to, da ti preizkusi ob zagonu navadno ujamejo in popravijo napake, še preden te zadobijo katastrofalne razsežnosti. Drugi operacijski sistemi navadno tega ne počnejo, s čimer je zagon sicer nekoliko hitrejši, vendar pa se lahko naenkrat znajdete pred dosti bolj zavoženim sistemom, ko ga morate ročno popraviti (če sploh imate pri roki Norton Utilities ali kaj podobnega).
Eden od trendov v trenutnih zasnovah Unixa so datotečni sistemi z dnevnikom (angl. journalling file system). Ti vse diskovne transakcije organizirajo tako, da je sistem v zajamčeno konsistentnem stanju, ki ga je mogoče restavrirati ob zagonu. To bo preizkuse integritete ob zagonu znatno skrajšalo.