12.4. Avviare una versione compilata su Red Hat Linux

Come noto tutte le versioni di RedHat Linux, a partire dalla release 7.2, sino ad arrivare alla versione 9 non vengono più supportate da Red Hat. E' stato anche istituito un webservice di supporto non ufficiale da parte di FedoraLegacy (URLs http://www.fedoralegacy.org/) che è diverso tempo che non rilascia patch per le applicazioni più importanti e non supporta più le versioni 7.2 ed 8.0. In molti casi Squid può rappresentare una applicazione mission critical per il core business ed inoltre, secondo il parere di chi scrive, non è mai una buona idea aggiornare un Sistema Operativo che funziona bene e che offre servizi importati per la nostra community. Una nuova release di un Sistema Operativo può offrire delle nuove funzionalità ma potrebbe anche compromettere la stabilità e l'affidabilità del sistema precedente qualora si decidesse di eseguire l'aggiornamento.

Abbiamo realizzato dei test funzionali utilizzando una distribuzione Red Hat Linux 7.3, gli stessi sono stati ripetuti con successo utilizzando Fedora Core 1 e possiamo supporre che la configurazione che andremo a descrivere in seguito possa funzionare anche con Mandrake Linux e le altre distribuzioni Red Hat, il cui sistema di init è praticamente uguale identico.

Il Sistema di init di una distribuzione Red Hat Linux è ispirato al modello System V, dunque legge il contenuto del file /etc/inittab

id:x:initdefault:
  

questa linea identifica il run level che verrà attivato come default. In questo esempio la x identifica il numero di run level e tutti i link simbolici contenuti nella directory /etc/rcx.d/ verranno mandati in esecuzione.

La prima attività da svolgere è quella di rimuovere la versione che viene distribuita ed installata con il Sistema Operativo. Nel caso di studio che stiamo documentando, in prima istanza verificheremo la versione di Squid installata sul Sistema e poi procederemo alla rimozione del pacchetto rpm utilizzando appunto il comando rpm(8), rpm è l'acronimo di RPM Package Manager o Red Hat Package Manager

% rpm -qa | grep 'squid'
squid-2.4.STABLE6-6.7.3
  

rimuoviamo il package

% rpm -e squid-2.4.STABLE6-6.7.3
warning: /etc/squid/squid.conf saved as /etc/squid/squid.conf.rpmsave
  

l'operazione appena effettuata non cancellerà il vostro file di configurazione squid.conf ma lo rinominerà eseguendo una copia di sicurezza. Il messaggio di warning contenuto nell'esempio sopracitato è piuttosto chiaro. La procedura di disinstallazione del package rpm ha rimosso anche altri files come /etc/sysconfig/squid. Questo file dovrà essere prontamente ricreato

% touch /etc/sysconfig/squid
  

editiamo il file /etc/sysconfig/squid utilizzando il nostro editor preferito

# default squid options
# -D disables initial dns checks. If you most likely will not to have an
# internet connection when you start squid, uncomment this
SQUID_OPTS="-D"
# Time to wait for Squid to shut down when asked. Should not be necessary
# most of the time.
SQUID_SHUTDOWN_TIMEOUT=100
  

ora possiamo finalmente procedere con l'installazione di Squid utilizzando il codice sorgente, per seguire la procedura di configurazione ed installazione è necessario riferirsi al paragrafo che abbiamo appunto dedicato a questo argomento.

Terminato il processo di compilazione e di installazione, con il comando ln(8) imposteremo un link simbolico per rendere l'eseguibile compatibile con il formato Red Hat. Il nuovo eseguibile /usr/local/squid/sbin/squid dovrà essere linkato simbolicamente in /usr/sbin/squid. I sistemi UNIX® definiscono due concetti a riguardo dei collegamenti. Possiamo avere dei collegamenti fisici o dei collegamenti simbolici. Un collegamento fisico viene rappresentato da un nome di un file mentre il collegamento simbolico è un file speciale che contiene un percorso fisico diretto verso il file originale. Quindi un collegamento simbolico può puntare verso un file che può essere fisicamente ubicato su un'altro file system

# ln -s /usr/local/squid/sbin/squid /usr/sbin/squid
# ls /usr/sbin/squid
lrwxrwxrwx 1 root 27 apr 8 23:06 /usr/sbin/squid -> /usr/local/squid/sbin/squid*
  

a questo punto procediamo con la generazione dell'ambiente di init ricreando il file di init per il demone Squid, questo ci consentirà di avviare il proxy server con il boot del Sistema Operativo. Il nome del file di init è /etc/rc.d/init.d/squid

% touch /etc/rc.d/init.d/squid
% chmod u+x,g+x,o+x /etc/rc.d/init.d/squid
  
  1. viene modificata la directory dove verrà installato il file di configurazione di Squid

    /usr/local/squid/etc/squid.conf
       
    
  2. viene ridefinita la directory dove verrà creato lo spazio dedicato al disk storage di Squid

    /usr/local/squid/var/cache
       
    
  3. viene ridefinita l'ubicazione del PID (Process ID) file

    /usr/local/squid/var/run/squid.pid
       
    

nell'esempio che riportiamo in calce, Vi proponiamo un file di init per i sistemi Red Hat, modificato in alcuni punti. Le modifiche devono essere riferite al tipo di albero delle directory che sono state definite come standard per una versione di Squid compilata. Per altre informazioni sull'albero delle directory fare riferimento al paragrafo che abbiamo dedicato all'argomento. Questo file consentirà a Red Hat Linux di eseguire una versione compilata sulla macchina locale

#!/bin/bash
# filename : /etc/rc.d/init.d/squid
# modifiche: il file è stato modificato per eseguire una versione di Squid \
# compilata, il file è stato testato su Red Hat Linux 7.3 
#
# squid This shell script takes care of starting and stopping
# Squid Internet Object Cache
#
# chkconfig: - 90 25
# description: Squid - Internet Object Cache. Internet object caching is \
# a way to store requested Internet objects (i.e., data available \
# via the HTTP, FTP, and gopher protocols) on a system closer to the \
# requesting site than to the source. Web browsers can then use the \
# local Squid cache as a proxy HTTP server, reducing access time as \
# well as bandwidth consumption.
# pidfile: /usr/local/squid/var/run/squid.pid
# config : /usr/local/squid/etc/squid.conf
# cache : /usr/local/squid/var/cache
# logs : /usr/local/squid/var/logs
PATH=/usr/bin:/sbin:/bin:/usr/sbin
export PATH
#
# file descriptors (avvia squid con un limite max di 4096 FD)
# echo 102400 > /proc/sys/fs/file-max
ulimit -HSn 4096
#
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
# check if the squid conf file is present
#
# è stata modificata la directory dove è ubicato il file \
# di configurazione di Squid
[ -f /usr/local/squid/etc/squid.conf ] || exit 0
if [ -f /etc/sysconfig/squid ]; then
. /etc/sysconfig/squid
else
SQUID_OPTS="-D"
SQUID_SHUTDOWN_TIMEOUT=100
fi
# determine the name of the squid binary
#
# ci si riferisce al percorso del vecchio eseguibile \
# ed avremo provveduto a creare un eventuale link simbolico \
# che punta al nuovo file eseguibile
[ -f /usr/sbin/squid ] && SQUID=squid
[ -z "$SQUID" ] && exit 0
prog="$SQUID"
# determine which one is the cache_swap directory
# nel caso in cui la directory di swap sia vuota squid ne \
# crea una, attenzione al percorso di squid.conf
CACHE_SWAP=`sed -e 's/#.*//g' /usr/local/squid/etc/squid.conf | \
grep cache_dir | awk '{ print $3 }'`
[ -z "$CACHE_SWAP" ] && CACHE_SWAP=/usr/local/squid/var/cache
RETVAL=0
start() {
for adir in $CACHE_SWAP; do
if [ ! -d $adir/00 ]; then 
echo -n "init_cache_dir $adir... "
$SQUID -z -F 2>/dev/null
fi
done
echo -n $"Starting $prog: "
$SQUID $SQUID_OPTS 2> /dev/null &
RETVAL=$?
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$SQUID
[ $RETVAL -eq 0 ] && echo_success
[ $RETVAL -ne 0 ] && echo_failure
echo
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
$SQUID -k check >/dev/null 2>&1
RETVAL=$?
if [ $RETVAL -eq 0 ] ; then
$SQUID -k shutdown &
rm -f /var/lock/subsys/$SQUID
timeout=0
while : ; do
[ -f /usr/local/squid/var/run/squid.pid ] || break
if [ $timeout -ge $SQUID_SHUTDOWN_TIMEOUT ]; then
echo
return 1
fi
sleep 2 && echo -n "." 
timeout=$((timeout+2))
done
echo_success
echo 
else
echo_failure
echo
fi
return $RETVAL
} 
reload() {
$SQUID $SQUID_OPTS -k reconfigure 
}
restart() {
stop
start
} 
condrestart() {
[ -e /var/lock/subsys/squid ] && restart || :
}
rhstatus() { 
status $SQUID
$SQUID -k check
}
probe() {
return 0
} 
case "$1" in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
restart
;;
condrestart)
condrestart
;;
status)
rhstatus
;;
probe)
exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|reload|restart|condrestart}"
exit 1
esac
exit $?
  

ora verifichiamo l'esistenza di un'utente appropriato per eseguire Squid. In particolare per le distribuzioni Red Hat Linux, dovrebbe essere già presente l'utente squid. In effetti l'utente dovrebbe essere presente in quanto creato precedentemente dalla procedura di installazione della distribuzione originale in formato RPM

% more /etc/passwd | grep squid
squid:x:23:23::/var/spool/squid:/dev/null
  

in merito al Disk Storage di Squid, accertiamoci di configurare anche nel nuovo file di configurazione lo stesso percorso che abbiamo utilizzato nella versione precedente di Squid (TAG cache_dir)

% more /etc/squid/squid.conf.rpmsave | grep cache_dir
cache_dir ufs /home/var/spool/squid 2024 16 256
  

ora procederemo con l'assegnazione dei permessi sulle directory, questo processo è fondamentale per consentire ai processi di disk I/O di Squid di essere eseguiti. Inoltre editeremo il file squid.conf per impostare al meglio la nuova configurazione. In questo caso non dimentichiamo che stiamo effettuando una migrazione da una versione 2.4 pacchettizata da Red Hat ad una versione 2.5 direttamente compilata utilizzando i sorgenti prelevati dal sito del progetto Squid. Ricordiamo al lettore che vi sono delle differenze piuttosto importanti tra la versione 2.4 e la versione 2.5 (cfr. capitolo differenze tra Squid 2.4 a Squid 2.5), pertanto non sarà possibile riutilizzare in alcun modo lo stesso file di configurazione

% cd /usr/local/squid/var/
% chown -R squid:squid *
% ls
totale 20
drwxr-xr-x 5 root 4096 apr 7 22:17 ./
drwxr-xr-x 9 root 4096 apr 7 21:30 ../
d-wx--x--x 2 squid 4096 apr 7 22:17 cache/
d-wx--x--x 2 squid 4096 apr 7 21:30 logs/
d-wx--x--x 2 squid 4096 apr 7 22:17 run/
  

per riprodurre il file squid.conf in maniera fedele possiamo aiutarci con il comando grep(8), grep ricerca nei file specificati le righe che contengono una corrispondenza, possiamo così ricercare nel nuovo file di configurazione i TAG più significativi. Nell'esempio vediamo la parte relativa alla configurazione SNMP

% more /etc/squid/squid.conf.rpmsave | grep snmp
acl snmpManager src 192.168.0.4/255.255.255.255
acl snmppublic snmp_community public
# TAG: snmp_port
# NOTE: SNMP support requires use the --enable-snmp configure
snmp_port 3401
# TAG: snmp_access
snmp_access allow snmpManager
snmp_access allow snmppublic localhost
snmp_access allow allowed_hosts
snmp_access deny all
  

al termine della preparazione del file squid.conf possiamo provare ad avviare nuovamente Squid

% squid -k parse
% /etc/rc.d/init.d/squid start
Avvio di squid: [ OK ]
% netstat --l | grep webcache
tcp 0 0 *:webcache *:* LISTEN
% netstat --l | grep 3401
udp 0 0 *:3401 *:*
% nmap localhost
Starting nmap 3.50 ( http://www.insecure.org/nmap/ ) at 2004-04-08 23:57 CEST
Interesting ports on localhost (127.0.0.1):
(The 1645 ports scanned but not shown below are in state: closed)
PORT STATE SERVICE
3128/tcp open squid-http
  

grandioso, Squid è in funzione e la migrazione è stata totalmente completata. A questo punto dovremo fare in modo di avviare il processo squid con il relativo livello di init del Sistema Operativo (3 o 5 senza dimenticale lo 0 per l'esecuzione di una corretta chiusura di Squid) utilizzando il comando chkconfig(8), chkconfig fornisce una facility a linea di comando per mantenere le directory /etc/rc[0-6].d in maniera gerarchica e consentire agli Amministratori di Sistema di manipolare i link simbolici contenuti all'interno di queste directory

% chkconfig --level 3 squid on
% chkconfig --level 0 squid off
% chkconfig --level 6 squid off
% ls -l /etc/rc.d/rc6.d/K25squid
lrwxrwxrwx  1 root root 15 27 dic 11:34 /etc/rc.d/rc6.d/K25squid -> ../init.d/squid
% ls -l /etc/rc.d/rc0.d/K25squid
lrwxrwxrwx  1 root root 15  2 ott 12:43 /etc/rc.d/rc0.d/K25squid -> ../init.d/squid
  

potremo continuare ad utilizzare tranquillamente tutte le facility di gestione di un Sistema Red Hat come ad esempio il comando service, questa utility consente di manipolare i servizi di sistema

% service squid stop
Interruzione di squid: [ OK ]
% service squid start
Avvio di squid: [ OK ]
  

Maggiori dettagli a riguardo degli scrip di avviamento sono reperibili nelle FAQ in lingua inglese presso la URLs http://www.squid-cache.org/Doc/FAQ/FAQ-3.html#ss3.6.