Syslogd는 일반적인 유닉스 시스템에서 사용되는 시스템 기록 도구이다. Syslogd는 FIFO라 불리는 특별한 파일을 여는 데몬인데, FIFO는 하나의 파이프와 같이 작동하는 특별한 파일이다. 쓰는 쪽에서 기록한 내용은 모두 읽는 쪽에 나타나게 된다. Syslogd는 읽는 쪽에서 보내는 데이터를 기다리고 있다. C의 함수 가운데에는 쓰는 쪽에 무언가를 기록할 수 있는 함수가 있는데, 프로그램에서 이 함수를 사용한다면, 당신의 출력 결과는 syslogd로 가게 된다.
Chroot
를 사용하는 환경에서는 syslogd가 (/dev/log)에서 읽어들일 FIFO가
존재하지 않게 된다. 이것은 모든 가상 환경에서 syslogd로 들어갈 수 없다는 것을
의미한다.
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가 시작할 때마다 /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
만약 당신이 설정한 하나의 파일시스템이 넘쳐서 다른 디스크에 있는 공간을 가상
시스템에서 사용하고자 한다면, 하드 링크를 통해서 서로 다른 디스크를 연결할 수
없다는 사실을 명심하기 바란다. 이것은 한 도메인에 대해서도 서로 다른 디스크에서는
각각의 syslogd를 실행시켜야 한다는 것을 의미한다. 한 예로, 만약 당신이 /virtual1에
13개의 도메인을 가지고 있고, /virtual2에 15개의 도메인을 가지고 있다면,
13개의 도메인에 대해서는 /virtual1/log에 하드 링크를
시킨 후, syslogd -p /virtual1/log
와 같은
방법으로 각각 syslogd를 실행시킨다. 마찬가지 방법으로 /virtual2에 15개의
다른 도메인을 /virtual2/log에 하드링크 시킨 후 syslogd -p /virtual2/log
의 방법으로 syslogd를 실행시킨다.
만약 당신이 모든 기록들을 하나의 위치로 집중시키고 싶지 않다면 각각의 도메인에
대해서 syslogd를 따로 실행시킬 수 있다. 이것은 프로세스 ID를 낭비하기 때문에
권하고 싶은 방법은 아니지만, 이것을 구현하는 것은 쉬운 일이다. 당신은 syslogd.init
파일에서 chroot /virtual/domain1.com syslogd
로 각각의
도메인에 대해 syslogd를 실행시킬 수 있다. 이것은 chroot
안에서 각각의
syslogd를 실행시키며 그 기록은 /var/log가 아니라 /virtual/domain1.com/var/log에
기록될 것이다. 메인 시스템에서 일반 syslogd
와 커널 기록을 위한
klogd
를 실행시키는 것을 잊지 말라.