Previous Next Table of Contents

6. Syslog

6.1 Problème

Syslog est l'outil de logging couramment utilisé sur les système UNIX. Syslog est un démon qui ouvre un fichier spécial appelé FIFO. Une FIFO est un fichier spécial, se comportant comme une file d'attente. Tout ce qui y est écrit "ressortira" en lecture. Le démon syslog attend les données en lecture. Il existe des fonctions C pour écrire dans les FIFO. Si vous utilisez ces fonctions C dans vos programmes. Souvenez vous que vous avez utilisé chroot et que la FIFO /dev/log ne se trouve pas dans l'environnement virtuel. Cela implique que aucun des environnements virtuels ne pourra utiliser syslog. Nous ne pouvons pas tout simplement copier le fichier, puisque les programmes utilisent /dev/log au lieu du nouveau que nous aurions créé.

Attention, certaines version de syslog utilisent une socket udp au lieu d'une FIFO. Cependant, ce n'est généralement pas le cas.

6.2 Solution

Syslog peut scruter d'autres FIFO si vous lui dites en ligne de commande. Lancer donc syslog avec l'argument :

syslog -p /virtual/log

Faites alors un lien de /dev/log vers /virtual/log (un lien symbolique) :

ln -sf /virtual/log /dev/log

Puis liez toutes les copies de /dev/log vers ce fichier avec la commande (attention, c'est un lien NON symbolique) :

ln /virtual/log /virtual/domain.com/dev/log 

Le script virtfs ci-dessus le fait pour vous. Puisque /virtual est un disque entier, et que les /dev/log sont liés, ils ont le même numéro d'inode et pointent vers les mêmes données. Le chroot ne peut pas empêcher cela, et donc tous vos /dev/log virtuels vont à présent fonctionner. Notez également que tous les messages de toutes les machines virtuelles seront écrits dans un même fichier. Cependant, vous pouvez écrire des programmes pour filtrer les données. Si vous ne désirez pas écrire un programme et que vous avez néanmoins besoin de fichiers de log séparé, vous pouvez lancer des programmes syslog différents pour chaque système de fichiers virtuel avec la commande :

syslog -p /virtual/domain1.com/dev/log 
syslog -p /virtual/domain2.com/dev/log 

Cependant, cela gaspille des processus et je ne le recommande pas. Cette version du fichier syslog.init refait les liens vers les /dev/log à chaque fois que vous le lancez, au cas ou la configuration ait été endommagée. Voici un syslog.init modifié :

#!/bin/sh

# Source function library.
. /etc/rc.d/init.d/functions

case "$1" in
  start)
        echo -n "Starting dev log: "
        ln -sf /virtual/log /dev/log
        echo done
        echo -n "Starting system loggers: "
        daemon syslogd -p /virtual/log
        daemon klogd
        echo
        echo -n "Starting virtual dev log: "
        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/syslog
        ;;
  stop)
        echo -n "Shutting down system loggers: "
        killproc syslogd
        killproc klogd
        echo
        rm -f /var/lock/subsys/syslog
        ;;
  *)
        echo "Usage: syslog {start|stop}"
        exit 1
esac

exit 0

Notez que vous n'avez pas à mettre tous les systèmes virtuels de fichiers sur un seul disque. Cependant, vous devrez lancer un syslog différent pour chaque partition qui contient un système virtuel de fichiers..


Previous Next Table of Contents