La distribuzione RedHat 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.
La procedura di inizializzazione del sistema è attivata da init
attraverso le indicazioni di /etc/inittab
. I livelli di esecuzione sono:
0 arresto del sistema; | |
1 singolo utente; | |
2 multiutente senza l'utilizzo di eventuali NFS; | |
3 multiutente; | |
4 non definito (disponibile); | |
5 multiutente con login grafico; | |
6 riavvio. |
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 |
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.
È la directory che raccoglie gli script utilizzati nella fase di avvio del sistema e in quella di arresto. | |||||||||||||||||||||
È lo script di inizializzazione del sistema. In particolare:
| |||||||||||||||||||||
È lo script principale per il controllo dei livelli di esecuzione. Viene utilizzato da
Semplificando un po' le cose, In realtà, questi script sono contenuti nella directory In questo modo, è possibile definire il livello di esecuzione 4, lasciato a disposizione, semplicemente copiandovi all'interno i collegamenti simbolici necessari e senza toccare alcuno script. | |||||||||||||||||||||
Come accennato, si tratta delle directory riferite a ogni livello di esecuzione (n rappresenta il numero del livello stesso). Al loro interno si trovano solo collegamenti simbolici riferiti agli script che si vuole siano eseguiti. Quando viene selezionato il livello di esecuzione relativo, vengono eseguiti in ordine alfabetico, prima gli script (o meglio i collegamenti) che iniziano con la lettera
allo scopo di disattivare il servizio particolare cui si riferiscono, quindi quelli che iniziano con la lettera
| |||||||||||||||||||||
È il vero contenitore degli script utilizzati dalla procedura di inizializzazione del sistema. Questi vengono utilizzati indirettamente attraverso collegamenti simbolici contenuti nelle directory Molti di questi script possono essere utilizzati dall'amministratore per disattivare o attivare un servizio particolare, senza dover utilizzare un livello di esecuzione diverso e senza dover ricordare tutte le implicazioni di un particolare servizio. Il formato generale è il seguente:
| |||||||||||||||||||||
Si tratta di uno script utilizzato da quasi tutti gli altri, per definire alcune funzioni standard. In particolare, queste funzioni, servono per evitare l'avvio di demoni già in funzione e comunque per uniformare il sistema di avvio e conclusione del loro funzionamento.
| |||||||||||||||||||||
Questa directory viene utilizzata dagli script contenuti in |
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 3 a 5. 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.
Le directory /etc/rc.d/rc
n.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 |
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.
La maggior parte dei file di configurazione della distribuzione RedHat 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.
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
.
Si tratta del file contenente le informazioni fondamentali sulla connessione alla rete:
attivazione o meno della rete; | |
nome completo dell'elaboratore; | |
nome del dominio; | |
router (gateway) predefinito; | |
interfaccia di rete che porta verso il router predefinito. |
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.
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.
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 |
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 |
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.
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.
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 |
Il resto della configurazione, è gestito attraverso file contenuti esclusivamente nella directory /etc/sysconfig/
.
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.
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.
Il file /etc/sysconfig/keyboard
permette di configurare la tastiera. Eventualmente può essere usato il programma kbdconfig
per definire correttamente questo file.
KEYTABLE=<mappa-tastiera> |
Definisce la mappa della tastiera, indicando il file corrispondente.
KEYTABLE="/usr/lib/kbd/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.
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.
MOUSETYPE=<tipo> |
Permette di definire il tipo di mouse utilizzato. Sono validi i nomi seguenti.
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
XEMU3={yes|no} |
Abilita o disabilita l'emulazione del tasto centrale.
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 |
Anche la configurazione della shell è molto importante per il sistema, e questa risulta relativamente complessa.
Si tratta del file di configurazione generale, secondo lo standard, ma è organizzato in modo da permettere l'inserimento di altri segmenti, senza toccarlo. Infatti, alla fine vengono caricati tutti i file che si trovano nella directory
| |||
Secondo le intenzioni di chi ha organizzato la distribuzione, questo file dovrebbe contenere solo la definizione di funzioni e di alias di interesse generale, ma il suo utilizzo dipende dalla configurazione personalizzata di ogni utente, che potrebbe anche escludere l'inclusione di questo file.
Per qualche motivo, il file Potrebbe essere conveniente definire, per tutti gli utenti, una serie di alias ai comandi più «pericolosi», trasformando quindi il file nel modo seguente (il prompt viene commentato).
| |||
È il file di configurazione di una shell Bash interattiva. Secondo le intenzioni di chi ha organizzato la distribuzione, questo file dovrebbe contenere solo la definizione di funzioni e di alias personalizzati, e alla fine dovrebbe richiamare il file
| |||
È il file di configurazione utilizzato dalla shell Bash quando questa viene avviata a seguito di un login. Per mantenere uniformità con l'insieme, esegue a sua volta il contenuto di
|
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
(il prompt) e una serie di alias.
In precedenza si è visto che la distribuzione RedHat indica il file /etc/bashrc
come il contenitore adatto per la definizione del prompt e degli alias. Dipende dal gusto dell'amministratore del sistema la scelta di come intervenire.
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 29.5.3.
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.
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:/: |
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: |
Il sistema di stampa adottato da RedHat è 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
.
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.
È il filtro che fa riferimento a diversi componenti collocati sotto | ||||||||||
È un file di configurazione generale della stampa. Segue un esempio nel quale si fa riferimento a:
| ||||||||||
È un file di configurazione per l'emulazione della stampa PostScript. Segue un esempio nel quale si fa riferimento a:
| ||||||||||
È un file di configurazione della stampa di solo testo. Segue un esempio, nel quale si fa riferimento, in particolare, alla trasformazione dei codici di interruzione di riga in modo che corrispondando sempre a <CR><LF>.
|
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 1999.07.12 --- Copyright © 1997-1999 Daniele Giacomini -- daniele @ evo.it
[indice generale] [precedente] [successivo] [indice analitico] [note introduttive]