Avanti Indietro Indice

6. Syslogd

6.1 Problema

Syslogd è il programma utilità di registrazione dei messaggi dei servizi tipicamente utilizzato sui sistemi UNIX. Syslogd è un demone che apre un file speciale chiamato FIFO. Una FIFO è un file speciale che si comporta come una `pipe'. Tutto ciò che viene mandato sul lato scrittura uscirà sul lato lettura. Ci sono delle funzioni C che scrivono sul lato scrittura. Se un programma utilizza tali funzioni C l'output verrà mandato al syslogd.

Ci si ricordi che si è impostato un ambiente chroot e che la FIFO da cui syslogd sta leggendo (/dev/log) non è presente. Questo significa che [in assenza di opportune modifiche N.d.T.] a syslogd non giungeranno i messaggi provenienti dagli ambienti virtuali.

6.2 Soluzione

Impostare dei link

Syslogd è in grado di utilizzare una FIFO differente se specificata sulla riga di comando:

syslogd -p /virtual/log

Poi si colleghi con un link simbolico /dev/log a /virtual/log con:

ln -sf /virtual/log /dev/log

Infine si colleghino con hard link tutte le copie di /dev/log a questo file con:

ln -f /virtual/log /virtual/domain1.com/dev/log 

Lo script virtfs soprariportato fa già tutto questo. Dato che /virtual si trova su un unico disco e i file /dev/log sono collegati con hard link, essi hanno lo stesso numero di inode e puntano agli stessi dati. Chroot non può impedirlo, così ora tutti i /dev/log virtuali funzioneranno. Si noti che tutti i messaggi provenienti dai vari ambienti virtuali verranno registrati assieme. È possibile comunque ideare programmi separati per filtrare le informazioni che interessano.

Syslogd.init

Questa versione di syslogd.init effettua un hard link a /dev/log ad ogni suo avvio poiché syslogd cancella e crea la FIFO /dev/log ad ogni sua nuova esecuzione. Ecco una versione modificata del file syslogd.init:

#!/bin/sh

. /etc/rc.d/init.d/functions

case "$1" in
  start)
        echo -n "Ora viene fatto l'hard link a dev log: "
        ln -sf /virtual/log /dev/log
        echo done
        echo -n "Lancio dei demoni di log di sistema: "
        daemon syslogd -p /virtual/log
        daemon klogd
        echo
        echo -n "Ora viene fatto il link dei dev log virtuali: "
        for i in /virtual/*
        do
                if [ ! -d "$i" ]
                then
                        continue
                fi
                if [ "$i" = "/virtual/lost+found" ]
                then
                        continue
                fi
                ln -f /virtual/log $i/dev/log
                echo -n "."
        done
        echo " done"
        touch /var/lock/subsys/syslogd
        ;;
  stop)
        echo -n "Arresto dei demoni di log di sistema: "
        killproc syslogd
        killproc klogd
        echo
        rm -f /var/lock/subsys/syslogd
        ;;
  *)
        echo "Impiego: syslogd {start|stop}"
        exit 1
esac

exit 0

6.3 Syslogd multipli

Uno per disco

Se c'è carenza di spazio in un filesystem e bisogna suddividere i domini virtuali su più dischi, ci si ricordi che gli hard link non funzionano tra dischi diversi. Questo significa che bisognerà lanciare un syslogd distinto per ogni gruppo di domini di un disco. Ad esempio, se ci fossero tredici domini su /virtual1 e quindici su /virtual2, si dovrebbero collegare tramite hard link i tredici domini a /virtual1/log e lanciare un syslogd con syslogd -p /virtual1/log, poi collegare con hard link gli altri quindici domini a /virtual2/log e lanciare un altro syslogd con syslogd -p /virtual2/log.

Uno per dominio

Se si preferisce non accentrare i log in un unico posto è possibile lanciare un syslogd per dominio. Questo metodo comporta uno spreco di risorse di sistema (ci sono più processi attivi), quindi non lo raccomando, ma è più facile da implementare di quello precedente. È necessario modificare il file syslogd.init affinché il syslogd venga mandato in esecuzione con chroot /virtual/domain1.com syslogd e questo per ciascun dominio. Così facendo ogni syslogd verrà eseguito all'interno dell'ambiente di chroot e i log dei vari ambienti virtuali si troveranno singolarmente in /virtual/domain1.com/var/log piuttosto che tutti assieme in un solo /var/log. Non bisogna dimenticare di lanciare un syslogd normale per il sistema principale e un demone di log del kernel klogd.


Avanti Indietro Indice