Skozi grede > Ropotarnica

Operacijski sistem Unix

Uvod - Zagonska veriga - Delovanje in zaustavitev - Datotečni
sistem - Virtualne konzole - Delovanje v ospredju in ozadju -
Zgradba in pisanje ukaza - Tok podatkov in cevovodi - Specialni
lupinski znaki - Ukazni vzdevki in spremenljivke - Datotečna
meta imena - Tekstovni meta nizi


Uvod

    Unix je večopravilni in večuporabniški operacijski sistem.
    K. Thompson in D. Ritchie sta ga napisala 1974 v programskem
    jeziku C; vanj sta vložila 10 inženirskih let dela. Unix je
    bil napisan za računalnik PDP-11, kasneje pa nameščen na
    druge stroje. Brezplačno okleščeno kopijo Unixa, Linux, je
    1991 za PC napisal L. Torvalds. Od takrat sta se Linux in
    programska oprema zanj razvila in razširila po vsem svetu.
    Unix/Linux je najboljši operacijski sistem, kar jih je do
    sedaj naredilo človeštvo. Je majhen, preprost, modularen,
    robusten, hiter in fleksibilen. Zlasti je primeren za tehnike,
    inženirje in znanstvenike.


Zagonska veriga

    BIOS. Ko prižgemo računalnik, začne procesor izvrševati
    program BIOS (Basic Input Output System), ki je zapečen v
    posebnem pomnilniškem čipu ROM. BIOS zna dostopati do
    priključenih enot: magnetnega diska, optičnega diska,
    polprevodniškega vtiča in drugih. BIOS dostopa do teh enot po
    določenem zaporedju; prva enota, kjer najde operacijski
    sistem, obvelja. Preden procesor začne delati po BIOS, malo
    počaka. Če takrat pritisnemo posebno tipko, navadno [F2],
    lahko v BIOS vnesemo vrstni red dostopanja do enot, zaščito z
    geslom in še marsikaj drugega.

    LILO. Naj bo operacijski sistem na trdem disku. Na trdem disku
    pogleda BIOS v prvi sektor, MBR (Master Boot Record). Tam je
    nameščen program LILO (Linux Loader), ki se začne izvajati.
    LILO ima v sebi zapisano, kje na disku je nameščeno jedro
    (kernel) operacijskega sistema Linux. Naloži ga v pomnilnik in
    ga začne izvajati. Preden LILO naloži jedro, izpiše njegovo
    ime, recimo linux, in obvestilo "boot:" ter malo počaka. Sedaj
    lahko odtipkamo kakšne parametre in LILO jih bo posredoval
    jedru.

    Kernel. Jedro ima v sebi zapisano, kje na disku je datotečni
    sistem Linux; tam so zapisani različni programi. Iz
    datotečnega sistema se naloži v pomnilnik izvršni program
    init in se začne izvajati.

    Init. Init pogleda v datoteko inittab. Tam so zapisana imena
    zagonskih skriptov, ki se naj izvršijo. Tipično sta to
    najprej rc.S in nato rc.M. Zapisano je tudi, kaj se zgodi s
    sistemom, če na konzoli pritisnemo [Ctrl-Alt-Del]; tipično
    se sistem izključi.

    Zagonski skripti. Izvrši se vse, kar je zapisano v zagonskih
    skriptih. Iz obeh skript se kličejo drugi skripti. Ko so vsa
    skripta izvršena, zažene init program agetty, ki na konzolo
    zapiše "login:" ter čaka, da se bo kak uporabnik priključil.
    Računalnik je pripravljen za delo.


Delovanje in zaustavitev

    Ukazna lupina in uporabnik. Uporabnik odtipka svoje ime in
    geslo. Init zažene poseben program - ukazno lupino, tipično
    bash, ki se javi z znakom "$". Vse, kar sedaj tipkamo, prevzame
    bash in temu ustrezno ravna. Tipkamo ukaze. Nekatere zna
    izvršiti bash sam, za druge pa pokliče ustrezne programe.
    Nekateri programi po zagonu komunicirajo z uporabnikom. Na
    koncu se odjavimo s posebnim ukazom in na zaslonu se spet
    pokaže "login:". Preden se bash oglasi, prebere datoteko
    .profile, ki določa njegovo ravnanje.

    Uporabnik root. Uporabnik z imenom root je priviligiran. Ko se
    prijavi, se mu bash oglasi z "#". Uporabnik root lahko
    izvršuje ukaze, ki jih drugi ne morejo. Specialno lahko v LILO
    na MBR zapiše zaščito z geslom ter ime in lokacijo jedra; v
    jedro lahko zapiše lokacijo datotečnega sistema; popravlja
    lahko zagonske skripte; dodaja veljavna uporabniška imena in
    gesla ali jih odvzema in podobno. Končno lahko odtipka tudi
    ukaz, ki zaključi delo operacijskega sistema Linux, nakar
    lahko računalnik ugasne.

    Okna X. Uporabnik lahko s posebnim ukazom požene okenski
    strežnik X ter izbran vmesnik, recimo ion. Izbrani vmesnik je
    zapisan v uporabnikovi datoteki .xinitrc. Vmesnik omogoča, da
    se na zaslonu odpirajo in zapirajo okna, v katerih "so"
    programi. Odtlej uporabnik komunicira s tem vmesnikom in s
    programi v oknih. Večinoma komunicira tako, da z miško klika
    po raznih menijih. Delo konča z ukazom, ki je odvisen od
    uporabljenega vmesnika. S tem se vrne nazaj k bash.


Hierarhični datotečni sistem

    Izvršni binarni programi ter njihovi vhodni ali izhodni
    podatki so zapisani v datotekah, tipično na magnetnem disku.
    Datoteke so osnovni sestavni del datotečnega sistema. Drugi
    del so imeniki; to so posebne datoteke, v katerih so zapisana
    imena drugih datotek. Tak imenik je torej "mapa", ki "vsebuje"
    druge datoteke. Imenik lahko vsebuje druge imenike. Celotna
    imeniška struktura ima obliko drevesa, ki raste iz enega
    samega osnovnega imenika.

    Preko bash referenciramo datoteke z njihovim polnim imenom, ki
    vključuje vse zaporedne imenike od osnovnega navzdol, ločene
    z znakom /, ter ime datoteke same. Na primer:
    /usr/bin/joe. Ime imenika ali datoteke lahko vsebuje
    znake a-z, A-Z, 0-9, minus, plus, podčrtaj in piko. Male in
    velike črke se ločijo. Ime datoteke ali (pod)imenika
    ne sme biti daljše od 32 znakov.

    Tipična struktura datotečnega sistema je naslednja:
        
    ==========================================================
    Imenik                      Vsebina
    ----------------------------------------------------------
       /
          /boot                 Jedro
          /dev                  Periferne enote
          /etc                  Zagonski skripti
          /lib                  Programske knjižnice
          /bin                  Osnovni programi
          /sbin                 Osnovni sistemski programi
          /usr                  Dodatni programi
              /etc
              /lib
              /bin
              /sbin
          /opt                  Dodatni programi za X
          /root                 Uporabnik root
          /home
              /USER             Uporabnik USER
          /mnt                  Priključene enote
          /var                  Log datoteke
          /tmp                  Začasne datoteke
    ----------------------------------------------------------

    Vsaka datoteka je sestavljena iz glave in telesa. V telesu so
    podatki, v glavi "atributi": kakšnega tipa je datoteka
    (imenik, navadna datoteka ali kaj tretjega), kdo je njen
    lastnik, ali je lastniku in drugim dovoljeno iz nje brati ali
    vanjo pisati, kdaj je bila zadnjič brana, kdaj spremenjena in
    še kaj. Posebni ukazi omogočajo pregled in nastavitev
    nekaterih atributov.

    Vsak uporabnik ima svoj lastni imenik pod imenikom /home,
    katerega vsebino lahko z ukazi preoblikuje, kakor hoče:
    dodaja, briše, preimenuje in premešča podimenike in
    datoteke. Do drugih imenikov nasplošno nima takega dostopa, ki
    bi bil zanje lahko škodljiv. Uporabnik root ima neomejen
    dostop do vseh imenikov.


Virtualne konzole

    Fizično konzolo, za katero sedimo, lahko uporabimo kot več
    virtualnih konzol, tipično štiri. Izbrano izmed njih
    dosežemo s tipko [Ctrl-Alt-F1]..[Ctrl-Alt-F4]. Na njej se
    pokaže napis "login:" in lahko se prijavimo. Prijavimo se
    lahko na več virtualnih konzol in kot različni uporabniki.
    Vsakokrat se nam oglasi nov bash. Potem na teh konzolah delamo
    in kadarkoli med njimi preklapljamo z navedenimi tipkami.
    Preklapljanje je možno samo v konzolnem načinu dela; v
    okenskem ni možno. Unix dela za vse uporabnike "hkrati"; to
    počne tako, da dela hipec za prvega, nato hipec za drugega in
    tako naprej. Hipci so tako kratki, da uporabnik ne opazi
    kasnitev pri svojem delu.


Delovanje v ospredju in ozadju

    Bash lahko izvršuje ukaze na dva načina: v ospredju in
    ozadju. Ukaz COMMAND, zapisan v obliki

        $ COMMAND ; [Enter]

    izvrši do konca, nato šele spet pokaže svoje obvestilo;
    pravimo, da se ukaz izvaja v ospredju. Podpičje na koncu
    vrstice lahko spustimo. Ukaz, zapisan v obliki

        $ COMMAND & [Enter]

    pa začne izvrševati, vendar takoj spet pokaže svoje
    obvestilo ter s tem pripravljenost na sprejemanje novih ukazov,
    medtem ko se dani ukaz še izvršuje; pravimo, da su ukaz
    izvaja v ozadju.


Zgradba in pisanje ukaza

    Posamičen ukaz ima lahko naslednjo splošno obliko:

        COMMAND -ABC -D NNN OPERAND1 OPERAND2 ...

    A, B in C so enočrkovna "stikala", ki jih razume ukaz, in po
    njih prilagaja svoje delo, -D NNN pa je stikalo s parametrom.
    Posamezna stikala lahko pišemo ločeno, -A -B, ali pa skupaj,
    -AB. OPERAND1 in drugi so operandi, tipično imena datotek, s
    katerimi naj ukaz kaj počne. Stikala so specifična za vsak
    ukaz. Nekateri ukazi nimajo niti stikal niti operandov. Male
    črke so drugačni znaki od velikih.

    COMMAND je lahko polno datotečno ime programa, torej
    vsebujoče imeniški del (na primer /bin/date), ali pa zgolj
    golo ime (na primer date). Če je ime golo, išče bash po
    vrsti po vnaprej določenih imenikih, dokler ne najde. Kateri
    so ti imeniki, lahko določi uporabnik s posebnim ukazom.

    Pri tipkanju ukaza se lahko zmotimo. Preden odtipkamo
    [Enter], lahko vrstico popravljamo. Delujejo ustrezne tipke
    [Left], [Right], [Delete].

    Nekateri ukazi so dolgi. Če natipkamo samo začetek in nato
    tipko [Tab], bash avtomatično dopolni ukaz do tiste dolžine,
    od katere naprej je več možnosti. Uporabnik nato nadaljuje s
    tipkanjem. Lahko pa drugič pritisne [Tab] in bash pokaže vse
    možnosti nadaljevanja.

    Vse ukazne vrstice, ki smo jih že odtipkali, bash shranjuje.
    Po njih se sprehajamo s tipkama [Shift-PgUp] in
    [Shift-PgDown] in jih aktiviramo.

    
Tok podatkov in cevovodi

    Kjerkoli je smiselno, so ukazi takšni, da sprejemajo vhod s
    tipkovnice in pišejo rezultate ter napake na zaslon. Pravimo,
    da čitajo iz stdin, pišejo rezultate na stdout in napake na
    stderr.

    Če je izpis na zaslon dolg, ga ustavimo s tipko [Scroll Lock].
    To pride v poštev le pri počasnem izpisovanju. Nekaj sto
    zadnjih zaslonskih vrstic (tistih, ki smo jih pisali mi in
    onih, ki jih je izpisal računalnik) je tudi shranjenih; po
    njih se premikamo s tipkama [Shift-PgUp] in [Shift-PgDn].

    Vhod in izhod lahko preusmerimo na datoteko. Namesto na zaslon
    piši v datoteko OUTFILE:

        COMMAND > OUTFILE           piši rezultate
        COMMAND 2> OUTFILE          piši napake

    Predhodna vsebina datoteke se pri tem pobriše. Če želimo v
    datoteko dodajati, uporabimo namesto znaka > znak >>.

    Namesto s tipkovnice čitaj vhodne podatke iz datoteke INFILE:
    
        COMMAND < INFILE

    Izhod prvega ukaza lahko neposredno uvedemo v drugi progam.
    Pravimo, da ju povežemo s cevjo:

        COMMAND1 | COMMAND2

    Primer je date | wc, kar pomeni: "izpiši" datum in čas, nato
    pa preštej, koliko vrstic, besed in znakov je v "izpisu" ter
    rezulat zapiši na zaslon. Povežemo lahko tudi več ukazov.


Specialni lupinski znaki

    Bash razume posebne specialne znake, ki uravnavajo njegovo
    delovanje, na primer izvajanje v ospredju in ozadju,
    preusmeritev in cevovod ter drugo. Specialnih znakov ne
    posreduje naprej ukazom. Če jim jih hočemo posredovati v
    operandih, jim moramo predhodno odvzeti specialni pomen.

    Vsi specialni znaki (nekatere smo že spoznali, druge še bomo)
    so naslednji:

        ; &         Zaporedno in vzporedno izvajanje ukazov
        ( )         Grupa ukazov, izvrši v podlupini
        { }         Grupa ukazov, izvrši v tekoči lupini
        < > |       Preusmeritev toka in cevovod
        ~ * ? [ ]   Ekspanzija datotečnih imen
        $           Vsebina spremenljivke ali izhod ukaza
        #           Komentar
        " ' \       Odvzem pomena specialnim znakom

    Odvzem pomena specialnim znakom:

        \       Naslednji specialni znak naj bo normalen
        "  "    Vsak specialni znak znotraj naj bo normalen, z
                izjemo znaka $, ki obdrži specialni pomen.
        '  '    Vsak specialni znak znotraj naj bo normalen


Ukazni vzdevki in okoljske spremenljivke

    Poljubnemu ukaznemu nizu znakov lahko določim njegov vzdevek.
    Kadarkoli potem tipkamo vzdevek, ga bash nadomesti s prvotnim
    nizom znakov. Tako si skrajšamo tipkanje dolgih ukazov.
    Vzdevek ALIAS za zaporedje tekstovnih znakov TEXT, ki vsebuje
    lahko tudi presledke, deklariramo takole:

        alias ALIAS='TEXT'

    Primer: alias date='date -ü. Bash si zapomni vzdevek, dokler
    smo prijavljeni. Ko se odjavimo, ga pozabi. Lahko pa vse
    deklaracije spravimo v datoteko .profile in bash jih prebere
    ter si jih zapomni vsakokrat, ko se prijavimo. Kakšne vzdevke
    bash trenutno pozna, ugotovimo kar z ukazom "alias". Če je
    alias identičen imenu kakega drugega programa, bash vedno
    izvrši alias, razen če mu eksplicitno odvzamemo pomen:
    \ALIAS.

    Tekstovne nize lahko spravljamo tudi v okoljske spremenljivke.
    Nekateri programi namreč gledajo specifične spremenljivke in
    uravnavajo svoje delo glede na njihovo vrednost. Spremenljivko
    ENVAR deklariramo kot

        export ENVAR='TEXT'

    Bash jo hrani, dokler smo prijavljeni. Lahko pa jo tudi
    deklariramo v datoteki .profile in potem jo bash naredi
    vsakokrat, ko se prijavimo. Kakšne so trenutno znane
    spremenljivke, vidimo z ukazom "printenv".


Datotečna meta imena

    Kadar želimo ukazu posredovati več imen datotek, to storimo z
    ustreznimi meta-oznakami ~, *, ?, [] in {} v imenu datoteke.
    Pri tem pomenijo oznake naslednje:

        ~            domači imenik
        *            poljuben niz
        ?            poljuben znak
        [abc]        eden izmed znakov a, b, c
        [a-z]        eden izmed znakov a..z
        {bin,etc}    eden izmed nizov bin, etc

    Primeri:

        *, *.txt, memo.*
        fig?.gif, fig??.gif
        table[123].tex, table[1-9].tex
        memo.{txt,tex,xht}

    Iz meta-imena naredi bash najprej celotni seznam popolnih
    imen, nato pa tega posreduje zunanjemu programu.


Tekstovni meta nizi

    Nekateri ukazi zahtevajo kot enega izmed parametrov tekstovni
    "vzorec". Tekstovni vzorec (regular expression) opisuje
    strukturo kakšnega tekstovnega niza (vrstice). Vsebuje
    metaznake s posebnim pomenom:

        .        Katerikoli znak
        [ABC]    Znak A, B ali C
        [A-Z]    Katerikoli znak A..Z
        [^ABC]   Katerikoli znak razen A, B, C
        *        Nič-poljubnokratna ponovitev prejšnjega znaka
        ^        Začetek vrstice
        $        Konec vrstice
        +?()|    Nepotrebno
        \        Izključi specialni pomen metaznakom

    Primeri:

      Vrstica, ki vsebuje vsaj en znak: .     
      Celotna vrstica: .*
      Vrstica, ki se začne s #: ^#
      Prazna vrstica: ^$  
      XHTML tag: <[^>]>