Syslogd 是 UNIX 系统上常用的系统日志工具。 Syslogd 是一个守护进程,它打开一个名为 FIFO 的特殊文件。 FIFO 是一种特殊文件,其作用类似于管道。 写入到写入端的所有内容都将从读取端输出。 Syslogd 等待来自读取端的数据。 有一些 C 函数可以写入到写入端。 如果您的程序使用这些 C 函数,您的输出将发送到 syslogd。
请记住,我们使用了 chroot
环境,并且 syslogd 正在读取的 FIFO (/dev/log) 不存在。 这意味着所有虚拟环境都不会记录到 syslogd。
如果您在命令行中告知 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 文件在每次启动时都会硬链接 /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
如果您在一个文件系统上空间不足,并且必须将虚拟域分布到不同的磁盘上,请记住硬链接不会跨磁盘。 这意味着您必须为磁盘上的每组域运行一个单独的 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
。