A runit működése

A Unix/Linux szerverek üzemeltetése wikiből
(Változatok közti eltérés)
(v0.0 - csak átemeltem a tartalmat a bootfolyamatos oldalról)
 
(v0.1)
1. sor: 1. sor:
A daemontools szabad reimplementációja; majdnem minden, ami igaz a runitre, igaz a daemontoolsra is, és fordítva
+
A daemontools szabad reimplementációja; majdnem minden, ami igaz a runitre, igaz a daemontoolsra is, és fordítva.
  +
Az ötlet az, hogy juttassuk érvényre a Unix-filozófiát: egy program egy dolgot csináljon, lehetőleg jól és hatékonyan, de legyen képes más programokkal együttműködni.
  +
A runit csomag egy-egy programja tipikusan kevesebb, mint ezer sor C-kódból áll, és sosem nő a memóriafoglalása.
  +
Ha a runitot statikusan linkeljük a dietlibc-hez, akkor az 1-es processzként futó program csak kb. 20KB-ot vesz igénybe.
  +
A BSD-licenchez hasonló licenc alatt érhető el.
   
Az initet és az initscripteket váltja ki, valamint segít a naplózás megszerezésében. Be lehet vezetni kicsit, nagyon, és teljesen.
+
Az initet és az initscripteket váltja ki, valamint segít a naplózás megszervezésében.
  +
Be lehet vezetni kicsit, nagyon, és teljesen.
   
 
Ha kicsit vezetjük be, akkor megmarad a System V init, de mellette kapunk:
 
Ha kicsit vezetjük be, akkor megmarad a System V init, de mellette kapunk:
   
* Szolgáltatásmenedzsmentet. Az általunk kiválasztott szolgáltatások:
+
* Szolgáltatásmenedzsmentet. A szolgáltatások
 
** tiszta környezettel indulnak
 
** tiszta környezettel indulnak
 
** újraindulnak, ha kilépnek
 
** újraindulnak, ha kilépnek
12. sor: 12. sor:
 
*** méret alapján rotált logok
 
*** méret alapján rotált logok
 
*** utófeldolgozás lehetősége
 
*** utófeldolgozás lehetősége
  +
*** akkor is működik, ha a szolgáltatás chrootban fut
  +
*** a logolás és a szolgáltatás egymástól függetlenül újraindítható/leállítható
 
** kiválasztott felhasználók sudo nélkül is menedzselhetik őket
 
** kiválasztott felhasználók sudo nélkül is menedzselhetik őket
 
** könnyedén lekérdezhető a státuszuk
 
** könnyedén lekérdezhető a státuszuk
 
** könnyedén küldhető nekik signal
 
** könnyedén küldhető nekik signal
  +
** könnyedén biztosíthatjuk ezeket a tulajdonságokat a felhasználók saját "szolgáltatásainak" - pl.:
  +
*** screen, benne irssi
  +
*** eggdrop bot (sajnos át kell írni, mert mindenképpen a háttérbe akarja rakni magát)
  +
*** fetchmail
  +
*** signify
  +
*** akár apache vagy egyéb
   
 
Ha nagyon bevezetjük, akkor emellett még az initet is kiváltjuk, de a rendszerindulást továbbra is a hagyományos initscriptjeink vezénylik le, csak az inittab válik feleslegessé.
 
Ha nagyon bevezetjük, akkor emellett még az initet is kiváltjuk, de a rendszerindulást továbbra is a hagyományos initscriptjeink vezénylik le, csak az inittab válik feleslegessé.
  +
Emellett gyorsabbá válik az indítás és a leállítás, mert sokmindent egyszerre fog csinálni a runit (azért nem kell azzal foglalkoznia, hogy minek mi után kell jönnie, mert ezt az intelligenciát nekünk kell megavlósítanunk a <tt>run</tt> scriptekben - l. később).
   
 
Ha teljesen bevezetjük, akkor az rcS után már csak a runit által menedzselt szolgáltatásaink futnak, vagyis az "rc 2" már nem kell, hogy lefusson.
 
Ha teljesen bevezetjük, akkor az rcS után már csak a runit által menedzselt szolgáltatásaink futnak, vagyis az "rc 2" már nem kell, hogy lefusson.
  +
  +
== Architektúra ==
  +
  +
* Minden szolgáltatáshoz tartozik egy könyvtár (directory), amiben:
  +
** Megvan az a program (általában script), ami az adott szolgáltatást elindítja és futtatja (és <tt>run</tt> névre hallgat); addig nem léphet ki, amíg a szolgáltatás nem lépett ki
  +
** A runit létrehoz egy <tt>supervise</tt> könyvtárat - l. később
  +
** Lehet egy <tt>down</tt> nevű file, ami azt jelzi, hogy a szolgáltatás normális állapota az, hogy nem fut
  +
** Lehet egy <tt>log</tt> nevű könyvtár, ha a szolgáltatáshoz naplózást is szeretnénk - l. később
  +
** Lehet egy <tt>check</tt> nevű program, ami 0-ás visszatérési értékkel lép ki, ha a szolgáltatás működik (ami nem azonos azzal, hogy fut), egyébként nullától különbözővel
  +
** Lehet egy <tt>finish</tt> nevű program, amit abban az esetben kell lefuttatni, ha a <tt>run</tt> kilép
  +
  +
Ezeket az ún. service directorykat általában a /service alá symlinkeljük be, ha az adott szolgáltatást futtatni akarjuk.
  +
  +
A /service könyvtárat figyeli a <tt>runsvdir</tt>, és minden alkönyvtárra indít egy <tt>runsv</tt> folyamatot. Erről rövidsen lesz szó.
  +
  +
== Telepítés ==
  +
  +
* Ajánlott verzió: legalább 1.6 (bár a korábbiak is használhatók)
  +
* Debianhoz és Ubuntuhoz van szép runit csomag, ez csak felrakja a runitot, de nem cseréli le az initet - mindenféle körültekintés nélkül telepíthetjük
  +
** Van runit-run csomag is, ami le is cseréli az initet - csak óvatosan: reboot után, ha nem vigyázunk, csak a konzolról fogunk tudni belépni, mert nem indul el az sshd
  +
* Nyilván fel lehet rakni forrásból is
  +
** Alapból a djb-féle /package, /command könyvtárstruktúrát használja, aminek ugyan van előnye, de azért eléggé eltér az LFS-től
   
 
== Rendszerindítás runittal ==
 
== Rendszerindítás runittal ==
   
Ha init helyett a runit indul, akkor a /etc/runit/1 nevű scriptet indítja el először. Ennek a tartalma lehet pl ez:
+
Ha init helyett a runit indul, akkor a /etc/runit/1 nevű scriptet indítja el először. Ennek a tartalma lehet pl ez (a runit-run csomagban is ilyesmi van):
   
 
<pre>
 
<pre>
29. sor: 60. sor:
   
 
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/bin/X11
 
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/bin/X11
  +
export PATH
   
 
/etc/init.d/rcS
 
/etc/init.d/rcS
34. sor: 66. sor:
 
/etc/init.d/systune start
 
/etc/init.d/systune start
 
/etc/init.d/ud start
 
/etc/init.d/ud start
/etc/firewall/firewall
+
/etc/firewall/firewall start
 
/etc/init.d/rmnologin start
 
/etc/init.d/rmnologin start
 
/etc/init.d/xend start
 
/etc/init.d/xend start
43. sor: 75. sor:
 
</pre>
 
</pre>
   
Ha létezik és végrehajtható a /etc/runit/stopit file, akkor a runit a CONT signal hatására leállítja a rendszert. A ctrl-alt-del-t kezelő scriptből adhatunk rá futtatási jogot, ha azt akarjuk, hogy a ctrl-alt-del hatása leállítás legyen.
+
Ne feledjük, hogy a beállított és exportált környezeti változókat a script gyermekfolyamatai örökölni fogják.
  +
  +
Az 1-es script tartalmazza a rendszerindításkor kiadandó parancsok listáját, emiatt nem hordozható korlátozás nélkül.
  +
Vegyük észre, hogy a fenti scriptben használhattunk volna rc.d mechanizmust is a szolgáltatások elindítására, ami
  +
* kicsit nehezebben átlátható,
  +
* egy picit lassúbb, cserébe
  +
* modulárisabb és
  +
* könnyebb automatizálni a karbantartását.
   
 
A /etc/runit/1 után a /etc/runit/2 jön (micsoda meglepetés):
 
A /etc/runit/1 után a /etc/runit/2 jön (micsoda meglepetés):
58. sor: 90. sor:
 
Innentől, amig a runsvdir ki nem lép, monitorozza a szolgáltatásainkat és fut a rendszer.
 
Innentől, amig a runsvdir ki nem lép, monitorozza a szolgáltatásainkat és fut a rendszer.
   
Ha kilép a runsvdir, kilép a /etc/runit/2 is, és elindul a /etc/runit/3, ami a leállításért felelős:
+
Láthatjuk, hogy a 2-es script lényegében semmilyen rendszerspecifikus dolgot nem tartalmaz, hordozható.
  +
  +
Ha kilép a runsvdir, kilép a /etc/runit/2 is; ha a visszatérési értéke 0 volt, elindul a /etc/runit/3, ami a leállításért felelős.
  +
  +
Ha nem 0 volt a 2-es script visszatérési értéke, akkor a runit újra elindítja.
  +
  +
A 3-as script tartalma például a következő lehet:
   
 
<pre>
 
<pre>
76. sor: 108. sor:
 
/etc/init.d/rc $LAST
 
/etc/init.d/rc $LAST
 
</pre>
 
</pre>
  +
  +
Elvileg a 3-as script is lehetne rendszerfüggő, mivel a rendszer leállításával kapcsolatos parancsokat kell benne felsorolnunk, azonban gyakran nem az.
  +
  +
Ha létezik és végrehajtható a /etc/runit/stopit file, akkor a runit a CONT signal hatására leállítja a rendszert.
  +
A ctrl-alt-del-t kezelő scriptből adhatunk rá futtatási jogot, ha azt akarjuk, hogy a ctrl-alt-del hatása leállítás legyen.
  +
  +
== Ajánlott irodalom ==
  +
  +
* [http://smarden.sunsite.dk/runit/ runit - a UNIX init scheme with service supervision] - a runit honlapja

A lap 2006. október 16., 01:48-kori változata

A daemontools szabad reimplementációja; majdnem minden, ami igaz a runitre, igaz a daemontoolsra is, és fordítva. Az ötlet az, hogy juttassuk érvényre a Unix-filozófiát: egy program egy dolgot csináljon, lehetőleg jól és hatékonyan, de legyen képes más programokkal együttműködni. A runit csomag egy-egy programja tipikusan kevesebb, mint ezer sor C-kódból áll, és sosem nő a memóriafoglalása. Ha a runitot statikusan linkeljük a dietlibc-hez, akkor az 1-es processzként futó program csak kb. 20KB-ot vesz igénybe. A BSD-licenchez hasonló licenc alatt érhető el.

Az initet és az initscripteket váltja ki, valamint segít a naplózás megszervezésében. Be lehet vezetni kicsit, nagyon, és teljesen.

Ha kicsit vezetjük be, akkor megmarad a System V init, de mellette kapunk:

  • Szolgáltatásmenedzsmentet. A szolgáltatások
    • tiszta környezettel indulnak
    • újraindulnak, ha kilépnek
    • opcionálisan megbízható naplózást kapnak
      • naplóüzenet nem vész el naplózás közben
      • méret alapján rotált logok
      • utófeldolgozás lehetősége
      • akkor is működik, ha a szolgáltatás chrootban fut
      • a logolás és a szolgáltatás egymástól függetlenül újraindítható/leállítható
    • kiválasztott felhasználók sudo nélkül is menedzselhetik őket
    • könnyedén lekérdezhető a státuszuk
    • könnyedén küldhető nekik signal
    • könnyedén biztosíthatjuk ezeket a tulajdonságokat a felhasználók saját "szolgáltatásainak" - pl.:
      • screen, benne irssi
      • eggdrop bot (sajnos át kell írni, mert mindenképpen a háttérbe akarja rakni magát)
      • fetchmail
      • signify
      • akár apache vagy egyéb

Ha nagyon bevezetjük, akkor emellett még az initet is kiváltjuk, de a rendszerindulást továbbra is a hagyományos initscriptjeink vezénylik le, csak az inittab válik feleslegessé. Emellett gyorsabbá válik az indítás és a leállítás, mert sokmindent egyszerre fog csinálni a runit (azért nem kell azzal foglalkoznia, hogy minek mi után kell jönnie, mert ezt az intelligenciát nekünk kell megavlósítanunk a run scriptekben - l. később).

Ha teljesen bevezetjük, akkor az rcS után már csak a runit által menedzselt szolgáltatásaink futnak, vagyis az "rc 2" már nem kell, hogy lefusson.

Tartalomjegyzék

1 Architektúra

  • Minden szolgáltatáshoz tartozik egy könyvtár (directory), amiben:
    • Megvan az a program (általában script), ami az adott szolgáltatást elindítja és futtatja (és run névre hallgat); addig nem léphet ki, amíg a szolgáltatás nem lépett ki
    • A runit létrehoz egy supervise könyvtárat - l. később
    • Lehet egy down nevű file, ami azt jelzi, hogy a szolgáltatás normális állapota az, hogy nem fut
    • Lehet egy log nevű könyvtár, ha a szolgáltatáshoz naplózást is szeretnénk - l. később
    • Lehet egy check nevű program, ami 0-ás visszatérési értékkel lép ki, ha a szolgáltatás működik (ami nem azonos azzal, hogy fut), egyébként nullától különbözővel
    • Lehet egy finish nevű program, amit abban az esetben kell lefuttatni, ha a run kilép

Ezeket az ún. service directorykat általában a /service alá symlinkeljük be, ha az adott szolgáltatást futtatni akarjuk.

A /service könyvtárat figyeli a runsvdir, és minden alkönyvtárra indít egy runsv folyamatot. Erről rövidsen lesz szó.

2 Telepítés

  • Ajánlott verzió: legalább 1.6 (bár a korábbiak is használhatók)
  • Debianhoz és Ubuntuhoz van szép runit csomag, ez csak felrakja a runitot, de nem cseréli le az initet - mindenféle körültekintés nélkül telepíthetjük
    • Van runit-run csomag is, ami le is cseréli az initet - csak óvatosan: reboot után, ha nem vigyázunk, csak a konzolról fogunk tudni belépni, mert nem indul el az sshd
  • Nyilván fel lehet rakni forrásból is
    • Alapból a djb-féle /package, /command könyvtárstruktúrát használja, aminek ugyan van előnye, de azért eléggé eltér az LFS-től

3 Rendszerindítás runittal

Ha init helyett a runit indul, akkor a /etc/runit/1 nevű scriptet indítja el először. Ennek a tartalma lehet pl ez (a runit-run csomagban is ilyesmi van):

#!/bin/sh
# system one time tasks

PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/bin/X11
export PATH

/etc/init.d/rcS
/etc/init.d/makedev start
/etc/init.d/systune start
/etc/init.d/ud start
/etc/firewall/firewall start
/etc/init.d/rmnologin start
/etc/init.d/xend start
/etc/init.d/xendomains start

touch /etc/runit/stopit
chmod 0 /etc/runit/stopit

Ne feledjük, hogy a beállított és exportált környezeti változókat a script gyermekfolyamatai örökölni fogják.

Az 1-es script tartalmazza a rendszerindításkor kiadandó parancsok listáját, emiatt nem hordozható korlátozás nélkül. Vegyük észre, hogy a fenti scriptben használhattunk volna rc.d mechanizmust is a szolgáltatások elindítására, ami

  • kicsit nehezebben átlátható,
  • egy picit lassúbb, cserébe
  • modulárisabb és
  • könnyebb automatizálni a karbantartását.

A /etc/runit/1 után a /etc/runit/2 jön (micsoda meglepetés):

#!/bin/sh

PATH=/usr/local/bin:/usr/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin

exec env - PATH=$PATH \
runsvdir -P /var/service 'log: ...........................................................................................................................................................................................................................................................................................................................................................................................................'

Innentől, amig a runsvdir ki nem lép, monitorozza a szolgáltatásainkat és fut a rendszer.

Láthatjuk, hogy a 2-es script lényegében semmilyen rendszerspecifikus dolgot nem tartalmaz, hordozható.

Ha kilép a runsvdir, kilép a /etc/runit/2 is; ha a visszatérési értéke 0 volt, elindul a /etc/runit/3, ami a leállításért felelős.

Ha nem 0 volt a 2-es script visszatérési értéke, akkor a runit újra elindítja.

A 3-as script tartalma például a következő lehet:

#!/bin/sh
exec 2>&1

PATH=/sbin:/bin:/usr/sbin:/usr/bin

LAST=0
test -x /etc/runit/reboot && LAST=6

echo 'Waiting for services to stop...'
sv -w196 force-stop /var/service/*
sv exit /var/service/*

echo 'Shutdown...'
/etc/init.d/rc $LAST

Elvileg a 3-as script is lehetne rendszerfüggő, mivel a rendszer leállításával kapcsolatos parancsokat kell benne felsorolnunk, azonban gyakran nem az.

Ha létezik és végrehajtható a /etc/runit/stopit file, akkor a runit a CONT signal hatására leállítja a rendszert. A ctrl-alt-del-t kezelő scriptből adhatunk rá futtatási jogot, ha azt akarjuk, hogy a ctrl-alt-del hatása leállítás legyen.

4 Ajánlott irodalom

Személyes eszközök