OSA PÄIVITETTY DAPPERIN VUOKSIviime aikoina kysymys siitä miten käynnistyksen yhteydessä pystyy suorittamaan omia komentoja on tullut esille useampaankin otteeseen. vaikka ratkaisu ongelmaa saattaa olla helppo kopioimalla pari komentoa komentoriville, on paljon parempi jos ymmärtää hieman asian taustoja. tämä n asian tiimoilta relevantteja lienevät koneen
boottaaminen,
init,
runlevelitja tietysti se miten voi itse vaikuttaa prosessiin.
Boottaaminen ja sammuttaminen:koneen käynnistyessä hoidetaan tietysti kaikki tavalliset toimenpiteet bootloaderin lataamiseen asti. tämän jälkeen bootloader käynnistää itse käyttöjärjestelmän lataamisen ja antaa toimenpidettä varten halutun märän parametreja. käynnistyessään linux (==kernel) käynnistää ensitöikseen prosessin nimeltään
init (initin prosessinumero on tästä syystä aina pieni(n)). initin tehtävä on melko suoraviivainen: kernelin käynnistyttyä se ajaa järjestelmän ylös suorittamalla yleisiä ja valittuun
runleveliin liittyviä init-scriptejä, jotka puolestaan käynnistävät palveluita. konetta sammutettaessa init ajaa taas init-scriptien määräämät palvelut alas, ennen varsinaista virtojen katkaisemista.
Runlevelit ja Init:runlevelit ovat periaatteessa vain erilaisia ryhmiä joiden perusteella valitaan mitä prosesseja käynnistetään. koska Ubuntu on Debianin lähisukulainen, käytetään siinäkin
System V -tyylistä inittiä, joka on kieltämättä aika yleinen muissakin distroissa, vaikka vaihtoehtojakin on ja uusia on kehitetty juuri käynnistystä nopeuttamaan.
Ubuntulla on yhteensä 8 runleveliä jotka ovat numerot 0-6 ja kirjain S(tai s). näistä numerot 0, 1 ja 6 ovat varattuja runleveleitä, eikä S:kään ole tarkoitus käyttää suoraan. runlevel 0 vastaa
haltia, 1 on single user mode (johon pystyy myös boottaamaan suoraan Ubuntun Grubin oletuvalikosta) ja runleven 6 käynnistää koneen uudelleen. todellisuudessa Ubuntussa on myös runlevelit 7-9, mutta niitä ei ole dokumentoitu eikä niitä yleensä käytetä, koska perinteiset *NIXitkaan eivät niitä käytä.
kuten arvata saattaa, runleveliä on mahdollista muuttaa myös koneen ollessa käynnissä. tämä tapahtuu suorittamalla (riittävin oikeuksin) komento:
# telinit <runlevel>
vaihdettaessa runleveliä, init huolehtii palveluiden sammuttamisesta ja käynnistämisestä , jotta ajoympäristö saataisiin valitun runlevelin mukaiseksi.
kun init käynnistetään bootin yhteydessä, se etsii tiedostoa
/etc/inittab joka sisältää tiedon siitä mille runlevelille koneen halutaan oletuksena boottaavan. tiedsotosssa kohta näyttää oletuksena tällaiselta:
# The default runlevel.
id:2:initdefault:
joka tarkoittaa siis käytännössä sitä, että kone boottaa runlevelille 2 jos runleveliä ei ole itse määritelty.
Init-scriptitinit-scriptit sijaitsevat hakemistossa
/etc/init.d ja ne sisältävät usein eri toimintoja riippuen siitä miten niitä kutsutaan. kutsuja ovat mm. stop, start ja restart. palveluiden käynnistäminen/sammuttaminen käsin komentoriviltä tapahtuukin kätevästi näitä scriptejä käyttäen. esim. palvelun käynnistäminen tapahtuisi näin:
# /etc/init.d/<scripti> start
init ei kuitenkaan itse lue noita scriptejä tuolta kyseisestä hakemistosta, vaan runlevelkohtaisista hakemistoista jotka on nimettu rcX.d/ jossa X on runlevelin numero tai kirjain. runlevelillä ajettavia palveluita varten oikeat scriptit on symlikattu aina kyseisen runlevelin omaan hakemistoon.
symlinkit on nimetty siten, että niiden ensimmäinen kirjain on joko
K tai
S jonka perässä on välittömästi kaksi numeroa. K tarkoittaa, että scripti suoritetaan
stop-komennolla ja S tarkoitta vastaavasti, että scripti suoritetaan
start-komennolla runleveliä käynnistettäessä. perässä olevat numerot 00-99 määräävät scriptien suoritusjärjestyksen, sillä scriptit suoritetaan aakkosjärjestyksessä jolloin scripti numerolla 00 suoritetaan ensimmäisenä ja 99 viimeisenä.
Oma init-scripti:seuraava tarvitaan vain Dapperia edeltäneissä versioissajotta saisimme suoritettua omia komentoja koneen käynnistyksessä, täytyy meidän luoda oma init-scripti. tarkoituksena on tällä erää luoda vain käynnistyksen yhteydessä ajettava scripti, joten mitään eri komentoja tunnistavaa scriptiä ei ole tarkoitustakaan luoda, niitä varten voi katsoa esimerkkiä olemassa olevista scripteistä. tarkoitus on vain esitää pääperisaatteet hommasta. käyttäjän omia komentoja varten on yleensä varattu tiedosto nimeltä rc.local ja mekin seuraamme nyt tätä käytäntöä.
ensimmäisenä luomme tietysti tiedoston rc.local hakemistoon jossa init-scriptit normaalistikin sijaitsevat:
$ sudo touch /etc/init.d/rc.local
ja annetaan sille riittävät oikeudet:
$ sudo chmod 774 /etc/init.d/rc.local
nyt voimme luoda sille linkin sille runlevelille jolla haluamme sen ajettavan. oletuksena tämä on tietysti hyvä olla runlevel 2 koska sille Ubuntu tavallisesti käynnistyy, eikä mikään tietysti estä meitä linkkaamasta sitä useille eri runleveleille. lisäksi haluamme scriptimme ajettavan kun kone käynnistyy, joten linkin on syytä alkaa kirjaimella S ja koska haluamme olla varma, että kaikki tarvitsemamme palvelut ovat jo käynnissä kun scriptiä suoritetaan, annamme sen numeroksi 99:
$ sudo ln -s /etc/init.d/rc.local /etc/rc2.d/S99rc.local
edelliset vain Dapperia edeltäneissä versioissaDapper Drake (Ubuntu 6.06) pitää jo valmiiksi sisällään scriptin /etc/init.d/rc.local joka on myös automaattisesti linkitetty oletuksena käytetylle runlevelille. kyseinen scripti suorittaa komennot jotka on määritelty tiedostossa /etc/rc.local, joten omia komentoja ei siis enää ole syytä kirjoittaa tiedostoon /etc/init.d/rc.local, kuten ennen Dapperia.
ennen Dapperiin päivittämistä on myös syytä ottaa omat komennot talteen tiedostosta /etc/init.d/rc.local, sillä päivitys kirjoitta surutta ko. tiedoston yli.
suoritettavat toiminnot voivat olla miltei mitä vain, mutta kannattaa huomioida, että käynnistettävän komennon on suoriuduttava loppuun käynnistyksen jälkeen tai vähintään vapautettava kutsuva prosessi jatkamaan toimintojaan, tai muuten boottaaminen keskeytyy ja sitä me emme halua.
Apusovellluksiakuten arvata saattaa, on tuolle käsin linkittämiselle vaihtoehtoja, kuten toki muutamaan muuhunkin hommaan. ohjelma nimeltään
rcconf helpottaa käynnistettävien sovellusten selaamista ja valitsemista, mutta se jättää monesti hommia vähän puolitiehen. kiinnostavampia sen sijaan ovat scriptit jotka päättyvät -rc.d ja automatisoivat montakin hommaa.
esim. aikaisemmin esitetyn palvelun käynnistämisen voi hoitaa Debianissa/Ubuntussa myös seuraavasti:
# invoke-rc.d <scriptin nimi> start
palvelun voi lisätä käynnistymään koneen bootatessa komennolla (huomaa lopussa oleva .):
# update-rc.d -f <scriptin nimi> start <numero> <halutut runlevelit välilyönnillä erotettuna> .
scriptin saa suoritettavaksi runleveliltä poistuttaessa komennolla:
# update-rc.d -f <scriptin nimi> stop <numero> <halutut runlevelit välilyönnillä erotettuna> .
pavelun saa poistettua käynnistyvien joukosta komennolla:
# update-rc.d -f <scriptin nimi> remove
lisäinfoa löytyy käytettyjen scriptien man-sivuilta sekä initin, inittabin ja telinitin man-sivuilta.
ja kuten aina, virheitä löytävät täydentäkööt