Debian tips: gestione demoni con update-rc.d

Non sono certo la persona adatta a spiegare in dettaglio cosa sia un demone, o cosa un runlevel: mi limiterò a definire il primo un tipo di programmi avviati in automatico e eseguiti in background, mentre per i runlevel potrei adottare la definizione di “gruppi di demoni” da avviare o stoppare a seconda delle occasioni.

In Debian, i demoni vengono installati seguendo le “norme” del Linux Standard Base (LSB), che prevedono l’avvio dei demoni nei runlevel 2,3,4,5 e il loro non-avvio (o l’arresto) nei runlevel 0,1,6. In pratica, in un sistema Debian “normale”, di default, ogni demone contenuto in un pacchetto installato viene avviato in automatico (e arrestato allo spegnimento).

Questo può piacerci, nel caso di demoni irrinunciabili come udev o hal, o come per il nostro gestore di accessi preferito (gdm, kdm). Può risultare però antipatico nel caso di demoni come amule-daemon, che non sempre vorremmo vedere in background, o nel caso abbiamo installato contemporaneamente wicd e network-manager, creando così dei conflitti che magari ci impediscono di usare la rete.

Come fare allora?

Se si vuole arrestare o avviare un demone solo per la sessione attuale, senza modificare il suo comportamento all’avvio, Debian come molte altre distribuzioni fornisce il comando service, da usare con le 3 azioni possibili: start, stop, restart, come segue (userò l’esempio di amule-daemon, ma vale per qualunque altro demone che troviate in /etc/init.d ):

# service start amule-daemon
# service stop amule-daemon
# service restart amule-daemon
(quest’ultimo richiama, nell’ordine, stop e quindi start)

Se invece volessimo evitare che amule-daemon si avvi in automatico ogni volta che accendiamo il computer, che si fa?

In teoria, l’avvio o arresto di un demone è deciso semplicemente da dei link simbolici agli script contentuti in /etc/init.d, creati nella cartella /etc/rcX.d, dove X sta per il numero del runlevel. Al nome del demone viene aggiunta, come prefisso, una lettera che specifica se il demone va avviato o arrestato nel runlevel (rispettivamente, lettera S e K) e un numero che rappresenta l’ordine in cui eseguire l’operazione. Così, un demone come amule-daemon sarà avviato nel runlevel 2 attraverso un link chiamato, ad esempio, S80amule-daemon, o arrestato nel runlevel 6 con K20amule-daemon.

E’ andando a modificare i nomi e la posizione di questi link che si deciderà se e come avviare un demone. Si potrebbe agire direttamente da linea di comando, a forza di ln -s e mv, o con programmi come sysv-rc-conf. Ma questo è un approccio sconsigliato, in quanto Debian ha migrato il sistema dei demoni a un approccio basato sulle dipendenze: proprio come per i pacchetti, Debian è in grado di riconoscere quali demoni richiedono l’avvio di altri per funzionare, e così decidere l’ordine migliore per avvio e arresto degli script.

Il comando da usare è perciò update-rc.d, la cui comprensione non è stata per me banale come sembrava.

update-rc.d ha infatti diverse possibili azioni:

  • defaults che, come si immagina, imposta avvio e stop di un demone ai defaults, come indicati prima, secondo LSB;
  • start che crea dei symlink con la lettera S all’inizio per avviare un demone. Deve essere seguito da due cifre che rappresentano l’ordine in cui far partire il demone e un numero che specifica il runlevel (es: update-rc.d amule-daemon start 40 2)
  • stop, equivalente di start per l’arresto. E’ da notare che tutti i precedenti comandi non compiono azioni se è già presente un symlink nella cartella del runlevel. In questo modo non sovrascrivono eventuali impostazioni manuali.
  • enable modifica un symlink d’arresto esistente per farlo diventare un symlink d’avvio, sostituendo S alla lettera K e scegliendo come numero d’ordine 100 meno il numero impostato per lo script d’arresto. Così K20amule-daemon diventerà S80amule-daemon.
  • disable esegue l’operazione contraria ad enable
  • remove elimina ogni symlink nei runlevel, a patto che lo script a cui puntano non sia più presente (è un comando che difficilmente verrà usato manualmente, serve nei casi di rimozione completa di un pacchetto e verrà chiamato in automatico dagli script di post-remove)

Questo, almeno, quello che si evince dalla manpage di update-rc.d, che però non pare proprio corretto. Infatti, dall’uso che ne ho fatto, ho notato che è praticamente impossibile ripristinare la situazione iniziale se avete cancellato un symlink da un runlevel: enable e disable non sapranno cosa fare, defaults, start, stop falliranno dicendo che la configurazione attuale sovrascrive quella di default (e quindi non faranno niente). L’unica soluzione che ho trovato va contro quanto affermato nel man: consiste infatti nel chiamare remove, che rimuoverà tutti i symlink dei runlevel (anche se lo script in /etc/init.d è presente!), poi chiamare defaults, che questa volta non si lamenterà.

In pratica, però, tutto questo mi sembra ancora un po’ complicato, e ho l’impressione che la man page di update-rc.d non sia affatto aggiornata. Forse in Debian si sono dimenticati qualche dettaglio?

Fortunatamente per chi usa Ubuntu e derivate, comunque, il sistema di init di Ubuntu è diverso (basato su upstart), quindi quanto detto non si applica ad Ubuntu.

Beati voi…

=-=-=-=-=
Powered by Blogilo

Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...