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


249. Configurazione di una distribuzione Red Hat

La distribuzione Red Hat utilizza un sistema di configurazione composto da script, che non dovrebbero essere modificati, e da file di configurazione, utilizzati dagli script e modificabili attraverso programmi che guidano l'amministratore.

Il difetto di questo approccio sta nel fatto che non sempre tutto funziona come previsto e allora occorre mettere le mani sui file e lasciare stare i programmi di configurazione.

249.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:

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.

# Default runlevel. The runlevels used by RHS are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
# 
id:3:initdefault:

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Things to run in every runlevel.
ud::once:/sbin/update

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# When our UPS tells us power has failed, assume we have a few minutes
# of power left.  Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.  
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"


# Run gettys in standard runlevels
1:12345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

# Run xdm in runlevel 5
x:5:respawn:/usr/bin/X11/xdm -nodaemon

249.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/rc.d/rc.sysinit' e `/etc/rc.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.

249.1.2 /etc/rc.d/init.d/*

I file contenuti nella directory `/etc/rc.d/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
#
# chkconfig: 345 85 15
# description: Servizio Pippo. Si tratta di un servizio che non serve \
#	       a nulla e non interessa a nessuno.
#

# Caricamento delle funzioni standard.
. /etc/rc.d/init.d/functions

# Analisi dell'argomento usato nella chiamata.
case "$1" in
  start)
	echo -n "Avvio del servizio Pippo: "
	daemon pippo
	echo
	touch /var/lock/subsys/pippo
	;;
  stop)
	echo -n "Spegnimento del servizio Pippo: "
	killproc pippo
	rm -f /var/lock/subsys/pippo
	echo
	;;
  status)
	status pippo
	;;
  restart)
	killall -HUP pippo
	;;
  *)
	echo "Usage: pippo {start|stop|restart|status}"
	exit 1
esac

exit 0

Nella prima parte viene letto il contenuto del file contenente la definizione delle funzioni standard, quindi si analizza il primo argomento fornito allo script. Se era `start' si provvede ad avviare uno o più programmi attraverso la funzione `daemon', e quindi si segnala il fatto creando un file vuoto (con `touch') nella directory `/var/lock/subsys/'. Se l'argomento era `stop' si provvede a eliminare i processi relativi, normalmente attraverso la funzione `killproc', e quindi si elimina il file corrispondente nella directory `/var/lock/subsys'. Se l'argomento era `status' si visualizza lo stato del servizio attraverso la funzione `status'. Infine, se l'argomento era `restart', di solito si invia un segnale `SIGHUP' al processo corrispondente al servizio.

In questi script, alcuni commenti introduttivi hanno un ruolo preciso: servono a definire i livelli di esecuzione con cui questi vengono presi in considerazione, il momento in cui devono essere avviati i servizi relativi, e il momento in cui devono essere chiusi gli stessi servizi. Nell'esempio mostrato si tratta del pezzo seguente:

# chkconfig: 345 85 15
# description: Servizio Pippo. Si tratta di un servizio che non serve \
#	       a nulla e non interessa a nessuno.

La riga `# chkconfig 2345 85 15', serve a stabilire che il servizio corrispondente può essere avviato solo quando il livello di esecuzione va da tre a cinque. Il numero 85 successivo, indica l'ordine nell'avvio del servizio, e dato il numero, si intuisce che si vuole fare in modo che questo avvenga dopo molti altri. Il numero 15 finale, indica l'ordine di disattivazione del servizio in fase di arresto del sistema, e si intende dal numero che si vuole fare in modo di chiuderlo abbastanza presto rispetto agli altri. Verrà chiarito meglio nella prossima sezione il senso di questi numeri.

La riga `# description:' serve ad annotare una descrizione del servizio, come promemoria per facilitare l'utilizzo del programma `ntsysv', che sarà mostrato successivamente. Per il momento, si osservi che la descrizione può continuare su più righe di commento, purché si utilizzi il simbolo `\' subito prima della conclusione della riga.

249.1.3 /etc/rc.d/rc?.d/

Le directory `/etc/rc.d/rcn.d/' servono a contenere una serie di collegamenti simbolici che puntano a script della directory `/etc/rc.d/init.d'. Il listato seguente dovrebbe chiarire il meccanismo.

lrwxrwxrwx 1 root root 13 13:39 K15gpm -> ../init.d/gpm
lrwxrwxrwx 1 root root 13 13:39 K60atd -> ../init.d/atd
lrwxrwxrwx 1 root root 15 13:39 K60crond -> ../init.d/crond
lrwxrwxrwx 1 root root 16 13:39 K96pcmcia -> ../init.d/pcmcia
lrwxrwxrwx 1 root root 17 13:39 S01kerneld -> ../init.d/kerneld
lrwxrwxrwx 1 root root 17 13:39 S10network -> ../init.d/network
lrwxrwxrwx 1 root root 15 13:39 S15nfsfs -> ../init.d/nfsfs
lrwxrwxrwx 1 root root 16 13:39 S20random -> ../init.d/random
lrwxrwxrwx 1 root root 16 13:39 S30syslog -> ../init.d/syslog
lrwxrwxrwx 1 root root 14 13:39 S50inet -> ../init.d/inet
lrwxrwxrwx 1 root root 18 13:39 S75keytable -> ../init.d/keytable
lrwxrwxrwx 1 root root 11 12:44 S99local -> ../rc.local

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 interrotti. Se si volesse predisporre uno script, nella directory `/etc/rc.d/init.d/' per la gestione di un servizio addizionale, si dovrebbero predisporre due collegamenti nella directory del livello di esecuzione prescelto, simili a quelli già visti, con un numero adatto a collocarli nella posizione giusta nell'ordine delle azioni da compiere.

Si osservi la presenza del collegamento `S99local' che punta allo script `/etc/rc.d/rc.local'. Si tratta di un'anomalia nella logica generale, dal momento che si fa riferimento a qualcosa di esterno alla directory `/etc/rc.d/init.d/'. Il numero, 99, è obbligatorio, dal momento che l'esecuzione di questo deve avvenire alla fine dell'avvio di tutti gli altri servizi.

249.1.4 # ntsysv e chkconfig

Attraverso il programma `ntsysv', è possibile aggiungere o togliere servizi da attivare nel livello di esecuzione standard. `ntsysv' provvede da solo a creare i collegamenti simbolici mostrati nella sezione precedente, utilizzando la convenzione mostrata. Per stabilire il numero da usare per i collegamenti di avvio (quelli che iniziano con la lettera `S') e per quelli di conclusione (`K'), si avvale del commento iniziale contenuto negli script originali.

Per riprendere l'esempio già mostrato in precedenza, se nella directory `/etc/rc.d/init.d/' si trova lo script `pippo', che contiene il commento iniziale seguente,

#! /bin/sh
#
# chkconfig: 345 85 15
# description: Servizio Pippo. Si tratta di un servizio che non serve \
#	       a nulla e non interessa a nessuno.

`ntsysv' sarà in grado di creare i collegamenti `S85pippo' e `K15pippo'. La descrizione, inoltre, è utile per ricordare a cosa serve questo servizio (o comunque a cosa serve questo script), quando è il momento di scegliere se attivarlo o meno.

Il programma `chkconfig' serve fondamentalmente alle stesse funzioni di `ntsysv', con la differenza che si tratta di un programma a riga di comando, mentre il secondo è interattivo e utilizza una maschera visiva piuttosto amichevole.

249.2 Configurazione del sistema

La maggior parte dei file di configurazione della distribuzione Red Hat si trova nella directory `/etc/sysconfig'. I nomi dei file permettono di capire, intuitivamente, il genere di cose che con essi si intendono configurare. In particolare, la directory `/etc/sysconfig/network-scripts/' contiene una serie di script, e altri file, necessari a facilitare la gestione delle interfacce di rete e degli instradamenti.

249.2.1 Configurazione della rete

L'organizzazione dei file di configurazione e degli script per la connessione in rete è un po' complicata, e tutto questo per permetterne il controllo attraverso il pannello di controllo, o più precisamente, attraverso `netcfg'.

249.2.1.1 /etc/sysconfig/network

Si tratta del file contenente le informazioni fondamentali sulla connessione alla rete:

Come al solito si utilizza la semplificazione per cui l'elaboratore ha un solo nome e un solo dominio di appartenenza, anche se ha più interfacce di rete (e quindi più nomi e più domini). Evidentemente, se ci sono più interfacce, si deve scegliere un nome e un dominio.

Alcune direttive

NETWORKING={yes|no}

Permette di attivare (`yes'), o di disattivare (`no'), la configurazione delle rete.

HOSTNAME=<nome-FQDN>

Il nome completo (FQDN) dell'elaboratore, possibilmente quello corrispondente a un'interfaccia di rete realmente esistente. Il file `/etc/HOSTNAME', generato normalmente in modo automatico, dovrebbe contenere questo nome.

DOMAINNAME=<dominio>

Permette di definire il nome del dominio dell'elaboratore. In pratica, si può riferire solo a un dominio di un'interfaccia di rete particolare.

FORWARD_IPV4={yes|no}

Permette di attivare (`yes'), o di disattivare (`no'), l'inoltro IP. Perché l'elaboratore possa funzionare come router, è indispensabile che questa funzione sia attivata, mentre, per motivi di sicurezza, il valore predefinito è `no'.

GATEWAY=<indirizzo-IP-del-router-predefinito>

Permette di definire l'indirizzo IP di un router per l'instradamento predefinito, cioè quel router da utilizzare quando si vuole inoltrare un pacchetto verso un indirizzo per il quale non esista già un instradamento specifico.

GATEWAYDEV=<interfaccia-di-rete>

Permette di indicare esplicitamente il nome dell'interfaccia di rete da utilizzare per l'instradamento predefinito.

NISDOMAIN=<dominio-NIS>

Permette di definire il dominio NIS a cui appartiene l'elaboratore.

Esempi

L'esempio seguente si riferisce alla configurazione dell'elaboratore `portatile.plip.dg'. In particolare, si utilizza un router che ha indirizzo IP 192.168.254.254, raggiungibile attraverso l'interfaccia `plip1'.

NETWORKING=yes
FORWARD_IPV4=false
HOSTNAME=portatile.plip.dg
DOMAINNAME=plip.dg
GATEWAY=192.168.254.254
GATEWAYDEV=plip1

249.2.1.2 /etc/sysconfig/static-routes

Si tratta della definizione degli instradamenti statici, cioè quelli che non cambiano. Riguarda sia gli instradamenti alle reti accessibili direttamente che a quelle raggiungibili solo attraverso un router. L'esempio seguente dovrebbe essere abbastanza chiaro: la prima riga definisce un instradamento alla rete locale, le altre due definiscono gli instradamenti verso altre reti accessibili attraverso il router 192.168.1.254.

eth0 net 192.168.1.0 netmask 255.255.255.0
eth0 net 192.168.2.0 netmask 255.255.255.0 gw 192.168.1.254
eth0 net 192.168.3.0 netmask 255.255.255.0 gw 192.168.1.254

249.2.1.3 /etc/sysconfig/network-scripts/ifcfg-*

Per ogni interfaccia di rete gestita, appare un file di configurazione con il nome `ifcfg-<interfaccia>' nella directory `/etc/sysconfig/network-scripts/'. Questi file contengono informazioni differenti in funzione del tipo di interfaccia.

Alcune direttive

DEVICE=<interfaccia>

Definisce il nome dell'interfaccia di rete corrispondente.

IPADDR=<indirizzo-IP>

L'indirizzo IP dell'interfaccia.

NETMASK=<maschera-di-rete>

La maschera di rete.

NETWORK=<indirizzo-di-rete>

Indirizzo della rete.

BROADCAST=<indirizzo-broadcast>

Indirizzo broadcast.

ONBOOT={yes|no}

Permette di attivare (`yes'), o di disattivare (`no'), l'interfaccia all'avvio del sistema.

Esempi

L'esempio seguente si riferisce alla configurazione dell'interfaccia `lo', praticamente obbligatoria, corrispondente al file `/etc/sysconfig/network-scripts/ifcfg-lo'.

DEVICE=lo
IPADDR=127.0.0.1
NETMASK=255.0.0.0
NETWORK=127.0.0.0
BROADCAST=127.255.255.255
ONBOOT=yes

L'esempio seguente si riferisce alla configurazione dell'interfaccia `eth0' con un indirizzo IP 192.168.1.1 e la maschera di rete 255.255.255.0.

DEVICE=eth0
IPADDR=192.168.1.1
NETMASK=255.255.255.0
NETWORK=192.168.1.0
BROADCAST=192.168.1.255
ONBOOT=yes
BOOTPROTO=none

249.2.2 Configurazione di altri elementi

Il resto della configurazione, è gestito attraverso file contenuti esclusivamente nella directory `/etc/sysconfig/'.

249.2.2.1 /etc/sysconfig/clock

Il file `/etc/sysconfig/clock' permette di configurare l'orologio del sistema. Per farlo, si deve conoscere come è impostato l'orologio hardware. In pratica, è importante sapere se questo è allineato al tempo universale oppure a quella locale. Eventualmente può essere usato il programma `timeconfig' per definire correttamente questo file.

Alcune direttive

UTC={true|false}

Se viene utilizzato il valore `true', si intende che l'orologio hardware sia allineato al tempo universale; diversamente, si intende che sia allineato all'ora locale.

249.2.2.2 /etc/sysconfig/keyboard

Il file `/etc/sysconfig/keyboard' permette di configurare la tastiera. Eventualmente può essere usato il programma `kbdconfig' per definire correttamente questo file.

Alcune direttive

KEYTABLE=<mappa-tastiera>

Definisce la mappa della tastiera, indicando il file corrispondente.

Esempi

KEYTABLE="/usr/share/keymaps/i386/qwerty/it.map"

Definisce la configurazione della tastiera italiana.

KEYTABLE=it.map

Esattamente come nell'esempio precedente, senza il problema di dover indicare tutto il percorso per raggiungere il file, dal momento che si tratta di quello predefinito.

249.2.2.3 /etc/sysconfig/mouse

Il file `/etc/sysconfig/mouse' permette di configurare il mouse per l'utilizzo attraverso il programma `gpm'. Eventualmente può essere usato il programma `mouseconfig' per definire correttamente questo file.

Alcune direttive

MOUSETYPE=<tipo>

Permette di definire il tipo di mouse utilizzato. Sono validi i nomi seguenti.

  • `microsoft'

  • `mouseman'

  • `mousesystems'

  • `ps/2'

  • `msbm'

  • `logibm'

  • `atibm'

  • `logitech'

  • `mmseries'

  • `mmhittab'

XEMU3={yes|no}

Abilita o disabilita l'emulazione del tasto centrale.

Esempi

L'esempio seguente rappresenta la configurazione per un mouse compatibile con il tipo Microsoft a due tasti, per cui il terzo deve essere emulato.

MOUSETYPE="Microsoft"
XEMU3=yes

249.3 Configurazione di shell

Anche la configurazione della shell è molto importante per il sistema, e questa risulta relativamente complessa.

249.3.1 Bash

249.3.1.1 Configurazione aggiuntiva

La directory `/etc/profile.d/' viene usata per contenere una serie di file da inserire ordinatamente alla fine di `/etc/profile'. Attraverso questo meccanismo, l'installazione di un programma può definire un'aggiunta nella configurazione della shell senza dover modificare il file `/etc/profile'.

I file in questione, devono terminare con l'estensione `.sh', non serve che siano eseguibili, e nemmeno che inizino con la definizione della shell che deve interpretarli. L'esempio seguente mostra uno di questi file con la definizione di alcune variabili utili.

# /etc/profile.d/config.sh

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

PATH="$PATH:$HOME/bin:."
export PATH

PS1='\u@\h:\w\$ '
export PS1

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

Nell'esempio viene definita la variabile `LANG', nel modo corretto per l'Italia, quindi vengono aggiunte al percorso di ricerca degli eseguibili, la directory `~/bin' e la directory corrente. Successivamente, viene definita la variabile `PS1' (l'invito della shell) e una serie di alias.

In precedenza si è visto che la distribuzione Red Hat indica il file `/etc/bashrc' come il contenitore adatto per la definizione dell'invito e degli alias. Dipende dal gusto dell'amministratore del sistema la scelta di come intervenire.

249.4 Utenti

Utenti e gruppi vengono gestiti in modo differente dal solito: si tende ad abbinare a ogni utente un gruppo con lo stesso nome e lo stesso numero. Questa tecnica permette di lasciare al gruppo gli stessi permessi dell'utente, facilitando la creazione e lo scioglimento di gruppi di lavoro con la semplice creazione di gruppi nuovi a cui si abbinano gli utenti che ne fanno parte. Questo viene descritto un po' meglio nella sezione 39.5.4.

In queste condizioni, la maschera dei permessi utilizzata normalmente è 002.

È il caso di osservare che l'utente e il gruppo `nobody' hanno il numero 99.

Lo script `useradd' inserisce gli utenti a partire dal numero 500 in poi, aggregando a ognuno un gruppo privato.

249.4.1 /etc/passwd

root::0:0:root:/root:/bin/bash
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
adm:*:3:4:adm:/var/adm:
lp:*:4:7:lp:/var/spool/lpd:
sync:*:5:0:sync:/sbin:/bin/sync
shutdown:*:6:0:shutdown:/sbin:/sbin/shutdown
halt:*:7:0:halt:/sbin:/sbin/halt
mail:*:8:12:mail:/var/mail:
news:*:9:13:news:/var/spool/news:
uucp:*:10:14:uucp:/var/spool/uucp:
operator:*:11:0:operator:/root:
games:*:12:100:games:/usr/games:
gopher:*:13:30:gopher:/usr/lib/gopher-data:
ftp:*:14:50:FTP User:/home/ftp:
nobody:*:99:99:Nobody:/:

249.4.2 /etc/group

root::0:root
bin::1:root,bin,daemon
daemon::2:root,bin,daemon
sys::3:root,bin,adm
adm::4:root,adm,daemon
tty::5:
disk::6:root
lp::7:daemon,lp
mem::8:
kmem::9:
wheel::10:root
mail::12:mail
news::13:news
uucp::14:uucp,root
man::15:
games::20:
gopher::30:
dip::40:
ftp::50:
nobody::99:
users::100:

249.5 Stampa

Il sistema di stampa adottato da Red Hat è quello tradizionale, cioè BSD. Le directory delle code, riferite ad altrettante voci del file `/etc/printcap', si diramano a partire da `/var/spool/lpd/' e ognuna di queste contiene il filtro di stampa (se viene utilizzato), e i file di configurazione utilizzati dal filtro.

Tutto questo, compreso il file `/etc/printcap', è gestito direttamente dal programma di configurazione della stampa, `printtool'.

249.5.1 /var/spool/lpd/*/

All'interno della directory per la coda di stampa si trovano, oltre ai file utilizzati da `lpr' e `lpd', anche lo script usato come filtro e i relativi file di configurazione.

249.5.2 /etc/printcap

Dal momento che la stampa è organizzata attraverso questo sistema di filtri, controllato da `printtool', sarebbe meglio non modificare il file standard `/etc/printcap', o almeno limitarsi a utilizzare le sole caratteristiche che `printtool' può gestire.

# /etc/printcap
#
# Please don't edit this file directly unless you know what you are doing!
# Be warned that the control-panel printtool requires a very strict format!
# Look at the printcap(5) man page for more info.
#
# This file can be edited with the printtool in the control-panel.

##PRINTTOOL3## LOCAL laserjet 300x300 a4 {} LaserJet Default {}
lp:\
	:sd=/var/spool/lpd/lp:\
	:mx#0:\
	:sh:\
	:lp=/dev/lp1:\
	:if=/var/spool/lpd/lp/filter:

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

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


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