Naprej Nazaj Kazalo

11. Priklopne točke

V najpreprostejšem primeru je celotni datotečni sistem Unixa shranjen na enem samem razdelku. Čeprav na to naletimo včasih v majhnih sistemih za osebno rabo, ni običajno. 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 velikanski 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 uporabljamo podatke na drugih 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 imenik na korenskem razdelku.

Če imamo, denimo, imenik /usr, je to verjetno priklopna točka za razdelek s številnimi programi Unixa, vendar pa noben od njih ni nujno potreben ob zagonu.

11.1 Pot do datoteke na disku

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 obsega seznam diskovnih blokov, ki pripadajo datoteki s podanim imenom.

11.2 Lastništvo datotek, dovolilnice in varnost

Da programi ne bi namerno ali nenamerno poškodovali podatkov, katerih ne smejo poškodovati, ima Unix urejen sistem dovolilnic. Prvotno -- v času, ko je Unix tekel predvsem v velikih in dragih miniračunalnikih -- so se uporabljale v sistemih z dodeljevanjem časa, v 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 obsega 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 v večuporabniških sistemih, so staff (osebje), admin (uprava) in wheel (sistem). V enouporabniških sistemih skupine nimajo posebnega pomena. V 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 druge (r--). To datoteko lahko bere in spreminja samo lastnik (esr); berejo jo lahko vsi člani skupine users in berejo jo lahko tudi vsi drugi. Taka dovolilnica je precej običajna za navadne datoteke.

Zdaj pa še zgled datoteke z nekoliko 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. Taka dovolilnica je običajna za privzeto nameščene sistemske ukaze. Skupina bin je v nekaterih Unixih lastnica sistemskih ukazov (bin je okrajšava za ,,binaren``, kar naj bi namigovalo, da gre za programe). V 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 nadvse olajša delo. Na splošno se izogibajte besedam iz slovarja -- nekateri programi 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 je 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 dopušča, 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č.

Tu in tam najdemo imenike, ki jih lahko vsi ,,izvajajo``, ne pa tudi berejo. To pomeni, da lahko kdorkoli uporablja datoteke in podimenike v tem imeniku, vendar le, če pozna njihovo celotno ime, saj si ni dovoljeno izpisati seznama datotek.

Zavedati se moramo, da so dovolilnice za dani imenik povsem neodvisne od dovolilnic za datoteke v tem imeniku. Tako nam dovoljenje za pisanje dovoljuje ustvarjati nove datoteke in spreminjati stare, 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 oglejmo 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 - le s to razliko, da je na mestu, kjer bi pričakovali dovoljenje, da jo lastnik izvaja (torej x), s. Tako so na seznamu datotek videti 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 v navadi.

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 zbrišejo bit setuid tisti hip, ko datoteko odpremo za pisanje. Veliko vdorov v sisteme Unix je povezanih z izkoriščanjem vrzeli v varnosti programov setuid. Upravitelji sistema, 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 v večini sistemov je -------w- ali 002, ki uporabnikom zunaj privzete skupine ne dovoljuje spreminjati datoteke. Več o spremenljivki umask si lahko preberete v priročniku za ukazno lupino.

Tudi izbira skupine pri imeniku je nekoliko zapletena. V nekaterih Unixih vsak novo ustvarjeni imenik postane član privzete skupine tistega, ki je imenik ustvaril (dogovor izvira iz sistemov Unix System V), v drugih pa podeduje skupino od nadrejenega imenika (kot v sistemih BSD). V sodobnih sistemih Unix, tudi v Linuxu, je privzeto prvo, drugo pa lahko vklopimo z nastavitvijo bita set-group-ID; to storimo z ukazom chmod g+s.

11.3 Kako gredo stvari lahko narobe

Že prej smo povedali, da so datotečni sistemi občutljivi. 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 kateri od sektorjev na disku postane slab.

Če imamo srečo, je napaka nastala na podatkovnem delu, to pa pomeni samo nekaj izgubljenih podatkov v datoteki. Če datoteke nimamo, je lahko napaka nastala v imeniški strukturi ali pa v tabeli inodov. To pomeni, da je ves 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. Taka okvara je zoprna, ker se zaradi napačne evidence širi tudi zunaj 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 tu in tam preveri integriteto datotečnega sistema, da bi odkril morebitne težave. Sodobni sistemi Unix hitro preizkusijo integriteto 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 dobijo katastrofalne razsežnosti. Drugi operacijski sistemi navadno tega ne počnejo. S tem je zagon resda nekoliko hitrejši, vendar pa se lahko naenkrat znajdete pred dosti bolj zavoženim sistemom, ki ga morate ročno popraviti (če sploh imate pri roki Norton Utilities ali kaj podobnega).

Ena od usmeritev 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.


Naprej Nazaj Kazalo