[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]


247. Configurazione di una distribuzione Debian

Dal punto di vista della configurazione, la distribuzione Debian cerca di interferire il meno possibile con le convenzioni acquisite nei sistemi Unix. In questo senso, sono poche le particolarità da tenere in considerazione per amministrare un sistema GNU/Linux Debian.

247.1 Procedura di inizializzazione del sistema

La procedura di inizializzazione del sistema è attivata dal'eseguibile `init' attraverso le indicazioni di `/etc/inittab'. I livelli di esecuzione sono indicati brevemente nella tabella 247.1; di fatto si usa normalmente il livello numero due.

Livello di esecuzione Utilizzo
0 Arresto del sistema.
1 Utente singolo.
2 Livello normale per la multiutenza.
3 Livello ausiliario per la multiutenza.
4 Livello disponibile per la multiutenza.
5 Livello disponibile per la multiutenza.
6 Riavvio del sistema.

Tabella 247.1: Livelli di esecuzione tipici di una distribuzione Debian.

Il file `/etc/inittab' è quello che dirige il funzionamento di Init, e analizzandone il contenuto si può intendere il ruolo degli script della procedura di inizializzazione del sistema.

# /etc/inittab: init(8) configuration.
# $Id: inittab,v 1.8 1998/05/10 10:37:50 miquels Exp $

# The default runlevel.
id:2:initdefault:

# Boot-time system configuration/initialization script.
# This is run first except when booting in emergency (-b) mode.
si::sysinit:/etc/init.d/rcS

# What to do in single-user mode.
~~:S:wait:/sbin/sulogin

# /etc/init.d executes the S and K scripts upon change
# of runlevel.
#
# Runlevel 0 is halt.
# Runlevel 1 is single-user.
# Runlevels 2-5 are multi-user.
# Runlevel 6 is reboot.

l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# Normally not reached, but fallthrough in case of emergency.
z6:6:respawn:/sbin/sulogin

# What to do when CTRL-ALT-DEL is pressed.
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

# Action on special keypress (ALT-UpArrow).
kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."

# What to do when the power fails/returns.
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop

# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
#  <id>:<runlevels>:<action>:<process>
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

# Example how to put a getty on a serial line (for a terminal)
#
#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100

# Example how to put a getty on a modem line.
#
#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3

247.1.1 Collegamento tra i vari componenti della procedura di inizializzazione del sistema

Attraverso il file `/etc/inittab' vengono indicati due script fondamentali, attraverso cui si articola la procedura di inizializzazione del sistema. Si tratta di `/etc/init.d/rcS' e `/etc/init.d/rc'. Il primo viene utilizzato a ogni avvio del sistema, e da questo dipendono le operazioni che vanno svolte una volta sola in quella occasione; il secondo serve ogni volta che si cambia il livello di esecuzione.

247.1.2 /etc/init.d/*

I file contenuti nella directory `/etc/init.d/', quando si riferiscono a dei servizi, hanno una struttura abbastanza comune, simile a quella seguente. Si fa riferimento all'ipotetico servizio «pippo», a cui corrisponde un demone con lo stesso nome.

#!/bin/sh
#
# Avvia o arresta il servizio «pippo» gestito attraverso il demone «pippo»
#
# Tizio Tizi <tizio@dinkel.brot.dg>

# Prima di cominciare verifica che esista l'eseguibile del demone.
test -x /usr/sbin/pippo || exit 0

# Analizza l'argomento e vi si adegua.
case "$1" in
    start)
	echo -n "Avvio di un servizio inutile: pippo"
	start-stop-daemon --start --quiet --exec /usr/sbin/pippo
	echo "."	
    ;;

    stop)
	echo -n "Arresto di un servizio inutile: pippo"
	start-stop-daemon --stop --quiet  \
	    --pidfile /var/run/pippo.pid --exec /usr/sbin/pippo
	echo "."	
    ;;

    restart)
        $0 stop
        $0 start
    ;;
    
    reload)
	echo -n "Rilettura della configurazione di pippo..."
	start-stop-daemon --stop --signal 1 --quiet  \
	    --pidfile /var/run/named.pid --exec /usr/sbin/named
	echo "fatto." 
    ;;

    force-reload)
        $0 restart
    ;;

    *)
	echo "Utilizzo: /etc/init.d/pippo {start|stop|reload|restart|force-reload}" >&2
	exit 1
    ;;
esac

exit 0

Nella prima parte viene verificato che esista effettivamente l'eseguibile del demone `pippo', e in caso contrario conclude lo script, ma senza restituire un errore (`exit 0').

Subito dopo si passa all'analisi del primo (e unico) argomento fornito allo script:

247.1.3 /etc/rc?.d/

Le directory `/etc/rcn.d/' e anche la directory `/etc/rcS.d/', servono a contenere una serie di collegamenti simbolici che puntano a script reali contenuti in `/etc/init.d'. I due listati seguenti si riferiscono al contenuto ipotetico di `/etc/rc1.d/' e `/etc/rc2.d/':

lrwxrwxrwx 1 root root 14 ago  9 15:18 K11cron -> ../init.d/cron
lrwxrwxrwx 1 root root 17 ago  9 15:18 K12kerneld -> ../init.d/kerneld
lrwxrwxrwx 1 root root 21 ago  9 15:18 K15netstd_init -> ../init.d/netstd_init
lrwxrwxrwx 1 root root 17 ago  9 15:18 K18netbase -> ../init.d/netbase
lrwxrwxrwx 1 root root 14 ago  9 15:18 K19bind -> ../init.d/bind
lrwxrwxrwx 1 root root 14 ago  9 15:18 K20exim -> ../init.d/exim
lrwxrwxrwx 1 root root 13 ago  9 15:18 K20gpm -> ../init.d/gpm
lrwxrwxrwx 1 root root 17 ago  9 15:18 K20logoutd -> ../init.d/logoutd
lrwxrwxrwx 1 root root 15 ago  9 15:18 K20lprng -> ../init.d/lprng
lrwxrwxrwx 1 root root 13 ago  9 15:18 K20ppp -> ../init.d/ppp
lrwxrwxrwx 1 root root 13 ago  9 15:18 K20ssh -> ../init.d/ssh
lrwxrwxrwx 1 root root 20 ago  9 15:18 K25nfs-server -> ../init.d/nfs-server
lrwxrwxrwx 1 root root 21 ago  9 15:18 K30netstd_misc -> ../init.d/netstd_misc
lrwxrwxrwx 1 root root 16 ago  9 15:18 K89pcmcia -> ../init.d/pcmcia
lrwxrwxrwx 1 root root 18 ago  9 15:18 K90sysklogd -> ../init.d/sysklogd
lrwxrwxrwx 1 root root 16 ago  9 15:18 S20single -> ../init.d/single

lrwxrwxrwx 1 root root 18 ago  9 15:18 S10sysklogd -> ../init.d/sysklogd
lrwxrwxrwx 1 root root 16 ago  9 15:18 S11pcmcia -> ../init.d/pcmcia
lrwxrwxrwx 1 root root 17 ago  9 15:18 S12kerneld -> ../init.d/kerneld
lrwxrwxrwx 1 root root 21 ago  9 15:18 S15netstd_init -> ../init.d/netstd_init
lrwxrwxrwx 1 root root 17 ago  9 15:18 S18netbase -> ../init.d/netbase
lrwxrwxrwx 1 root root 14 ago  9 15:18 S19bind -> ../init.d/bind
lrwxrwxrwx 1 root root 14 ago  9 15:18 S20exim -> ../init.d/exim
lrwxrwxrwx 1 root root 13 ago  9 15:18 S20gpm -> ../init.d/gpm
lrwxrwxrwx 1 root root 17 ago  9 15:18 S20logoutd -> ../init.d/logoutd
lrwxrwxrwx 1 root root 15 ago  9 15:18 S20lprng -> ../init.d/lprng
lrwxrwxrwx 1 root root 13 ago  9 15:18 S20ppp -> ../init.d/ppp
lrwxrwxrwx 1 root root 13 ago  9 15:18 S20ssh -> ../init.d/ssh
lrwxrwxrwx 1 root root 20 ago  9 15:18 S25nfs-server -> ../init.d/nfs-server
lrwxrwxrwx 1 root root 21 ago  9 15:18 S30netstd_misc -> ../init.d/netstd_misc
lrwxrwxrwx 1 root root 14 ago  9 15:18 S89cron -> ../init.d/cron
lrwxrwxrwx 1 root root 19 ago  9 15:18 S99rmnologin -> ../init.d/rmnologin

I collegamenti che iniziano con la lettera «S» vengono avviati ordinatamente all'attivazione del livello di esecuzione corrispondente, con l'argomento `start', mentre quelli che iniziano con la lettera «K» vengono avviati prima di passare a un nuovo livello di esecuzione, con l'argomento `stop'.

Il numero che segue la lettera «S» e «K», serve a definire un ordine alfabetico, corrispondente a quello in cui i servizi vanno avviati o arrestati. Se si volesse aggiungere uno script, nella directory `/etc/init.d/' per la gestione di un servizio addizionale, si dovrebbero predisporre i collegamenti relativi nella directory in cui servono: per esempio potrebbe essere necessario un collegamento «K» nelle directory `/etc/rc0.d/', `/etc/rc1.d/' e `/etc/rc6.d/', mentre nelle altre directory `/etc/rc[2-5].d/' si potrebbe inserire un collegamento «S», a seconda di come si vogliono gestire i livelli di esecuzione da due a cinque.

La distribuzione Debian non dispone di uno script `rc.local'. Per ottenere lo stesso risultato, si può predisporre uno script normale, che eventualmente non sia influenzato dagli argomenti, e quindi si devono predisporre i collegamenti simbolici di tipo «S» necessari, probabilmente con un numero abbastanza elevato, in modo da farlo intervenire alla fine della procedura di avvio del sistema.

247.1.4 # update-rc.d

Il programma `update-rc.d' permette di facilitare la creazione e l'eliminazione dei collegamenti simbolici nelle directory `/etc/rcn.d/'. In generale, il suo utilizzo non è indispensabile, ma torna molto utile nella realizzazione di script legati all'installazione e alla disinstallazione dei pacchetti. Qui viene descritto solo il suo uso elementare, dal momento che si può fare tutto quello che si vuole anche senza l'aiuto di questo programma. Eventualmente si può consultare la sua pagina di manuale update-rc.d(8).

update-rc.d <nome-script> remove

update-rc.d <nome-script> defaults

Nel primo caso, `update-rc.d' elimina i collegamenti simbolici, riferiti allo script indicato, da tutte le directory `/etc/rcn.d/', compresa la directory `/etc/rcS.d/', purché questo sia effettivamente assente dalla directory `/etc/init.d/'.

Nel secondo caso, `update-rc.d' crea i collegamenti simbolici, riferiti allo script indicato, che deve trovarsi nella directory `/etc/init.d/', in base a ciò che di solito è più opportuno: nelle directory corrispondenti ai livelli zero, uno e sei, vengono creati dei collegamenti di tipo

K20<nome-script>

Mentre nelle directory dei livelli da due a cinque, vengono creati dei collegamenti di tipo

S20<nome-script>

Per esempio, se è stato creato lo script `pippo', ed è stato collocato nella directory `/etc/init.d/', si possono predisporre i collegamenti simbolici con il comando seguente:

update-rc.d pippo defaults[Invio]

 Adding system startup for /etc/init.d/pippo ...
   /etc/rc0.d/K20pippo -> ../init.d/pippo
   /etc/rc1.d/K20pippo -> ../init.d/pippo
   /etc/rc6.d/K20pippo -> ../init.d/pippo
   /etc/rc2.d/S20pippo -> ../init.d/pippo
   /etc/rc3.d/S20pippo -> ../init.d/pippo
   /etc/rc4.d/S20pippo -> ../init.d/pippo
   /etc/rc5.d/S20pippo -> ../init.d/pippo

Una volta eliminato lo script `pippo' dalla directory `/etc/init.d/', si possono eliminare i collegamenti simbolici relativi con il comando seguente:

update-rc.d pippo remove[Invio]

 Removing any system startup links for /etc/init.d/pippo ...
   /etc/rc0.d/K20pippo
   /etc/rc1.d/K20pippo
   /etc/rc2.d/S20pippo
   /etc/rc3.d/S20pippo
   /etc/rc4.d/S20pippo
   /etc/rc5.d/S20pippo
   /etc/rc6.d/K20pippo

247.2 Configurazione del sistema

La distribuzione Debian non ha un sistema centralizzato per la configurazione, lasciando che ogni pacchetto gestisca la configurazione a suo modo. L'esempio più importante di questa impostazione sta nella configurazione della rete, che avviene attraverso la modifica diretta di uno script di quelli che appartengono alla procedura di inizializzazione del sistema: `/etc/init.d/network'.

247.2.1 Configurazione della tastiera e dei caratteri dello schermo

La configurazione della tastiera riguarda il pacchetto `kbd', e avviene per mezzo dello script `/etc/init.d/keymaps.sh', che viene avviato tramite un collegamento simbolico contenuto nella directory `/etc/rcS.d/'. Questo script carica automaticamente la mappa della tastiera corrispondente al file `/etc/kbd/default.map.gz'. Evidentemente, per definire una mappa per la tastiera differente, basta copiare il file opportuno nella directory `/etc/kbd/', dandogli il nome `default.map.gz'.

Sempre riguardo al pacchetto `kbd', la configurazione dei caratteri dello schermo avviene per mezzo dello script `/etc/rc.boot/kbd', che utilizza le definizioni contenute nel file `/etc/kbd/config'. Quest'ultimo è in pratica un pezzo di script, per cui basta assegnare alla variabile `CONSOLE_FONT' il nome del file di definizione dei caratteri che si desidera. Per esempio,

CONSOLE_FONT=lat1u-16.psf.gz

fa sì che venga caricato il file `/usr/share/consolefonts/lat1u-16.psf.gz'.

247.2.2 Configurazione della rete

Come accennato, la rete viene configurata attraverso lo script `/etc/init.d/network'. Questo non ha bisogno di accorgimenti particolari, dal momento che è collegato normalmente solo alla directory `/etc/rcS.d/', che contiene i collegamenti simbolici avviati una volta sola all'avvio del sistema.

Di solito, lo script in questione viene creato nel momento in cui si installa la distribuzione per la prima volta, in ogni caso, può bastare una cosa come l'esempio seguente, da modificare opportunamente, soprattutto in base al tipo e al numero di interfacce di rete.

#! /bin/sh
ifconfig lo 127.0.0.1
route add -net 127.0.0.0

ifconfig eth0 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255
route add -net 192.168.1.0
route add default gw 192.168.1.254 metric 1

Nella directory `/etc/rcS.d/' basta quindi il collegamento simbolico `S40network', che punta a `../init.d/network'.

247.2.3 Configurazione dell'orologio hardware

In generale, la correzione dell'orologio hardware si ottiene configurando opportunamente il file `/etc/adjtime'. Tuttavia, in fase di avvio del sistema operativo, è importante sapere se l'orologio hardware è puntato sul tempo universale coordinato, oppure sull'ora locale.

Dal momento che lo script che si occupa di queste cose è controllato da `/etc/init.d/rcS', e dato che questo viene configurato con il file `/etc/default/rcS', all'interno di quest'ultimo si può modificare la variabile `GMT'. In pratica, per indicare che l'orologio hardware è posizionato sul tempo universale si assegna il valore `-u':

# Set GMT="-u" if your system clock is set to GMT, and GMT="" if not.
GMT="-u"

247.2.4 Configurazione del mouse per lo schermo a caratteri

La gestione del mouse per lo schermo a caratteri avviene attraverso il demone `gpm', come di consueto. L'avvio e l'arresto del servizio è organizzato come al solito attraverso uno script contenuto nella directory `/etc/init.d/'. Questo script carica, normalmente, la configurazione contenuta nel file `/etc/gpm.conf'. Attraverso le variabili dichiarate in questo file di configurazione, lo script di avvio del servizio genera le opzioni opportune per la riga di comando di `gpm'.

247.3 Configurazione di shell

Secondo la politica della distribuzione Debian, se un programma ha bisogno che siano definite delle variabili di ambiente, o delle funzioni di shell, per questo deve essere predisposto uno script di avvio apposito, in modo da non dover disturbare l'utente con questa configurazione. In pratica, la configurazione globale delle shell non deve essere modificata dall'installazione di un pacchetto.

In generale, se necessario per qualche ragione, l'amministratore del sistema può intervenire nel file `/etc/profile', e negli altri file di configurazione delle altre shell. Come al solito, potrebbe convenire l'inserimento di alcuni alias per evitare la cancellazione involontaria dei file, e inoltre si potrebbe impostare il linguaggio predefinito. L'esempio seguente fa riferimento al caso della shell Bash:

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

LANG="it_IT.ISO-8859-1"
export LANG

Per quanto riguarda la configurazione personale delle shell, non è previsto niente di particolare, a parte il caso dell'utente `root'.

247.4 Utenti

Con la distribuzione Debian si utilizzano preferibilmente i programmi `adduser' e `addgroup' per registrare nel sistema degli utenti nuovi. Questi due sono un programma Perl unico, che si configura con il file `/etc/adduser.conf'.

In generale, non dovrebbe essere necessario modificare questa configurazione, soprattutto per non uscire dalla politica predefinita della distribuzione. In generale, si può osservare che vengano gestiti i gruppi privati, per cui, alla registrazione di un utente, viene aggiunto anche un nuovo gruppo con lo stesso nome e lo stesso numero GID.

In generale, gli utenti e i gruppi ricevono un numero UID e GID compreso tra 1000 e 29999; l'utente `nobody' ha il numero UID 65534, ed è abbinato al gruppo `nogroup', con lo stesso numero GID.

247.5 Stampa

Il sistema di stampa adottato dalla distribuzione Debian è LPRng, che in generale è abbastanza compatibile con quello tradizionale dello Unix BSD. Rispetto ad altre distribuzioni GNU/Linux, Debian lascia all'amministratore la configurazione manuale del file `/etc/printcap' che è comunque piuttosto semplice.

Assieme al pacchetto di LPRng viene installato normalmente anche Magicfilter, che come suggerisce il nome è un sistema di filtri per stampanti. Nella directory `/etc/magicfilter/' si trovano una serie di script di Magicfilter, uno per ogni tipo di stampante previsto. È sufficiente modificare la configurazione del file `/etc/printcap', in modo da utilizzare il filtro adatto per la propria stampante. L'esempio seguente definisce la stampante `lp' abbinata alla prima porta parallela a cui si trova connessa una stampante compatibile con il modello HP Laserjet:

# /etc/printcap: printer capability database. See printcap(5).
# You can use the filter entries df, tf, cf, gf etc. for
# your own filters. See the printcap(5) manual page for further 
# details.

lp|HP Laserjet
        :lp=/dev/lp0
        :sd=/var/spool/lpd/lp
        :af=/var/log/lp-acct
        :lf=/var/log/lp-errs
        :if=/etc/magicfilter/laserjet-filter
        :pl#66
        :pw#80
        :pc#150
        :mx#0
        :sh

Come si può osservare, le righe della direttiva `lp' non sono terminate dal simbolo di continuazione `\', che con LPRng non è necessario.

Per determinare quale sia il filtro migliore per la propria stampante, occorre fare qualche prova, dal momento che per uno stesso modello ci possono essere diverse alternative.

247.5.1 Configurazione del formato della carta

La distribuzione Debian organizza la definizione del formato della carta attraverso il file `/etc/papersize', il quale deve contenere la sigla corrispondente. Di solito i programmi interpretano correttamente i nomi: `a3', `a4', `a5', `b5', `letter', `legal'. Eventualmente, per gli altri formati, si può utilizzare una delle definizioni comprensibili per Ghostscript.

A questo file di configurazione è abbinata una libreria, che in teoria dovrebbe essere utilizzata dai programmi che hanno qualcosa a che fare con la stampa. Per esempio, Ghostscript non ha bisogno dell'opzione `-sPAPERSIZE' perché riesce a ottenere questa informazione dal file di configurazione.

247.6 Configurazione del nome del sistema

Il nome del sistema, così come lo intende il programma di utilità `hostname', viene definito nel file `/etc/hostname'. Da lì viene letto in fase di avvio del sistema.

Un altro file di configurazione simile è `/etc/mailname', che dovrebbe contenere il nome di dominio completo da utilizzare per inviare messaggi di posta elettronica.

247.7 Configurazione dei permessi degli eseguibili

Per evitare la proliferazione incontrollata di permessi strani attribuiti agli eseguibili, soprattutto per ciò che riguarda i bit SUID e SGID, la distribuzione GNU/Linux Debian organizza uno script eseguito giornalmente nell'ambito del sistema Cron, con lo scopo di controllare e correggere tali permessi. Questo script si avvale della configurazione contenuta nel file `/etc/suid.conf', che contiene semplicemente un elenco di eseguibili con i permessi che dovrebbero avere. Segue un estratto molto semplice e intuitivo del suo contenuto:

# Configuration File for suid programs or special permissions
#
# The format is:
# package file user group permissions
lsof-2.0.35 /usr/sbin/lsof root kmem 2755
emacs /usr/lib/emacs/20.3/i386-debian-linux-gnu/movemail root mail 2755
emacs /usr/lib/emacs/19.34/i386-debian-linux/movemail root mail 2755
apache-common /usr/bin/htpasswd root root 755
apache-common /usr/lib/apache/suexec root root 755
xscreensaver /usr/X11R6/bin/xscreensaver root shadow 2755
xcdroast /usr/bin/xcdroast root root 4755
ssh /usr/bin/ssh1 root root 4755
...

In generale, questo file viene aggiornato automaticamente ogni volta che si installa un pacchetto che richiede dei permessi speciali sui suoi eseguibili; tuttavia, quando si vuole cambiare qualcosa in modo manuale, occorre ricordarsi di intervenire anche qui per rendere la modifica permanente.

247.8 Riferimenti

---------------------------

Appunti Linux 2000.04.12 --- Copyright © 1997-2000 Daniele Giacomini --  daniele @ pluto.linux.it


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]