<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <HTML> <HEAD> <TITLE>Virtual Services Howto: Syslogd</TITLE> <LINK HREF="Virtual-Services-HOWTO-7.html" REL=next> <LINK HREF="Virtual-Services-HOWTO-5.html" REL=previous> <LINK HREF="Virtual-Services-HOWTO.html#toc6" REL=contents> </HEAD> <BODY> <A HREF="Virtual-Services-HOWTO-7.html">Avanti</A> <A HREF="Virtual-Services-HOWTO-5.html">Indietro</A> <A HREF="Virtual-Services-HOWTO.html#toc6">Indice</A> <HR> <H2><A NAME="s6">6. Syslogd</A></H2> <H2><A NAME="ss6.1">6.1 Problema</A> </H2> <P>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. <P> <P>Ci si ricordi che si è impostato un ambiente <CODE>chroot</CODE> 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. <P> <H2><A NAME="ss6.2">6.2 Soluzione</A> </H2> <H3>Impostare dei link</H3> <P> Syslogd è in grado di utilizzare una FIFO differente se specificata sulla riga di comando: <P> <PRE> syslogd -p /virtual/log </PRE> <P>Poi si colleghi con un link simbolico /dev/log a /virtual/log con: <P> <PRE> ln -sf /virtual/log /dev/log </PRE> <P>Infine si colleghino con hard link tutte le copie di /dev/log a questo file con: <P> <PRE> ln -f /virtual/log /virtual/domain1.com/dev/log </PRE> <P>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. <CODE>Chroot</CODE> 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. <P> <H3>Syslogd.init</H3> <P>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: <P> <PRE> #!/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 </PRE> <P> <H2><A NAME="ss6.3">6.3 Syslogd multipli</A> </H2> <H3>Uno per disco</H3> <P>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 <CODE>syslogd -p /virtual1/log</CODE>, poi collegare con hard link gli altri quindici domini a /virtual2/log e lanciare un altro syslogd con <CODE>syslogd -p /virtual2/log</CODE>. <P> <H3>Uno per dominio</H3> <P>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 <CODE>chroot /virtual/domain1.com syslogd</CODE> e questo per ciascun dominio. Così facendo ogni syslogd verrà eseguito all'interno dell'ambiente di <CODE>chroot</CODE> 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 <CODE>syslogd</CODE> normale per il sistema principale e un demone di log del kernel <CODE>klogd</CODE>. <P> <HR> <A HREF="Virtual-Services-HOWTO-7.html">Avanti</A> <A HREF="Virtual-Services-HOWTO-5.html">Indietro</A> <A HREF="Virtual-Services-HOWTO.html#toc6">Indice</A> </BODY> </HTML>