Tietokoneen käytön ja ohjelmoinnin alkeet

Kurssin kotisivulle


6 Unixin alkeita

Unixin komennot ovat yleensä muotoa:

   komento [<valitsin>]* [tiedosto]*
   <valitsin> ::= -<kirjain> | --<merkkijono>

Komento on yleensä jonkin suoritettavan ohjelman tai komentotiedoston nimi. Se voi olla myös käyttäjän oma ohjelma. Kuten C-kielen yhteydessä kerrotaan, ohjelmat voidaan kirjoittaa niin, että niille voidaan välittää tietoja komentorivillä aivan samalla tavoin kuin varsinaisille käyttöjärjestelmän komennoille.

Unixin komennoille on ominaista äärimmilleen viety lyhyys. Komennot ovat usein vain parin--kolmen merkin mittaisia. Useimmat valitsimet ovat yhden kirjaimen mittaisia. Valitsimilla säädellään komennon toimintatapaa. Esimerkiksi komento ls (list) antaa tiedostoista luettelon, jossa luetellaan vain tiedostojen nimet. Valitsimella -l (long) eli antamalla komento ls -l saadaan pitempi luettelo, jossa on tietoa myös tiedostojen ominaisuuksista.

Yleisrakenne

Unixin perustana on suhteellisen pieni ohjelma, ydin (kernel). Se huolehtii mm. muistin varaamisesta ja muista laitteistoa suoranaisesti koskevista tehtävistä. Ydin on laitteistosta riippuva osa, joka on tavallisesti kirjoitettu assemblerilla. Kun käyttöjärjestelmä siirretään eli portataan toisenlaiselle laitteistolle, lähinnä ydintä joudutaan muokkaamaan.

Seuraavan kerroksen ohjelmat kommunikoivat ytimen kanssa systeemikutsujen (system call) välityksellä. Ne ovat tarkasti standardoituja ja laitteistosta riippumattomia. Näin ylemmän tason ohjelmat siirtyvät (periaatteessa) sellaisinaan laitteistolta toiselle.

Ylimpänä ovat erilaiset sovellusohjelmat, jotka käytävät hyväkseen käyttöjärjestelmään kuuluvia ohjelmia.

Versiot

Tunnetuimpia "vanhan" Unixin versioita ovat AT&T:n System V ja Berkeleyn yliopiston BSD, joista useimmat eri laitevalmistajien omat Unixit ovat kehittyneet.

Eri versiot näkyvät käyttäjälle erilaisina, mutta myös ylläpidon kannalta ne ovat erilaisia mm. erilaisten tiedostojärjestelmien vuoksi.

Linux on kokenut saman ja jopa vielä pahemman haarautumisen eri suuntiin. Laskentatavasti riippuen erilaisia versioita on tällä hetkellä jo pari--kolmesataa. Nyt varsinkin yliopistoissa yleistyvä Ubuntu alkaa käyttöliittymältään muistuttaa aika paljon Windowsia. Se on aikaisempia selvemmin tarkoitettu vain henkilökohtaisessa käytössä oleviin koneisiin. Laitteiden hallinta on tullut onneksi paljon helpommaksi kuin aikaisemmissa versioissa.

Linuxia saa kopioida vapaasti, mutta kuka tahansa saa myös tehdä siitä paketin, jota myy kaupallisesti. GNU-lisenssin ehtoihin kuitenkin kuuluu, että myös näitä versioita saa ruveta levittämään vapaasti. Siten kaupallisen version on tarjottava jotakin lisäarvoa, kuten dokumentointia tai asiakastukea.

Opastusjärjestelmät

Unixin mukana tulee tavallisesti kaksi erilaista tietokoneella luettavissa olevaa dokumenttijärjestelmää.

Unixin alkuperäinen opastusjärjestelmä toimii komennolla man (manual). Esimerkiksi man ls kertoo komennon ls käytöstä. Unixille ominaiseen tyyliin ohjeet ovat erittäin tiivitä. Oppikirjana manuaalisivuja ei voi käyttää. Niistä on eniten hyötyä käyttäjälle, joka on jo perillä Unixin alkeista ja haluaa katsoa esimerkiksi, mitä valitsimia jollakin komennolla on.

Komento man käyttää manuaalisivujen esittämiseen vi-editoria. Ruudun tai ikkunan alareunassa näkyy joko kehote : tai jotakin tietoa manuaalisivusta. Siihen voi itse asiassa kirjoittaa rivieditorin ed komentoja. Käytännössä tarvitaan vain muutamaa komentoa. Välilyönnillä päästään seuraavalle sivulle, ja komennolla q (quit) lopetetaan manuaalisivujen selaus. Sivuilta voi myös etsiä tiettyä merkkijonoa. Kun kirjoittaa /FILES ja painaa enteriä, man siirtyy riville, jossa esiintyy teksti FILES ja jossa kerrotaan komentoon liittyvistä tiedostoista. Saman merkkijonon seuraavaan esiintymään pääsee lyhyesti komennolla /<enter>. Nuolinäppäimet toimivat joissakin versioissa. Asia selviää helpoimmin kokeilemalla.

Toinen dokumentointijärjestelmä käynnistyy komennolla info. Se käyttää tekstien esittämiseen emacs-editoria. Käyttöohjeita pääsee tutkimaan sanomalla info info. Nuolinäppäimillä voi sitten siirtyä riville, jossa lukee * Getting Started, ja painamalla enteriä.

Käyttäjätunnukset

Unix-koneessa kullakin käyttäjällä on oma käyttäjätunnus ja siihen liittyvä salasana. Tavallisten käyttäjien lisäksi on myös yksi ylikäyttäjä, jonka käyttäjätunnus on root. Ylikäyttäjällä on kaikki oikeudet tehdä mitä tahansa; tunnusta tarvitaan järjestelmän ylläpitoon, mihin kuuluu uusien käyttäjätunnusten luominen.

Käyttäjätunnusta luotaessa käyttäjälle määritellään ryhmä, johon käyttäjä kuuluu. Käyttäjä voi määritellä tiedostojensa suojaukset esimerkiksi niin, että myös muut saman ryhmän käyttäjät pääsevät niihin käsiksi, mutta ryhmän ulkopuoliset eivät.

Käyttäjätunnus suojataan salasanalla. Käyttäjä voi milloin tahansa muuttaa salasanaansa komennolla passwd. Monissa järjestelmissä käyttäjä joutuu vaihtamaan salasanansa viimeistään tietyn määräajan kuluttua. Nykyisin monet järjestelmät tarkistavat, että salasana on riittävän pitkä eikä johdettavissa käyttäjän nimestä tai käyttäjätunnuksesta. Myös tavalliset sanakirjasta löytyvät sanat voidaan kieltää.

Käyttäjän kirjoittautuessa sisään järjestelmä kysyy käyttäjätunnuksen ja salasanan. Systeemin ja käyttäjän alustustiedostoissa on määritelty, millaisia ikkunoita käyttäjälle avataan automaattisesti.

Sisään- ja uloskirjautuminen vie nykyisissä ikkunointiympäristöissä aikaa. Jos on tarpeen tehdä jotakin väliaikaisesti toisen käyttäjän tunnuksella tai ylikäyttäjänä, se on mahdollista komennolla su. Komento ilman argumentteja tekee käyttäjästä ylikäyttäjän (root), jos tämä tietää oikean salasanan. Komennolle voidaan myös antaa argumentiksi toinen käyttäjätunnus, jolloin kysytään kyseisen käyttäjän salasanaa. Komento vaihtaa käyttäjän vain siihen ikkunaan, jossa komento on annettu. Komennolla sudo voidaan suorittaa yksittäinen komento ylikäyttäjänä. Ubuntussa ylikäyttäjän oikeudet annetaan yhdelle tavalliselle käyttäjälle. Kun tämä yrittää tehdä jotakin lisäoikeuksia vaativia toimenpiteitä, järjestelmä vaarmistaa asian kysymällä hänen salasanansa.

Komentotulkit

Komentotulkki (shell) on itse asiassa vain yksi ohjelma, joka lukee käyttäjän komentoja ja käynnistää niiden edellyttämät ohjelmat. Komentotulkki voidaan vaihtaa vapaasti. Ikävä puoli tässä on, että eri komentotulkit toimivat eri tavoin. Tosin kaikki ymmärtävät tavallisia Unixin komentoja. Erot tulevat esiin erityisesti komentotiedostoissa, joissa on mahdollista käyttää ohjelmointikielten tapaisia rakenteita. Tavallisen käyttäjän kannalta tästä ei ole kovin suurta haittaa.

Alkuperäisiä komentotulkkeja ovat Bourne-shell ja C-shell. Uudempia on esimerkiksi bash. Gnome ja KDE ovat graafisia käyttöympäristöjä, joita on kehitelty aika paljon Windowsin näköisiksi (ja samalla raskaiksi ja tilaa vieviksi). Niissä voi myös avata pääteikkunoita, joissa keskustellaan jonkin tekstipohjaisen komentotulkin kanssa.

Uudemmissa komentotulkeissa annetut komennot jäävät talteen, ja niitä voi selata nuolinäppäimillä $\uparrow$ ja $\downarrow$. Komentorivillä voi liikkua nuolinäppäimillä $\leftarrow$ ja $\rightarrow$ ja sen muokkaamiseen voi käyttää monia emacsin komentoja; esimerkiksi Ctrl-k hävittää rivin lopun kursorista oikealle.

Ohjelman suoritus voidaan katkaista näppäimellä Ctrl-c. Ctrl-s keskeyttää ruudulle tulevan tulostuksen, mutta ohjelman suoritus jatkuu. Tulostusta voidaan jatkaa näppäimellä Ctrl-q. Joskus saattaa vaikuttaa siltä, että jokin ikkuna on jäänyt jumiin. Mahdollinen syy voi olla vahingossa näppäilty Ctrl-s; ehkä tarkoitus oli antaa kyseinen komento emacsille, mutta kursori sattui olemaan väärässä ikkunassa. Ennen radikaalimpia toimenpiteitä kannattaa kokeilla Ctrl-q:ta.

Kun ollaan kirjoittamassa hakemiston tai tiedoston nimeä, komentotulkki osaa täydentää nimen, jos nimen alkuosa määrää tiedoston yksikäsitteisesti. Täydennys tapahtuu painamalla tabulaattorinäppäintä. Mikäli sopivaa tiedostoa ei ole tai vaihtoehtoja on useita, kuuluu piippaus ilmoitukseksi virhetilanteesta.

Jos tiedoston nimessä on erikoismerkkejä, joilla on jokin erityismerkitys komentotulkille, nimi on annettava lainausmerkeissä. Esimerkiksi emacs jättää joissakin tilanteessa levylle tiedoston, jonka nimi alkaa ??-merkillä. Jos hakemistossa on vain yksi tällainen tiedosto, sen voi poistaa näppäilemällä rm '??<tab><enter>. Jos koneessa on myös Windows, sen alla on tiedostoja ja hakemistoja, joiden nimissä on välilyöntejä. Myös tällaisiin tiedostoihin viitattaessa nimi on kirjoitettava lainausmerkkien väliin.

Hakemistorakenne

Unixissa on hierarkinen, puumainen hakemistorakenne. Unixista se on aikoinaan kopioitu myös DOS- ja Windows-järjestelmiin.

Käyttäjä on aina jossakin hakemistossa, jota sanotaan nykyhakemistoksi. Kun käyttäjä kirjautuu sisään, hänen nykyhakemistokseen tulee hänen oma kotihakemistonsa. Kotihakemistoon voidaan viitata merkillä ~.

Hakemistossa voi olla tiedostoja ja alihakemistoja ja jokaisessa alihakemistossa samalla tavoin tiedostoja ja uusia alihakemistoja. Nykyhakemistoon viitataan pisteellä (.) ja sen yläpuolella olevaan hakemistoon kahdella pisteellä (..).

Tiedostojärjestelmän lähtökohtana on juurihakemisto, jonka merkkinä on kauttaviiva /. Kotihakemistot ovat tavallisesta hakemiston /home alihakemistoja.

Absoluuttinen polku ilmoittaa tiedoston tai hakemiston täydellisen nimen ja sijoituspaikan juurihakemiston suhteen. Esimerkiksi tämän kirjoittajan kotihakemisto on /home/hkarttun ja tämän tekstin sisältävä tiedosto /home/hkarttun/txt/tietok/unix.txt. Hakemiston ja sen alihakemiston nimet erotetaan toisistaan kauttaviivalla. Absoluuttisen polun tunnistaa siitä, että se alkaa kauttaviivalla. Tiedostoon voidaan viitata myös lyhyemmällä nimellä ~/txt/tietok/unix.txt, joka on tavallaan myös absoluuttinen polku.

Suhteellinen polku on tiedoston tai hakemiston paikka nykyhakemiston suhteen. Esimerkiksi tämän tiedoston paikka kotihakemistoni suhteen on txt/tietok/unix.txt. Suhteellisen polun nimi alkaa hakemiston nimellä ilman kauttaviivaa tai se on pelkkä nykyhakemistossa olevan tiedoston nimi.

Hakupolku

Ohjelma voidaan suorittaa antamalla sen täydellinen nimi polkuineen. Tämä olisi kuitenkin työlästä. Siksi määritelläänkin hakupolku, joka kertoo, mistä hakemistoista suoritettavia ohjelmia etsitään.

Kokeile komentoa

echo $PATH

niin näet, mikä on hakupolkusi. Hakupolulla on jokin järjestelmäkohtainen oletusarvo. Hakupolku sisältää ainakin ne hakemistot, joissa sijaitsevat tavalliset Unixin komennot ja mahdollisesti myös jotkin sovellusohjelmat.

Hakupolku on yksi toimintaa säätelevistä ympäristömuuttujista. Niiden arvoja voidaan asettaa ja muuttaa milloin tahansa Unixin komennoilla, mutta tavallisesti ne asetetaan alustustiedostoissa, jotka suoritetaan käyttäjän kirjautuessa sisään.

Hakupolussa voi olla useita hakemistoja, joiden nimet erotetaan kaksoispisteillä. Polkua käydään läpi järjestyksessä. Saman niminen ohjelma voi olla useassakin paikassa, mutta niistä suoritetaan se, joka löytyy ensimmäisenä hakupolun varrelta.

Jos hakupolussa on nykyhakemistoon viittaava piste, suoritettavia ohjelmia etsitään myös nykyhakemistosta. Järjestelmän oletusarvo voi olla, että nykyhakemisto ei sisälly hakupolkuun. Tämä on turvallisuuskysymys: näin estetään, ettei jokin oma (tai murtautujan asentama) ohjelma korvaa oikeaa Unixin komentoa. Jos halutaan suorittaa nykyhakemistossa oleva ohjelma prog, se voidaan aina käynnistää komennolla ./prog.

Alustustiedostot

Käyttäjän kirjautuessa sisään etsitään tiettyjä alustustiedostoja ja suoritetaan niissä olevat komennot. Osa alustustiedostoista on järjestelmäkohtaisia ja kaikille yhteisiä. Käyttäjä voi myös sijoittaa omia alustustiedostoja kotihakemistoonsa. Niiden nimet alkavat pisteellä, ja nimessä esiintyy tyypillisesti login, profile tai rc. Nimeämistapa riippuu siitä, mitä komentotulkkia käytetään.

Omia alustustiedostoja on kahta tyyppiä. Käyttäjän kirjautuessa sisään suoritetaan tiedosto .login tai sen vastine. Tämän alustustiedoston komennot suoritetaan vain kerran kutakin istuntoa kohti. Toisen tiedoston ( rc) komennot suoritetaan aina, kun käynnistetään uusi komentotulkki esimerkiksi avaamalla toinen ikkuna tai aloittamalla komentotiedoston suoritus.

Alustustiedostoissa voidaan kyllä antaa mitä tahansa komentoja, mutta yleensä niissä tehdään vain tiettyjä asetuksia. Alustustiedostojen avulla määritellään tyypillisesti ympäristömuuttujia, kuten edellä mainittu hakupolku. Jotkin ohjelmat vaativat myös omia ympäristömuuttujiaan, jotka kertovat esimerkiksi, missä niiden tiedostot sijaitsevat.

Alustustiedostoista löytyy usein myös alias-komentoja, joilla voi antaa komennoille omia nimiä. Tämän kirjoittajan rc-tiedostossa on mm. seuraavat määrittelyt:

    alias e='emacs'  
    alias up='cd ..'

Emacsia tarvitaan tuhkatiheään, ja nyt se voidaan käynnistää lyhyesti komennolla e. Jotkin komennot voivat olla mutkikkaita, esimerkiksi pitkän hakupolun takana tai sisältää parametreja, jotka ovat yleensä samoja. Tällaisille komennoille kannattaa määritellä kätevät lyhenteet.

Hakemisto- ja tiedostokomentoja

  cat [tiedosto]+       (catenate)

Tulostetaan ruudulle argumentteina annetut tiedostot.

  head [tiedosto]+

Tulostetaan vain tiedostojen 10 ensimmäistä riviä. Lukumäärää voidaan muuttaa: head -20 data.txt tulostaa 20 ensimmäistä riviä.

  tail [tiedosto]+

Tulostetaan vain tiedostojen 10 viimeistä riviä. Myös tässä lukumäärää voidaan muuttaa.

  ls                                (list)

Tulostetaan luettelo tiedostoista. Ilman optioita luetellaan nykyhakemiston kaikkien tiedostojen nimet ilman mitään muita lisätietoja. Argumenttina voi olla myös jonkin hakemiston nimi tai säännöllinen ilmaus, jolla valitaan listattaviksi vain tietyt tiedostot. Esimerkiksi ls x* luettelee kaikki tiedostot, joiden nimet alkavat x-kirjaimella.

Komennolla on suuri määrä valitsimia. Seuraavassa mainitaan vain muutama hyödyllinen:

-l (long): Pitkä luettelo, jossa on yksi tiedosto rivillä. Tiedostosta kerotaan suojaukset, omistaja, ryhmä, koko tavuina, viimeinen muutospäivämäärä ja nimi.

-a (all): Luetellaan myös tiedostot, joiden nimi alkaa pisteellä. Nämä ovat tyypillisesti ohjelmien alustustiedostoja, joita ei normaalisti ole tarpeen saada näkyviin.

-lrt: Tämä antaa luettelon viimeisen muutoshetken mukaisessa järjestyksessä (t=time) niin, että viimeksi muutetut tiedostot ovat luettelon viimeisinä (r=reverse). Ehkä hieman erikoiselta tuntuva komento, mutta tällä näkee, mitä kaikkea on viimeksi muutettu, mistä taas on hyötyä kun siirtelee tiedostoja usein eri koneiden välillä.

  cp [mistä]+ mihin              (copy)

Kopioidaan tiedosto tai tiedostoja. Jos argumentteja on enemmän kuin kaksi, viimeisen on oltava hakemisto, johon kaikki muut kopioidaan.

cp f1.dat f2.dat

Tämä kopioi tiedoston f1.dat tiedostoksi f2.dat. Mikäli f2.dat oli ennestään olemassa, sen vanha sisältö tuhoutuu.

cp f1.dat f2.dat ./data

Kopioidaan tiedostot f1.dat ja f2.dat nykyhakemiston alihakemistoon data.

cp -av artikkeli /media/stick

Kopioidaan nykyhakemiston alihakemisto artikkeli  kaikkine alihakemistoineen hakemistoon /media/stick, joka voisi olla vaikka muistitikku. Valitsimella -a säilytetään tiedostojen suojaukset, omistajat ja viimeiset muutosajat. Valitsin -v (verbose) listaa ruudulle, mitä tiedostoja kopioidaan. Tämäkin on komento, joka on kätevä siirreltäessä tavaraa eri taltioiden välillä.

  wc [tiedosto]+       (word count)}

Kertoo, kuinka monta merkkiä, sanaa ja riviä tiedostossa on.

  rm [tiedosto]+        (remove)

Poistaa mainitut tiedostot. Hyödyllisiä valitsimia ovat mm.

-i (interactive): Kysytään jokaisesta poistettavasta tiedostosta, halutaanko se todella poistaa. Hyödyllinen, jos tiedoston nimessä käytetään jokerimerkkejä, jolloin vahingossa saattaisi tuhoutua myös tarpeellisia tiedostoja.

-f (force): Ei turhia löpinöitä, vaan suojauksista välittämättä tuhotaan tiedostot.

-r (recursive): Hävitetään myös alihakemistot ja niissä olevat tiedostot. Tuhoisa komento on rm -rf *, joka poistaa nykyhakemistosta kaikki tiedostot ja alihakemistot sen kummempia kyselemättä. Tämä on kätevä, kun halutaan poistaa tarpeettomaksi käynyt hakemisto (esimerkiksi muistitikulta), mutta mieti kaksi tai mieluummin kolme kertaa ennen kuin painat enteriä komennon kirjoittamisen jälkeen.

  mv             (move)

Muutetaan tiedoston tai hakemiston nimeä tai siirretään se toiseen hakemistoon. Komento

mv x.dat xyz.dat

muuttaa tiedoston x.dat nimeksi xyz.dat. Komento

mv *.dat ./data

siirtää kaikki .dat-tyyppiset tiedostot nykyhakemiston alihakemistoon data. Tiedoston sijoituspaikka vaihtuu niin, ettei sitä enää ole alkuperäisessä hakemistossa. Siirrettävän tiedoston nimen paikalla voi olla myös hakemiston nimi, jolloin toimenpide kohdistuu koko hakemistoon.

  pwd           (print working directory)

Ilmoittaa nykyhakemiston. Monissa järjestelmissä nykyhakemisto näkyy kehotteesta, joten tätä tarvitaan harvoin.

  cd [hakemisto]    (change directory)

Vaihdetaan nykyhakemistoa. Jos komennolle ei anneta mitään argumenttia, siirrytään käyttäjän kotihakemistoon. Jos hakemiston nimi alkaa kauttaviivalla, kyseessä on absoluuttinen polku mainittuun hakemistoon. Muuten kyseessä on suhteellinen polku nykyhakemiston suhteen. Komento cd .. siirtyy hakemistohierarkiassa nykyhakemiston yläpuolella olevaan hakemistoon. Komento cd ali siirtyy nykyhakemiston alihakemistoon ali.

  mkdir hakemisto+    (make directory)

Tehdään hakemisto tai hakemistoja. Tässäkin hakemiston nimi voi olla absoluuttinen tai suhteellinen nykyhakemiston suhteen.

  rmdir hakemisto}+   (remove directory)

Poistetaan hakemisto tai hakemistoja. Hakemistot voidaan poistaa vain, jos ne ovat tyhjiä (vrt. rm).

  grep merkkijono tiedosto+

Haetaan annettua merkkijonoa tiedostoista. Esimerkiksi

grep huu *

ilmoittaa, missä kaikissa nykyhakemiston tiedostoissa esiintyy merkkijono "huu", ja tulostaa kyseiset rivit.

  locate merkkijono

Luetellaan kaikki tiedostot, joiden nimessä merkkijono esiintyy. Komento tutkii tiedostojen täydellisiä nimiä hakupolkuineen, joten merkkijono voi esiintyä myös hakemiston nimessä. Komennon GNU-versio tulee Linuxin mukana, mutta muissa Unixeissa sitä ei välttämättä ole.

Jotta haku ei kestäisi kovin kauan, Linux ylläpitää luetteloa kaikista tiedostoista. Luettelo päivitetään yleensä kerran vuorokaudessa, joten uusimpia tiedostoja komento ei löydä. Luettelo voidaan myös päivittää milloin tahansa komennolla updatedb, mutta yleensä tavallisella käyttäjällä ei ole oikeutta tehdä tätä.

Suojaukset

Jokaiselle tiedostolle ja hakemistolle on määritelty suojaus, joka kertoo, voivatko muut käyttäjät käyttää tiedostoa ja millä tavoin.

Suojaukset näkee komennolla ls -l:

-rw-------   1 hkarttun tah  3266 Jan 27  2003 answer1.htm
-rw-------   1 hkarttun tah  1631 Jan 14  2003 exerc1.htm
-rwxr-xr-x   1 hkarttun tah 17604 Jan 16  2003 harm
-rw-------   1 hkarttun tah   326 Jan 16  2003 harm.f90
drwx------   2 hkarttun tah  1024 Jun  6 05:36 koe

Suojaukset ilmoittaa kunkin rivin alussa oleva merkkijono. Ensimmäisestä merkistä näkyy, onko kyseessä tavallinen tiedosto (-) vai hakemisto (d, directory). Sitä seuraa kolme kolmen merkin ryhmää, joista ensimmäinen kertoo käyttäjän (u, user) oikeudet, seuraava ryhmän (g, group) oikeudet ja kolmas muiden (o, other) oikeudet.

Suojauksissa r tarkoittaa lukuoikeutta (read), w kirjoitusoikeutta (write) ja x suoritusoikeutta (execute). Jos tiedostoon on kirjoitusoikeus, se voidaan myös hävittää. Kallisarvoinen tiedosto voidaan suojata vahingossa tapahtuvalta tuhoamiselta poistamalla sen kirjoitusoikeus.

Suoritettavilla ohjelmilla ja komentotiedostoilla on luonnollisesti oltava suoritusoikeus, kuten edellä ohjelmalla harm, joka on lähdekielisen ohjelman harm.f90 käännetty versio. Hieman erikoisempaa on, että myös hakemistoilla on oltava suoritusoikeus, jotta niiden sisältöä pääsee tutkimaan.

Edellä vain tiedostojen omistajalla (hkarttun) on kaikki oikeudet kaikkiin tiedostoihin. Ohjelmalle harm on kuitenkin annettu luku- ja suoritusoikeus myös ryhmälle (tah) ja maailmalle, joten kuka tahansa voi suorittaa ohjelman tai kopioida sen itselleen.

Ylikäyttäjällä on aina oikeus tehdä tiedostoille ja hakemistoille mitä tahansa niiden suojauksista riippumatta.

Suojauksia muutetaan komennolla chmod. Seuraavassa on joitakin esimerkkejä komennon käytöstä.

chmod a+r *

Annetaan kaikille (a) oikeudet lukea kaikkia nykyhakemistossa olevia tiedostoja.

chmod o-w *

Otetaan kirjoitusoikeus pois muilta paitsi käyttäjältä ja samaan ryhmään kuuluvilta.

chmod u+x skripti

Annetaan käyttäjälle suoritusoikeus tiedostoon skripti. Komentotiedosto on vain tekstitiedosto, jolla ei ole automaattisesti suoritusoikeutta.

Suojaukset voidaan ilmoittaa myös kolmen oktaaliluvun avulla. Ensimmäinen kertoo omistajan, toinen ryhmän ja kolmas muiden oikeudet. Oktaaliluku saadaan laskemalla yhteen eri oikeuksia vastaavat luvut: 4=lukuoikeus, 2=kirjoitusoikeus, 1=suoritusoikeus.

chmod 644 *

Käyttäjä voi lukea ja kirjoittaa nykyhakemiston kaikkia tiedostoja, ja kaikki muut voivat lukea niitä.

chmod 700 *

Käyttäjä voi lukea, kirjoittaa ja suorittaa nykyhakemiston kaikkia tiedostoja, mutta kukaan muu ei voi tehdä niille mitään.

Syötön ja tulostuksen ohjaus

Unixissa jokaiseen komentoon ja suoritettavaan ohjelmaan liittyy kolme tiedostoa: stdin (standard input), stdout (standard output) ja stderr (standard error). Ohjelma voi lukea syöttötietoja tiedostosta stdin, joka on normaalisti liitetty näppäimistöön. Se tulostaa tiedostoon stdout, joka puolestaan liittyy näyttöön. Mahdolliset virheilmoitukset ohjataan tiedostoon stderr, joka sekin tavallisesti viittaa näyttöön.

Kätevä ominaisuus on, että kaikki nämä tiedostot voidaan korvata millä tahansa muullakin tiedostolla. Jos esimerkiksi haluamme tallettaa tiedostoluettelon johonkin tiedostoon, voimme ohjata komennon ls tulostuksen tiedostoon lista sanomalla

ls > lista

Tässä operaattori > tarkoittaa, että tiedostoon stdout menevä tavara ei tulekaan näkyviin ruudulle, vaan menee tiedostoon lista.

Tällä tempulla tiedostoja on helppo liittää yhteen. Tulostetaan yhdistettävät tiedostot peräkkäin cat-komennolla ja ohjataan tulostus uuteen tiedostoon:

cat a1.txt a2.txt > b.txt

Jos operaattorin > perässä mainittu tiedosto on jo olemassa, sen vanha sisältö tuhoutuu. Jos edellisen komennon jälkeen sanoisimme cat a3.txt > b.txt

b.txt sisältäisi tämän jälkeen vain tiedoston a3.txt. Jos tiedosto a3.txt halutaan liittää olemassaolevan tiedoston jatkeeksi, se voidaan tehdä operaattorilla >>:

cat a3.txt >> b.txt

Operaattori on kätevä esimerkiksi lokitietojen ylläpidossa. Jos jotakin ohjelmaa suoritetaan toistuvasti, se voi kirjoittaa haluttuja tietoja aina saman tiedoston loppuun.

Myös syöttötiedosto stdin voidaan liittää mihin tahansa muuhun tiedostoon. Jos oma ohjelma prog tarvitsee syöttötietoja, se voi lukea tiedot tiedostosta data näin:

prog < data

Sekä syöttö- että tulostustiedot voidaan ohjata uudelleen: prog < data > tulostus

Operaattorilla << ei ole operaattoria >> vastaavaa tulkintaa. Sen sijaan sillä on käyttöä komentotiedostoissa.

Olkoon prog ohjelma, joka lukee lukuja tiedostosta stdin. Ohjelma voitaisiin suorittaa seuraavanlaisella komentotiedostolla:

  prog <<EOF
  1.2
  2.0
  5.1
  EOF

Merkintä <<EOF tarkoittaa, että ohjelma lukee lukuja samaisesta komentotiedostosta, kunnes vastaan tulee rivi, jolla on merkkijono EOF. Tässä tapauksessa ohjelma lukee siis kolme lukua. Tällaisesta komentotiedostoon upotetusta syöttötiedostosta käytetään Unixissa nimitystä 'here document'.

Sama asia voitaisiin tietysti toteuttaa kirjoittamalla luvut eri tiedostoon ja käyttämällä operaattoria <.

Joskus (aika useinkin) vastaan tulee tilanne, jossa yhden ohjelman tulostus halutaan syöttää edelleen toiselle ohjelmalle. Tämä voidaan toteuttaa ohjaamalla ensimmäisen ohjelman tulostus tiedostoon, joka sitten syötetään toiselle ohjelmalle. Välitiedosto on käytännössä tarpeeton ja voi unohtua kuluttamaan turhaan levytilaa. Siksi Unixissa on myös menetelmä, jolla yhden ohjelman stdout voidaan ohjata suoraan toisen ohjelman stdin-tiedostoksi. Tämä tapahtuu yhdistämällä ohjelmat putkella (pipe), jonka merkki on pystyviiva:

ls | grep zz

Tämä tulostaa luettelon kaikista tiedostoista, joiden nimessä esiintyy merkkijono "zz". Komennon ls tulostus ohjataan eli putkitetaan suoraan komennolle grep. Mitään välitiedostoa ei tarvita, joten komennosta ei synny roskia levylle.

Putkilla voidaan yhdistää useampiakin komentoja:

ls -1 | grep zz | wc -l

Tämä etsii kaikki tiedostot, joiden nimessä esiintyy "zz" ja putkittaa sitten tiedostojen nimet komennolle, joka laskee rivien lukumäärän. Komennon tulostuksena saadaan siis yksi luku, kyseisten tiedostojen lukumäärä.

Työn seuranta

Jokaisen suoritettavana olevaan ohjelmaan liittyy yksikäsitteinen numero, PID (process identifier). Unixissa on itse asiassa suuri määrä prosesseja, jotka viettävät suurimman osan ajastaan nukkumalla eli eivät tee mitään. Ne ovat kuitenkaan valmiina heräämään, kun niitä tarvitaan.

Prosessien tilan näkee komennolla ps. Ilman valitsimia komento kertoo vain kyseisessä ikkunassa toimivat prosessit, niiden numerot, nimet ja kulutetun prosessoriajan. Valitsimella a näkee kaikki omat prosessit. Huomaa, että valitsin voi olla joko -a tai pelkkä a. Nämä liittyvät erilaisiin Unixin versioihin ja toimivat hieman eri tavoin.

Tärkein käyttö komennolle ps on hakea prosessin numero työlle, joka on jotenkin jäänyt jumiin tai muuten kieltäytyy kommunikoimasta käyttäjän kanssa.

Jos esimerkiksi emacs-editori sekoaa (mikä on hyvin harvinaista), kannattaa mennä toiseen ikkunaan. Siellä katsotaan, mikä on prosessin numero:

>ps -a
  PID TTY          TIME CMD
24841 pts/2    00:00:07 boinc
27881 pts/2    06:03:31 setiathome-5.12
28351 pts/1    00:00:02 emacs
28418 pts/0    00:00:00 ps

Nyt tiedetään, että jumiutuneen prosessin numero on 28351. Prosessi voidaan nyt tappaa komennolla

kill 28351

Ellei tämäkään tehoa, voidaan käyttää kill-komennon väkivaltaisempaa muotoa:

kill -9 28351

Toinen työkalu prosessien seurantaan on top. Komento tulostaa koko ikkunan kokoisen taulukon prosesseista. Luetteloa päivitetään jatkuvasti. Siitä näkyy, mikä prosessi on suorituksessa (R, running) ja mitkä nukkumassa (S, sleeping); vrt. kappale ??.??. Luettelosta näkyy myös, kuinka paljon aikaa ja muistia kukin prosessi on käyttänyt. Seuraavassa on esimerkki komennon tulostuksesta.

top - 10:52:19 up 29 days,  1:53,  4 users,  load average: 2.00, 2.00, 2.00
Tasks:  97 total,   2 running,  95 sleeping,   0 stopped,   0 zombie
Cpu(s): 56.2% us,  6.2% sy,  6.2% ni, 31.2% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:   1028104k total,   830968k used,   197136k free,   184340k buffers
Swap:  2650684k total,     2624k used,  2648060k free,   186368k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
16074 root      16   0 69976  56m 9416 S 96.9  5.7   6996:46 XFree86
17677 hkarttun  15   0 12752 8148 6532 S 24.2  0.8   0:16.09 metacity
17685 hkarttun  16   0 30816  13m 8188 R 12.1  1.4   0:30.67 gnome-terminal
27881 hkarttun  34  19 52072  32m 2600 S 12.1  3.2 368:18.03 setiathome-5.12
27899 hkarttun  34  19 51600  31m 2600 S 12.1  3.2 316:33.75 setiathome-5.12
28419 hkarttun  15   0  2132 1068  832 R 12.1  0.1   0:00.04 top
    1 root      16   0  1588  520  452 S  0.0  0.1   0:01.57 init
    2 root      RT   0     0    0    0 S  0.0  0.0   0:00.29 migration/0
    3 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0
    4 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 watchdog/0
    5 root      RT   0     0    0    0 S  0.0  0.0   0:27.07 migration/1
    6 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/1
    7 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 watchdog/1
    8 root      10  -5     0    0    0 S  0.0  0.0   0:04.75 events/0
    ...

Minkä tahansa komennon voi suorittaa taustaprosessina, jolloin samassa ikkunassa voi tehdä myös jotakin muuta. Aikoinaan tämä oli erittäin hyödyllinen piirre, kun kaikki kommunikointi tapahtui yhden tekstiruudun välityksellä, mutta nykyisin voi aina avata uuden ikkunan. Komento käynnistyy taustaprosessina, jos sen perään kirjoitetaan merkki &. Esimerkiksi

   emacs ohjelma.c &

käynnistää editorin taustaprosessina (ja avaa sille oman ikkunan), jolloin samassa ikkunassa voi antaa vaikka käännöskomennon ja sitten suorittaa ohjelman.

Tiedostojärjestelmät

Juurihakemisto / ja sen alla olevat alihakemistot ja tiedostot muodostavat Unixin puumaisen tiedostohierarkian. Tämä hierarkia voi jakautua fyysisesti erillisiin osiin, tiedostojärjestelmiin (file system). Tiedostojärjestelmään kuuluu yksi juurihakemisto, jonka alla on edelleen alihakemistoja tiedostoineen.

Samalla fyysisellä levyllä voi olla useita tiedostojärjestelmiä eri partitioissa. Tyypillisesti ainakin / ja sivutusalue (swap) ovat erillisissä partitioissa. Joskus myös käyttäjien kotihakemistot (eli alihakemisto /home) ovat omassa partitiossaan. Unixin tiedostojen lisäksi levyllä voi olla myös muiden käyttöjärjestelmien partitioita, joten samassa koneessa voidaan haluttaessa ajaa eri käyttöjärjestelmiä. Tavallisin tapa on valita konetta käynnistettäessä, mitä käyttöjärjestelmää käytetään. On myös olemassa ohjelmia, joilla esimerkiksi Linuxin yhdessä ikkunassa voi ajaa Windowsia.

Järjestelmä- ja kotihakemistot ovat käytettävissä automaattisesti. Niiden lisäksi koneessa on erilaisia oheislaitteita, joissa voidaan käyttää vaihdettavia taltioita, kuten cd- ja dvd-levyjä, muistitikkuja, zip-levykkeitä tai korppuja. Jotkin järjestelmät tunnistavat joitakin näistä automaattisesti, mutta ne voi myös joutua ottamaan käyttöön eksplisiittisesti komennolla mount. Ilman argumentteja annettu mount kertoo, mitä tiedostojärjestelmiä on käytössä.

Oletusarvo on, että vain pääkäyttäjä (root) saa antaa mount-komennon. Jotta muutkin käyttäjät voisivat siirtää tiedostojaan siirrettävällä medialla, heille voidaan antaa oikeus käyttää tiettyjä laitteita.

Luettelo tiedostojärjestelmistä on tiedostossa /etc/fstab. Tämän kirjoittajan koneessa se on seuraavanlainen:

# /etc/fstab: static file system information.
#
#                
proc            /proc           proc    defaults        0       0
/dev/sda1       /               ext3    defaults,errors=remount-ro 0       1
/dev/sda6       /home           ext3    defaults,errors=remount-ro 0       1
/dev/sda5       none            swap    sw              0       0
/dev/hda        /media/cdrom0   iso9660 ro,user,noauto  0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto  0       0
/dev/sdb1       /media/stick    msdos   rw,user,noauto,umask=000  0
/dev/sdb4       /media/zip      msdos   rw,user,noauto,umask=000  0

Ensimmäisellä sarakkeella on laite, jolla järjestelmä sijaitsee. Tässä sda1, sda6 jne. ovat saman fyysisen levyn eri osioita. Toisella sarakkeella ilmoitetaan, mihin hakemistoon laite on liitetty. Siirrettävien medioiden hakemistot ovat nykyisin useimmiten hakemiston media alla; aikaisemmin hakemiston nimi oli mnt. Seuraava sarake kertoo tiedostojärjestelmän tyypin. Sitten tulee joukko valitsimia; ro (read only) tarkoittaa, että laitteelta voidaan vain lukea, user, että myös tavallinen käyttäjä voi mountata tiedostojärjestelmän, noauto, että tiedostojärjestelmää ei yritetä mountata automaattisesti. Kaksi viimeistä numeroa säätelevät tiedoston varmuuskopiointa ja tarkistusta.

Kun nämä tiedot on määritelty tiedostossa fstab, niitä ei tarvitse enää antaa mount-komennossa. Niinpä yo. koneessa kuka tahansa voi mountata muistitikun komennolla

mount /media/stick

Kun laitetta ei enää käytetä, se voidaan poistaa komennolla umount. Komento huolehtii, että taltio saatetaan ajan tasalle. Koneen puskureissa voi vielä olla tavaraa, jota ei ole talletettu laitteelle. Tallennus voidaan varmistaa tietysti myös antamalla sync-komento ennen umount-komentoa. Esimerkiksi muistitikkua ei kannata irrottaa ennen kuin tallennus on varmasti tapahtunut; muuten sillä oleva tiedostojärjestelmä voi pahimmassa tapauksessa mennä sekaisin.

Juurihakemiston alla on tyypillisesti seuraavanlaisia alihakemistoja:

Koneen käynnistäminen ja sammuttaminen

Kun tietokone käynnistetään, ruudulle ilmestyy usein valikko, josta valitaan haluttu käyttöjärjestelmä. Vaikka koneessa olisi pelkkä Unix, valikossa voi olla muutama eri versio. Yleensä yksi on normaali käyttöjärjestelmä ja muut ylläpitoon tai virhetilanteiden käsittelyyn tarvittavia erikoisversioita. Ellei käyttäjä tee tässä vaiheessa mitään, kone käynnistyy hetken kuluttua normaaliin tilaan.

Ylläpidon kannalta joskus tarpeellinen on single-user-tila. Silloin koneessa on vain pääkäyttäjä, eikä siihen saa yhteyttä verkon kautta.

Käynnistettäessä mountataan tiedostojärjestelmät fstabin tietojen mukaisesti. Kun riittävä määrä käynnistyksiä on takana tai jos tiedostojärjestelmässä havaitaan vikaa, ajetaan tarkistus- ja korjausohjelma fsck. Jos koneessa on iso levy, tämä vaihe voi kestää kauan.

Jos kone käynnistyy normaalisti, ruudulle ilmestyy lopulta kehote, jossa kysytään käyttäjätunnusta ja salasanaa.

Koska levylle kirjoittaminen on suhteellisen hidas toimenpide, Unix pyrkii pitämään mahdollisimman paljon tietoa keskusmuistissa puskureiksi kutsutuilla muistialueilla. Jos kone sammutetaan väkisin virtakytkimestä, viimeisiä muutoksia ei ehkä ole talletettu levylle. Vielä pahempaa on, jos virta katkaistaan koneen ollessa juuri kirjoittamassa hakemistoa. Silloin seuraavalla käynnistyskerralla suoritetaan fsck, jolloin käynnistymiseen kuluu paljon aikaa. Jos kaikki käy hyvin, vain viimeisimmät muutokset katoavat, mutta pahimmassa tapauksessa tietoa voi tuhoutua enemmänkin.

Puskurien sisällöt voidaan aina kirjoittaa levylle komennolla sync. Kuka tahansa käyttäjä voi antaa tämän komennon. Hyvä tapa on antaa komento ennen siirrettävän median irrottamista ennen umount-komentoa. Käyttöjärjestelmä suorittaa komennon automaattisesti aika ajoin, esimerkiksi minuutin välein, minkä voi havaita levyltä kuuluvasta rapsahtelusta.

Unix-konetta ei pidä muutenkaan sammuttaa vain katkaisemalla virta, vaan järjestelmä on ajettava hallitusti alas. Silloin kaikki avoimet tiedostot suljetaan ja erilaisia tietoja talletetaan seuraavaa käynnistystä varten.

Unixissa on komento shutdown, jolla järjestelmä sammutetaan (optiolla -h, halt) tai käynnistetään uudelleen (-r, restart). Vain pääkäyttäjällä on oikeus antaa tämä komento. Komennossa voidaan ilmoittaa, suljetaanko kone heti vai vasta tietyn ajan kuluttua, jolloin koneeseen verkon kautta mahdollisesti yhteydessä olevat käyttäjät saavat tiedon asiasta ja ehtivät tallettaa keskeneräiset työnsä.