다음 이전 차례

6. Syslogd

6.1 문제들

Syslogd는 일반적인 유닉스 시스템에서 사용되는 시스템 기록 도구이다. Syslogd는 FIFO라 불리는 특별한 파일을 여는 데몬인데, FIFO는 하나의 파이프와 같이 작동하는 특별한 파일이다. 쓰는 쪽에서 기록한 내용은 모두 읽는 쪽에 나타나게 된다. Syslogd는 읽는 쪽에서 보내는 데이터를 기다리고 있다. C의 함수 가운데에는 쓰는 쪽에 무언가를 기록할 수 있는 함수가 있는데, 프로그램에서 이 함수를 사용한다면, 당신의 출력 결과는 syslogd로 가게 된다.

Chroot를 사용하는 환경에서는 syslogd가 (/dev/log)에서 읽어들일 FIFO가 존재하지 않게 된다. 이것은 모든 가상 환경에서 syslogd로 들어갈 수 없다는 것을 의미한다.

6.2 Solution

Setup Links

Syslogd는 명령어 라인에서 설정을 해준다면 다른 FIFO를 찾을 수 있다:

syslogd -p /virtual/log

그리고는 /virtual/log를 /dev/log로 심볼링 링크시킨다:

ln -sf /virtual/log /dev/log

그리고는 모든 /dev/log의 복사본을 이 파일로 하드링크 시킨다:

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

virtfs 스크립트는 이미 이 과정을 수행한다. /virtual이 디스크 공간에 인접해 있고 /dev/log가 하드링크되어 있는 상태이기 때문에, 이들은 같은 inode 숫자를 가지고 같은 데이터를 가리키고 있다. 모든 가상의 /dev/log 들이 동시에 작동중이기 때문에 chroot도 이것을 멈출 수 없다. 모든 환경에서부터의 모든 메세지가 하나의 장소에 기록된다는 사실을 기억하라. 하지만, 이 데이터에서 원하는 자료만 걸러내는 독립적인 프로그램을 쉽게 만들 수 있을 것이다.

Syslogd.init

syslogd.init의 이 버전은 syslogd가 시작할 때마다 /dev/log FIFO를 지우고 새로 만들기 때문에 매번 /dev/log에 하드링크시켜야 한다. 여기 변형된 syslogd.init 파일이 있다:

#!/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 여러개의 Syslogd

하나의 디스크에 한개의 syslogd

만약 당신이 설정한 하나의 파일시스템이 넘쳐서 다른 디스크에 있는 공간을 가상 시스템에서 사용하고자 한다면, 하드 링크를 통해서 서로 다른 디스크를 연결할 수 없다는 사실을 명심하기 바란다. 이것은 한 도메인에 대해서도 서로 다른 디스크에서는 각각의 syslogd를 실행시켜야 한다는 것을 의미한다. 한 예로, 만약 당신이 /virtual1에 13개의 도메인을 가지고 있고, /virtual2에 15개의 도메인을 가지고 있다면, 13개의 도메인에 대해서는 /virtual1/log에 하드 링크를 시킨 후, syslogd -p /virtual1/log 와 같은 방법으로 각각 syslogd를 실행시킨다. 마찬가지 방법으로 /virtual2에 15개의 다른 도메인을 /virtual2/log에 하드링크 시킨 후 syslogd -p /virtual2/log 의 방법으로 syslogd를 실행시킨다.

하나의 도메인에 하나의 syslogd

만약 당신이 모든 기록들을 하나의 위치로 집중시키고 싶지 않다면 각각의 도메인에 대해서 syslogd를 따로 실행시킬 수 있다. 이것은 프로세스 ID를 낭비하기 때문에 권하고 싶은 방법은 아니지만, 이것을 구현하는 것은 쉬운 일이다. 당신은 syslogd.init 파일에서 chroot /virtual/domain1.com syslogd로 각각의 도메인에 대해 syslogd를 실행시킬 수 있다. 이것은 chroot 안에서 각각의 syslogd를 실행시키며 그 기록은 /var/log가 아니라 /virtual/domain1.com/var/log에 기록될 것이다. 메인 시스템에서 일반 syslogd와 커널 기록을 위한 klogd를 실행시키는 것을 잊지 말라.


다음 이전 차례