Next Previous Contents

6. Syslogd

6.1 Problemet

Syslogd er systemets loggeprogram som er generelt brukt på UNIX systemer. Syslogd er en daemon som åpner en spesiell fil kalt en FIFO. En FIFO er en spesiell fil som fungerer som en pipe. Alt som blir skrevet til skrivesiden vil komme ut på lesesiden. Syslogd venter på data fra lesesiden. Det er C funksjoner som skriver til skrivesiden. Hvis ditt program bruker disse C fuksjonene, vil din output gå til syslogd.

Husk at vi har brukt et chroot miljø, og FIFO'en som syslogd leser fra (/dev/log) er ikke tilstede. Dette betyr at alle de virtuelle miljøene vil ikke gå til syslogd.

6.2 Løsningen

Sett Opp Linker.

Syslogd kan se på en forskjellig FIFO hvis du forteller den det på kommandolinjen, så kjør syslogd med argumentet:

syslogd -p /virtual/log

Deretter symlink /dev/log til /virtual/log med:

ln -sf /virtual/log /dev/log

Deretter hardlink alle /dev/log kopiene til denne filen ved å kjøre:

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

Virtfs scriptet ovenfor gjør allerede dette. Siden /virtual er en kontinuerlig disk og /dev/log'ene er hardlinket, har de det samme inode nummeret og peker til samme data. Chroot kommandoen kan ikke stoppe dette, så alle dine virtuelle /dev/log'er vil nå virke. Merk at alle beskjedene fra alle miljøene vil bli logget på ett sted. Du kan skrive separate programmer til å filtrere ut data.

Syslogd.init

Denne versjonen av syslogd.init filen hardlinker alle /dev/log'ene hver gang du starter det fordi at syslogd sletter og lager /dev/log FIFO filen hver gang den kjører. Her er en modifisert syslogd.init fil:

#!/bin/sh

. /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/syslogd
        ;;
  stop)
        echo -n "Shutting down system loggers: "
        killproc syslogd
        killproc klogd
        echo
        rm -f /var/lock/subsys/syslogd
        ;;
  *)
        echo "Usage: syslogd {start|stop}"
        exit 1
esac

exit 0

6.3 Flere Syslogd'er

En Per Disk

Hvis du går tom for diskplass på ett filsystem og du må bryte opp dine virtuelle domener og fordele dem over flere disker, husk at hardlinker vil ikke krysse disker. Dette betyr at du må kjøre en separat syslogd for hver gruppe av domener på en disk. For eksempel, hvis du hadde tretten domener på /virtual1 og femten domener på /virtual2, måtte du hardlinke tretten domener til /virtual1/log med en syslogd kjørende med syslogd -p /virtual1/log , og hardlinke femten andre domener til /virtual2/log med en syslogd kjørende med syslogd -p /virtual2/log .

En Per Domene

Hvis du ikke vil sentralisere loggene til en plass, kunne du også kjøre en syslogd per domene. Dette tar opp prosess ID'er, så jeg anbefaler det ikke, men det er lettere å implementere. Du måtte forandre din syslogd.init fil til å kjøre syslogd som chroot /virtual/domain1.com syslogd for hvert domene. Dette vil kjøre hver syslogd inni chroot og loggene vil bli i /virtual/domain1.com/var/log istedet for alle kombinert i /var/log. Ikke glem å kjøre en syslogd normalt syslogd for hovedsystemet og en kernel loggende klogd .


Next Previous Contents