Kirjoittaja Aihe: [Ubuntu 6.06] init ja ohjelmien suorittaminen käynnistettäessä [siirrettävissä]  (Luettu 16450 kertaa)

janne

  • Käyttäjä
  • Viestejä: 5150
    • Profiili
OSA PÄIVITETTY DAPPERIN VUOKSI

viime 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:
Koodia: [Valitse]
# 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:
Koodia: [Valitse]
# 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-scriptit
init-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:
Koodia: [Valitse]
# /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ä versioissa
jotta 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:
Koodia: [Valitse]
$ sudo touch /etc/init.d/rc.local
ja annetaan sille riittävät oikeudet:
Koodia: [Valitse]
$ 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:
Koodia: [Valitse]
$ sudo ln -s /etc/init.d/rc.local /etc/rc2.d/S99rc.localedelliset vain Dapperia edeltäneissä versioissa

Dapper 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.

Apusovellluksia
kuten 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:
Koodia: [Valitse]
# invoke-rc.d <scriptin nimi> start
palvelun voi lisätä käynnistymään koneen bootatessa komennolla (huomaa lopussa oleva .):
Koodia: [Valitse]
# update-rc.d -f <scriptin nimi> start <numero> <halutut runlevelit välilyönnillä erotettuna> .
scriptin saa suoritettavaksi runleveliltä poistuttaessa komennolla:
Koodia: [Valitse]
# update-rc.d -f <scriptin nimi> stop <numero> <halutut runlevelit välilyönnillä erotettuna> .
pavelun saa poistettua käynnistyvien joukosta komennolla:
Koodia: [Valitse]
# 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 ;)
« Viimeksi muokattu: 16.08.08 - klo:13.20 kirjoittanut Kari Argillander »
Janne

JPK1990

  • Vieras
 :) kiitosta kaimalle!

Melmacian

  • Käyttäjä
  • Viestejä: 868
  • Ubuntu Hardy
    • Profiili
Kiitos vain hyödyllisestä oppaasta, mutta pakko on kysyä miten tässä voisi ajaa screenin ja irssi päälle tietylle käyttäjälle?

EDIT: Heh, jälkikäteen googlailu aivot kädessä tuotti tulosta ;)
Koodia: [Valitse]
su tunnus -c "screen -d -m -U irssi"
« Viimeksi muokattu: 25.05.06 - klo:00.05 kirjoittanut Epeli »

Melmacian

  • Käyttäjä
  • Viestejä: 868
  • Ubuntu Hardy
    • Profiili
Kannattaa muuten ottaa poistaa tuo linkki(/etc/rc2.d/S99rc.local), jos päivittää breezystä dapperiin suoraan sources.list:llä. Sillä silloin se ajaa /etc/rc.local -tiedoston kommennot kahteen kertaan.

Ennen päivitystä poistin vain tiedoston /etc/init.d/rc.local, mutta uhodin tuon linkin sinne, niin kävi näin.

Koodia: [Valitse]
sudo rm /etc/rc2.d/S99rc.local

janne

  • Käyttäjä
  • Viestejä: 5150
    • Profiili
Kannattaa muuten ottaa poistaa tuo linkki(/etc/rc2.d/S99rc.local), jos päivittää breezystä dapperiin suoraan sources.list:llä. Sillä silloin se ajaa /etc/rc.local -tiedoston kommennot kahteen kertaan.

miksi ja miten ne ajettaisiin kahteen kertaan?

Ennen päivitystä poistin vain tiedoston /etc/init.d/rc.local, mutta uhodin tuon linkin sinne, niin kävi näin.

minulla päivityksen linkki kirjoitti vain omani yli samalla nimellä.
Janne

Melmacian

  • Käyttäjä
  • Viestejä: 868
  • Ubuntu Hardy
    • Profiili
Kannattaa muuten ottaa poistaa tuo linkki(/etc/rc2.d/S99rc.local), jos päivittää breezystä dapperiin suoraan sources.list:llä. Sillä silloin se ajaa /etc/rc.local -tiedoston kommennot kahteen kertaan.

miksi ja miten ne ajettaisiin kahteen kertaan?
Dapperissa se on jo valmiina linkitetty sinne jollain tavalla ja jos tuon jättää niin siihen on sitten toinenkin linkki tms. Näin ainakin luulisin. Kuitenkin tuon ohjeessa tehdyn linkin poistaminen poisti rc.localin tupla ajon.


Ennen päivitystä poistin vain tiedoston /etc/init.d/rc.local, mutta uhodin tuon linkin sinne, niin kävi näin.
minulla päivityksen linkki kirjoitti vain omani yli samalla nimellä.
Niin varmasti tekee tai ainakin kysyy, että kirjoitetaanko päälle, mutta itse yritin pelata varmanpäälle ;)

janne

  • Käyttäjä
  • Viestejä: 5150
    • Profiili
Dapperissa se on jo valmiina linkitetty sinne jollain tavalla ja jos tuon jättää niin siihen on sitten toinenkin linkki tms. Näin ainakin luulisin. Kuitenkin tuon ohjeessa tehdyn linkin poistaminen poisti rc.localin tupla ajon.

niin siis se dapperissa valmiina oleva linkki luodaa siinä kun dapperin paketteja asennetaan.


Niin varmasti tekee tai ainakin kysyy, että kirjoitetaanko päälle, mutta itse yritin pelata varmanpäälle ;)

millä nimellä sinulla sitten on linkki tuohon init-scriptiin?
Janne

Melmacian

  • Käyttäjä
  • Viestejä: 868
  • Ubuntu Hardy
    • Profiili
Siis enpä tiedä millä nimellä se on dapperissa laitettu, kun en sitä itse ole tehnyt. Minulta oli vain breezyssä tehty linkki(/etc/rc2.d/S99rc.local) jäänyt sinne.

janne

  • Käyttäjä
  • Viestejä: 5150
    • Profiili
Siis enpä tiedä millä nimellä se on dapperissa laitettu, kun en sitä itse ole tehnyt. Minulta oli vain breezyssä tehty linkki(/etc/rc2.d/S99rc.local) jäänyt sinne.

no, tuottavatkos komennot:
Koodia: [Valitse]
$ ls -l /etc/rc2.d/ |grep local
$ ls -l /etc/rcS.d/ |grep local

mitään tulosta.
Janne

Melmacian

  • Käyttäjä
  • Viestejä: 868
  • Ubuntu Hardy
    • Profiili
Koodia: [Valitse]
$ ls -l /etc/rc2.d/ |grep local
lrwxrwxrwx 1 root root 20 2006-01-15 18:44 S99local -> /etc/init.d/rc.local
$
Koodia: [Valitse]
$ ls -l /etc/rcS.d/ |grep local
$

Eli näyttääpä tuo olevan ainakin hiukan eri niminen, kuin tuo käsin luotu S99rc.local.

Melmacian

  • Käyttäjä
  • Viestejä: 868
  • Ubuntu Hardy
    • Profiili
Kysytäänpä vielähänkin, että miten voisi sitten ajaa komentoja sammutuksen yhteydessä? Haluaisin laittaa varmuuskopionti scriptini ajettavaksi silloin.

janne

  • Käyttäjä
  • Viestejä: 5150
    • Profiili
Kysytäänpä vielähänkin, että miten voisi sitten ajaa komentoja sammutuksen yhteydessä? Haluaisin laittaa varmuuskopionti scriptini ajettavaksi silloin.

tuon ohjeen mukaan se olisi K:lla alkava scripti/linkki. periaatteessa sama scripti voi hoitaa tehtäviä käynnistettäess, että sammutettaessa, valita pitää vaan hoitaa scriptin sisällä. tosin sammutettaessa (kuten kyllä käynnistettäessäkin) on hyvä olla hoitamatta mitään kovin suuria juttuja, ettei käynnistyminen/sammuttaminen kestä turhan kauaa.
Janne

Risto H. Kurppa

  • Käyttäjä
  • Viestejä: 3024
  • Useita Kubuntuja ajossa.
    • Profiili
    • http://risto.kurppa.fi
Voisiko ohjeen kirjoittaja/täydentäjät kirjoittaa viestin jossa vahvistavat että     

a) ohje on edelleen käyttökelpoinen Hardyssä (tuorein LTS, tuorein stable)
eli uudet ominaisuudet eivät ole poistaneet tarvetta ohjeelle tai että ohjeessa käytetyt työkalut jne ovat edelleen Hardyssä käytössä
b) antavat luvan ohjeen siirtämiseen Ubuntu Suomen wikiin (http://wiki.ubuntu-fi.org). Kts. Wikin lisenssistä jne lisätietoja täältä: http://wiki.ubuntu-fi.org/#head-867666147f48c6b667ec0f6be3f5f16852046770

Kiitos!


r
UUSI UBUNTUN KÄYTTÄJÄ: SÄÄSTÄ AIKAASI LUKEMALLA  -> TÄMÄ <-

janne

  • Käyttäjä
  • Viestejä: 5150
    • Profiili
a) käyttökelpoinen, kyllä. ihan tarkka ja ajantasainen, ei. ubuntu on käyttänyt jo parin version ajan sysv-initin sijaan omaa upstart-nimistä init-systtemiään. kehitys on kehittynyt ja vaikka upstartin oli/on tarkoitus ottaa selvä pesäero sysv-inittiin, niin tällä hetkellä se taitaa olla vielä yhteensopiva. en ole itse seurannut tuota kehitystä, enkä tiedä koska siitä on tulossa epäyhteensopiva.

b) toki
Janne