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