下一页 上一页 目录

6. Syslogd

6.1 问题

Syslogd 是 UNIX 系统上常用的系统日志工具。 Syslogd 是一个守护进程,它打开一个名为 FIFO 的特殊文件。 FIFO 是一种特殊文件,其作用类似于管道。 写入到写入端的所有内容都将从读取端输出。 Syslogd 等待来自读取端的数据。 有一些 C 函数可以写入到写入端。 如果您的程序使用这些 C 函数,您的输出将发送到 syslogd。

请记住,我们使用了 chroot 环境,并且 syslogd 正在读取的 FIFO (/dev/log) 不存在。 这意味着所有虚拟环境都不会记录到 syslogd。

6.2 解决方案

设置链接

如果您在命令行中告知 syslogd,它可以查找不同的 FIFO,因此请使用以下参数运行 syslogd

syslogd -p /virtual/log

然后通过以下方式将 /dev/log 符号链接到 /virtual/log

ln -sf /virtual/log /dev/log

然后通过运行以下命令将所有 /dev/log 副本硬链接到此文件

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

上面的 virtfs 脚本已经执行了此操作。 由于 /virtual 是一个连续的磁盘,并且 /dev/log 是硬链接的,因此它们具有相同的 inode 号码并指向相同的数据。 chroot 无法阻止这种情况,因此您的所有虚拟 /dev/log 现在都可以正常工作。 请注意,来自所有环境的所有消息都将记录在一个位置。 但是,您可以编写单独的程序来过滤数据。

Syslogd.init

此版本的 syslogd.init 文件在每次启动时都会硬链接 /dev/log,因为 syslogd 在每次运行时都会删除并创建 /dev/log FIFO。 这是一个修改后的 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。 例如,如果您在 /virtual1 上有十三个域,在 /virtual2 上有十五个域,您会将十三个域硬链接到 /virtual1/log,并运行一个带有 syslogd -p /virtual1/log 的 syslogd,并将另外十五个域硬链接到 /virtual2/log,并运行一个带有 syslogd -p /virtual2/log 的 syslogd。

每个域一个

如果您不想将日志集中在一个位置,您也可以为每个域运行一个 syslogd。 这会浪费进程 ID,因此我不建议这样做,但它更容易实现。 您必须修改您的 syslogd.init 文件,以便为每个域以 chroot /virtual/domain1.com syslogd 方式运行 syslogd。 这将在 chroot 中运行每个 syslogd,日志将位于 /virtual/domain1.com/var/log 中,而不是全部合并在 /var/log 中。 不要忘记为主要系统正常运行一个 syslogd ,并为内核日志记录器运行一个 klogd


下一页 上一页 目录