Insserv: Dependency-based boot u Debianu

Jedna od novosti koje donosi Squeeze je boot sustava prilagođen ovisnostima između paketa, ili na engleskom, što zvuči efektnije, dependency-based boot. Ova novost se pojavila i ranije, tako je već u izdanju Lenny većina paketa sadržavala odgovarajuće oznake u inicijalizacijskim skriptama.

Što nedostaje starom sustavu, zar dosad nije radio kako treba? Iskreno govoreći, radio je, ali uz neke probleme i nelogičnosti.  Primjerice, gašenje poslužitelja ne ide suprotnim redoslijedom od njegova pokretanja, kako biste očekivali.  Nadalje, prilikom restarta skripte iz direktorija /etc/rc6.d se pokreću sa parametrom "stop" iako počinju sa slovom "S" (što označava "start").

Najgore je ipak to što u određenim kombinacijama paketa jednostavno dođe do kolizije i nastanu problemi koje morate razriješiti ručno, izvan paketnog sustava. Ovakva situacija nije česta, ali se ipak pojavi potreba da se neka skripta pokreće prije neke druge, a da to nije moguće izvesti. Pogledajmo primjer s osnovnim vrijednostima kako je to uobičajeno u paketima:

20A_skripta
20B_skripta

Ukoliko trebate dodati skriptu C koja se mora pokrenuti prije skripte A, ali poslije skripte B, vidjet ćemo da je to nemoguće napraviti. Način na koji se to dosada rješavalo je bilo kontaktiranje maintainera oba paketa kako bi promijenili redoslijed izvršavanja svojih skripti:

22A_skripta
20B_skripta
21C_skripta

Ovaj je način nezgrapan, a u slučaju da se radi o promjenama u nekoliko desetaka paketa praktički ga je nemoguće ostvariti.

Rješenje nudi insserv, implementacija dependency-based boot sustava koji se pojavio još u izdanju Lenny, a default je u Squeezu. U osnovi, radi se samo o dodatnim zaglavljima unutar već postojećih inicijalizacijskih skripti. U zaglavljima se određuju međuovisnosti skripti, u kojim runlevelima će se skripta pokretati, koji preduvjeti moraju postojati da bi se pokrenuli i slično. Pogledajmo zaglavlje Postfixa:

### BEGIN INIT INFO
# Provides: postfix mail-transport-agent
# Required-Start: $local_fs $remote_fs $syslog $named $network $time
# Required-Stop: $local_fs $remote_fs $syslog $named $network
# Should-Start: postgresql mysql clamav-daemon postgrey spamassassin
# Should-Stop: postgresql mysql clamav-daemon postgrey spamassassin
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop the Postfix Mail Transport Agent
# Description: postfix is a Mail Transport agent
### END INIT INFO

Zaglavlja imaju ova značenja:

Provides
- ime same skripte, mora biti jedinstveno u cijelom sustavu

Required-Start
Required-Stop
Should-Start
Should-Stop

- uvjeti koji moraju biti zadovoljeni za pokretanje, odnosno zaustavljanje skripte. Mogu biti imena drugih skripti, ili virtualni:
- $local_fs, $remote_fs
moraju biti mountani svi lokalni, odnosno udaljeni datotečni sustavi
- $network
mrežno sučelje mora biti inicijalizirano, odnosno mreža aktivna
- $named
mora postojati aktivan DNS sustav (obično je to BIND)
- $portmap
mora postojati aktivan RPC podsustav
- $syslog
mora biti aktiviran sustav logiranja, syslog
- $time
vrijeme mora biti podešeno, obično to znači aktivan NTP daemon
- $all
"magična" ključna riječ, o ovome mora ovisiti skripta koja se treba pokretati posljednja (ali nažalost ne vrijedi obrnuto, za gašenje sustava). Također, mogu se definirati nove ključne riječi, što bi trebalo koordinirati s Linux Assigned Names and Numbers Authority (LANANA)

Default-Start
Default-Stop
- u navedenim runlevelima će se skripte pokretati, odnosno zaustavljati

Description
Short-Description

- opis servisa koji skripta nudi

U ovom primjeru vidimo kako Postfix traži već pokrenut postgresql i mysql, ali to zapravo nije čvrsto uvjetovano. Skripta će pokrenuti mysql, ali samo ako postoji na sustavu. Ako ga nema, ili se ne može pokrenuti, Postfix će se ipak podići. Time je omogućen rad servisima koji mogu raditi i kad nisu ispunjeni svi preduvjeti.

Insserv radi ovako: pretvara sve symlinkove iz /etc/rc0.d i /etc/rc6.d u "stop" linkove, te zamjenjuje staru naredbu "update-rc.d" s naredbom "insserv". Na kraju, mijenja linkove u skladu s novim tagovima unutar startup skripti. No, neće biti moguće konvertirati sustav ako postoje stare skripte (bez dodatnih tagova), logičke petlje, duplikati i slično.

S ovim "preslagivanjem" boot procedure moguće je dobiti mjerljiva ubrzanja, što će ipak ovisiti najviše o snazi vašeg hardvera, a manje o redoslijedu podizanja servisa.

Ukoliko tako želite, možete i onemogućiti Dependency-based boot, ali učinite to što prije, prije instalacije novih paketa. Postoji šansa da će sustav raditi i nakon instalacije nekih novih paketa, ali garancija ne postoji.

U paketu insserv postoji skripta /usr/share/insserv/check-initd-order, koja će vam pomoći u provjeri pripravnosti sustava za prijelaz na novi način boota.

Nada uklonite sve prepreke, dovoljno je naraviti

# dpkg-reconfigure insserv

kako bi konverzija krenula. Na ekranu će se ispisivati određene poruke:

No packages found matching diversion.
No packages found matching by.
No packages found matching from.
No packages found matching diversion.

Unable to migrate to dependency-based boot system
.
. Tests have determined that problems in the boot system exist which
. prevent migration to dependency-based boot sequencing:
.
. insserv: warning: script 'S99nessusd' missing LSB tags and overrides,
. insserv: warning: script 'nessusd' missing LSB tags and overrides,
. insserv: There is a loop between service munin-node and mountall if
. started, insserv: loop involving service mountall at depth 4, insserv:
. loop involving service checkfs at depth 3, ...

Kao što se može vidjeti, čest je slučaj da konverzija jednostavno zapne. Razlog su najčešće zaostale skripte iz starih paketa ili datoteke kojima tamo nije mjesto. U primjeru se radi o staroj skripti iz paketa nessus, a u praksi smo sreli i probleme s paketima apache, libdevmapper, modutils, mysql-server-5.0, netkit-inetd (openbsd-inetd), xfree86-common, dcc-client, raidtools2 i drugima.

Ponegdje su zaostale datoteke /etc/init.d/slapd.cn4-upgrade i /etc/init.d/unconfigured.sh (s linkovima u rc*.d direktorijima), koje slobodno možete obrisati.

Ipak, obično je dovoljno napraviti purge odgovarajućeg paketa s:

# dpkg -P dcc-client
# dpkg-reconfigure sysv-rc

Nakon što rješimo problem sa starim paketima, uspješnu konverziju ćemo prepoznati po ovim porukama:

info: Reordering boot system, log to /var/lib/insserv/run-20120226T2303.log
success: Enabled dependency based boot system.

Naš sustav sada rabi dependency-based boot.

Kuharice: 
Vote: 
0
No votes yet