本章介绍 Oracle Solaris OS 中的系统消息传送功能。
系统消息显示在控制台设备中。大多数系统消息的文本如下所示:
[ID msgid facility. priority]
例如:
[ID 672855 kern.notice] syncing file systems... |
如果消息来自内核,则会显示内核模块名称。例如:
Oct 1 14:07:24 mars ufs: [ID 845546 kern.notice] alloc: /: file system full |
panic: error message |
Watchdog reset ! |
错误日志守护进程 syslogd 可在消息文件中自动记录各种系统警告和错误。缺省情况下,其中许多系统消息都会在系统控制台中显示,并存储在 /var/adm 目录中。通过设置系统消息日志可以指示这些消息的存储位置。有关更多信息,请参见自定义系统消息日志。这些消息可以提醒您系统出现问题,例如设备将要出现故障。
/var/adm 目录中包含若干个消息文件。最新消息位于 /var/adm/messages 文件中(和 messages.* 中),而最旧的消息位于 messages.3 文件中。经过一段时间后(通常为每隔十天),会创建一个新的 messages 文件。messages.0 文件被重命名为 messages.1,messages.1 被重命名为 messages.2,而 messages.2 被重命名为 messages.3。当前的 /var/adm/messages.3 文件将被删除。
由于 /var/adm 目录存储包含消息、故障转储和其他数据的大型文件,因此该目录可能会占用许多磁盘空间。为防止 /var/adm 目录变得过大,并确保可以保存将来的故障转储,应定期删除不需要的文件。可以使用 crontab 文件自动执行此任务。有关自动执行此任务的更多信息,请参见如何删除故障转储文件和第 8 章。
$ dmesg Jan 3 08:44:41 starbug genunix: [ID 540533 kern.notice] SunOS Release 5.10 ... Jan 3 08:44:41 starbug genunix: [ID 913631 kern.notice] Copyright 1983-2003 ... Jan 3 08:44:41 starbug genunix: [ID 678236 kern.info] Ethernet address ... Jan 3 08:44:41 starbug unix: [ID 389951 kern.info] mem = 131072K (0x8000000) Jan 3 08:44:41 starbug unix: [ID 930857 kern.info] avail mem = 121888768 Jan 3 08:44:41 starbug rootnex: [ID 466748 kern.info] root nexus = Sun Ultra 5/ 10 UPA/PCI (UltraSPARC-IIi 333MHz) Jan 3 08:44:41 starbug rootnex: [ID 349649 kern.info] pcipsy0 at root: UPA 0x1f0x0 Jan 3 08:44:41 starbug genunix: [ID 936769 kern.info] pcipsy0 is /pci@1f,0 Jan 3 08:44:41 starbug pcipsy: [ID 370704 kern.info] PCI-device: pci@1,1, simba0 Jan 3 08:44:41 starbug genunix: [ID 936769 kern.info] simba0 is /pci@1f,0/pci@1,1 Jan 3 08:44:41 starbug pcipsy: [ID 370704 kern.info] PCI-device: pci@1, simba1 Jan 3 08:44:41 starbug genunix: [ID 936769 kern.info] simba1 is /pci@1f,0/pci@1 Jan 3 08:44:57 starbug simba: [ID 370704 kern.info] PCI-device: ide@3, uata0 Jan 3 08:44:57 starbug genunix: [ID 936769 kern.info] uata0 is /pci@1f,0/pci@1, 1/ide@3 Jan 3 08:44:57 starbug uata: [ID 114370 kern.info] dad0 at pci1095,6460 . . . |
有关更多信息,请参见 dmesg(1M) 手册页。
使用 root crontab 中的一个项内的 logadm 命令,可以轮转系统日志文件。不再使用 /usr/lib/newsyslog 脚本。
系统日志轮转在 /etc/logadm.conf 文件中定义。此文件包含用于 syslogd 等进程的日志轮转项。例如,/etc/logadm.conf 文件中的一个项指定,除非 /var/log/syslog 文件为空,否则该文件每周轮转一次。最新的 syslog 文件成为 syslog.0,下一个最新的文件成为 syslog.1,依此类推。会保留八个以前的 syslog 日志文件。
/etc/logadm.conf 文件还包含记录最后一次日志轮转发生时间的时间标记。
可以使用 logadm 命令来自定义系统日志,并可根据需要在 /etc/logadm.conf 文件中添加其他日志。
例如,要轮转 Apache 访问和错误日志,请使用以下命令:
# logadm -w /var/apache/logs/access_log -s 100m # logadm -w /var/apache/logs/error_log -s 10m |
在此示例中,Apache access_log 文件会在大小达到 100 MB 时进行轮转,以 .0、.1 等作为后缀,并保留旧 access_log 文件的 10 个副本。error_log 会在大小达到 10 MB 时进行轮转,后缀和副本数与 access_log 文件相同。
用于上述 Apache 日志轮转示例的 /etc/logadm.conf 项与以下示例类似:
# cat /etc/logadm.conf . . . /var/apache/logs/error_log -s 10m /var/apache/logs/access_log -s 100m |
有关更多信息,请参见 logadm(1M)。
可以超级用户身份或通过承担等效角色(具有日志管理权限)来使用 logadm 命令。通过基于角色的访问控制 (role-based access control, RBAC),您可以通过提供对 logadm 命令的访问来授予非超级用户维护日志文件的权限。
例如,可通过向 /etc/user_attr 文件添加以下项,授予用户 andy 使用 logadm 命令的权限:
andy::::profiles=Log Management |
或者,也可以使用 Solaris 管理控制台来设置用于日志管理的角色。有关设置角色的更多信息,请参见《系统管理指南:安全性服务》中的“基于角色的访问控制(概述)”。
通过修改 /etc/syslog.conf 文件,可以捕获各个系统进程生成的其他错误消息。缺省情况下,/etc/syslog.conf 文件会将许多系统进程消息定向到 /var/adm/messages 文件。崩溃和引导消息也存储在这些文件中。要查看 /var/adm 消息,请参见如何查看系统消息。
/etc/syslog.conf 文件有两个通过制表符分隔的列:
facility.level ... action |
消息或情况的工具或系统源。可能是由逗号分隔的工具列表。表 15–1 中列出了工具值。level,表示所记录情况的严重程度或优先级。表 15–2 中列出了优先级。
如果同一工具的两个项用于不同优先级,则不要将这两个项放在同一行中。在 syslog 文件中放置优先级表示将记录该优先级或更高优先级的所有消息,最后一条消息优先。对于给定的工具和级别,syslogd 将匹配该级别以及所有更高级别的所有消息。
操作字段表示将消息转发到的位置。
以下示例显示缺省的 /etc/syslog.conf 文件中的样例行。
user.err /dev/sysmsg user.err /var/adm/messages user.alert `root, operator' user.emerg * |
这意味着将自动记录以下用户消息:
将用户错误列显到控制台,同时将其记录到 /var/adm/messages 文件中。
将需要立即操作的用户消息 (alert) 发送给超级用户和操作员用户。
将用户紧急消息发送给各用户。
如果在 /etc/syslog.conf 文件中多次指定一个日志目标,则将各项分别放置在不同的行中可能会导致消息的记录顺序混乱。请注意,可在一个行项中指定多个选择器,每个选择器之间用分号分隔。
下表中显示了最常见的错误情况源。表 15–2 按严重程度显示最常见的优先级。
表 15–1 syslog.conf 消息的源工具
源 |
说明 |
---|---|
kern |
内核 |
auth |
验证 |
daemon |
所有守护进程 |
|
邮件系统 |
lp |
假脱机系统 |
user |
用户进程 |
可在 /etc/syslog.conf 文件中激活的 syslog 工具数没有限制。
优先级 |
说明 |
---|---|
emerg |
系统紧急情况 |
alert |
需要立即更正的错误 |
crit |
严重错误 |
err |
其他错误 |
info |
提示性消息 |
debug |
用于调试的输出 |
none |
此设置不记录输出 |
成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
编辑 /etc/syslog.conf 文件,根据 syslog.conf(4) 中介绍的语法添加或更改消息源、优先级和消息位置。
退出文件,保存更改。
此样例 /etc/syslog.conf user.emerg 工具可向超级用户和个人用户发送用户紧急消息。
user.emerg `root, *' |
以下新增控制台功能可以提高您对远程系统进行故障排除的能力:
利用 consadm 命令,您可以选择串行设备作为辅助(或远程)控制台。使用 consadm 命令,系统管理员可以配置一个或多个串行端口,以便当系统在不同运行级之间转换时显示重定向的控制台消息,并托管 sulogin 会话。借助此功能,您可用调制解调器拨入并连接到串行端口,以监视控制台消息并参与 init 状态转换。(有关更多信息,请参见 sulogin(1M) 和后面的逐步过程。)
使用配置为辅助控制台的端口登录系统时,它主要用作输出设备,其中显示的信息也在缺省控制台中显示。如果引导脚本或其他应用程序从缺省控制台中读取内容或向其中写入内容,则写入输出将在所有辅助控制台上显示,但输入只从缺省控制台中读取。(有关在交互式登录会话过程中使用 consadm 命令的更多信息,请参见在交互式登录会话期间使用 consadm 命令。)
控制台输出包括内核和写入新的伪设备 /dev/sysmsg 的 syslog 消息。此外,rc 脚本启动消息也将写入 /dev/msglog。以前,所有这些消息都写入 /dev/console。
如果希望看到显示在辅助控制台中的脚本消息,那么需要把将控制台输出定向到 /dev/console 的脚本更改为 /dev/msglog。如果希望将消息重定向到辅助设备,则应该将引用 /dev/console 的程序显式修改为使用 syslog() 或 strlog()。
consadm 命令运行守护进程来监视辅助控制台设备。指定为辅助控制台并且已断开、挂起或失去载体的任何显示设备都将从辅助控制台设备列表中删除,并且不再处于活动状态。启用一个或多个辅助控制台不会禁用缺省控制台上的消息显示,消息将继续在 /dev/console 中显示。
在运行级转换期间使用辅助控制台消息传递时,请记住以下几点:
如果在系统引导时运行的 rc 脚本期望用户输入,则输入不能来自辅助控制台。输入必须来自缺省控制台。
由 init 调用以用于在运行级之间转换时提示输入超级用户口令的 sulogin 程序已被修改,除了缺省控制台设备之外,还可以向每个辅助设备发送超级用户口令提示。
当系统处于单用户模式并且使用 consadm 命令启用一个或多个辅助控制台时,将在第一个设备上运行控制台登录会话,以便为 sulogin 提示提供正确的超级用户口令。从控制台设备收到正确口令时,sulogin 将禁用来自所有其他控制台设备的输入。
如果其中一个控制台承担了单用户特权,将在缺省控制台和其他辅助控制台上显示一条消息。此消息指出已通过接受正确的超级用户口令而成为控制台的设备。如果运行单用户 shell 的辅助控制台中丢失载体,则会执行以下两种操作之一:
如果辅助控制台代表一个处于运行级 1 的系统,则系统会继续到缺省运行级。
如果辅助控制台代表一个处于运行级 S 的系统,则系统会显示已通过 Shell 输入 init s 或 shutdown 命令的设备中的 ENTER RUN LEVEL (0-6, s or S): 消息。如果该设备中也没有任何载体,则必须重新建立载体并输入正确的运行级。init 或 shutdown 命令不再重新显示运行级提示。
如果使用串行端口登录系统,并发出 init 或 shutdown 命令以转换到其他运行级,则无论此设备是否为辅助控制台,登录会话都将丢失。此情况与没有辅助控制台功能的发行版相同。
一旦使用 consadm 命令将设备选作辅助控制台,该设备将一直用作辅助控制台,直到重新引导系统或取消选中辅助控制台。但是,consadm 命令有一个选项,可在系统重新引导期间将设备设置为辅助控制台。(有关逐步说明,请参见以下过程。)
如果要通过使用与串行端口连接的终端登录系统,再使用 consadm 命令查看终端的控制台消息的方式来运行交互式登录会话,请注意以下行为。
如果在辅助控制台处于活动状态时将终端用于交互式登录会话,则会向 /dev/sysmsg 或 /dev/msglog 设备发送控制台消息。
在终端发出命令时,输入将转到交互式会话而非缺省控制台 (/dev/console)。
如果运行 init 命令更改运行级,远程控制台软件将中止交互式会话并运行 sulogin 程序。此时,只接受来自终端的输入,并将其视为来自控制台设备的输入。这样您便可以按在运行级转换期间使用辅助控制台消息传递中所述为 sulogin 程序输入口令。
然后,如果您在(辅助)终端中输入正确口令,辅助控制台将运行交互式 sulogin 会话,并锁定缺省控制台和任何竞争性的辅助控制台。这意味着,终端基本上可用作系统控制台。
此时,您可以更改到运行级 3 或转到其他运行级。如果更改运行级,sulogin 将在所有控制台设备中再次运行。如果您退出或指定系统应达到运行级 3,则所有辅助控制台都将丧失提供输入的能力。它们将恢复为控制台消息的显示设备。
随着系统的提升,您必须为缺省控制台设备中的 rc 脚本提供信息。在系统恢复启动后,login 程序将在串行端口上运行,您可以重新登录到其他交互式会话中。如果已将该设备指定为辅助控制台,您将继续在终端中获得控制台消息,但来自该终端的所有输入都将转至交互式会话。
在您使用 consadm 命令添加辅助控制台之前,consadm 守护进程不会开始监视端口。作为一种安全功能,在载体脱机或取消选择辅助控制台设备之前,控制台消息只能重定向。这意味着必须在端口中建立载体,才能成功使用 consadm 命令。
有关启用辅助控制台的更多信息,请参见 consadm(1m) 手册页。
# consadm -a /dev/term/a # consadm /dev/term/a |
以超级用户身份登录系统。
在系统重新引导期间启用辅助控制台。
# consadm -a -p devicename |
这将会向持久性辅助控制台列表中添加设备。
验证设备是否已添加至持久性辅助控制台的列表中。
# consadm |
# consadm -a -p /dev/term/a # consadm /dev/term/a |
# consadm -d /dev/term/a # consadm |