第 14 章 配置、服务、日志和电源管理

如果发现翻译错误,请直接 发起PR修改

14.1. 简介

FreeBSD 的一个重要方面是正确的系统配置。本章介绍了 FreeBSD 配置过程的许多内容,包括一些可以设置的参数,用于调整 FreeBSD 系统。

在阅读本章之前,您应该:

阅读本章后,您将了解:

  • 如何使用 /etc 中的各种配置文件。

  • rc.conf 配置和 /usr/local/etc/rc.d 启动脚本的基础知识。

  • 如何使用 sysctl(8) 变量来调整 FreeBSD。

  • 如何在 FreeBSD 中配置电源管理。

14.2. 配置文件

FreeBSD 在基础系统和第三方应用程序之间保持了明确的分离,因此这影响了这些应用程序的配置文件的位置。

FreeBSD 基本系统配置位于 .filename]/etc 目录下,而 /usr/local/etc 目录包含通过 ports 集合和软件包安装在系统上的所有应用程序的配置文件。

内核状态配置位于 /etc/sysctl.conf。在 sysctl 实用程序 部分,将更详细地解释 sysctl(8) 的操作。

有关 FreeBSD 文件系统结构的更多信息,请参阅 hier(7)

通常情况下,配置文件没有遵循统一的语法规范。虽然使用 # 字符来注释一行是常见的做法,并且每行都包含一个配置变量。

一些应用程序,如 pkg(8),开始使用 通用配置语言(UCL)

14.2.1. /etc 目录

/etc 目录包含了所有负责配置 FreeBSD 的基本系统配置文件。

在修改 /etc 目录中的文件时,必须非常小心;配置错误可能会导致 FreeBSD 无法启动或出现故障。

/etc

系统配置文件和脚本。

/etc/defaults

默认的系统配置文件,请参阅 rc(8) 获取更多信息。

/etc/fstab

fstab(5) 包含了关于各种文件系统的描述信息。

/etc/mail

额外的 sendmail(8) 配置和其他 MTA 配置文件。

/etc/mtree

mtree 配置文件,请参考 mtree(8) 了解更多信息。

/etc/pam.d

Pluggable Authentication Modules(PAM)库的配置文件。

/etc/periodic

通过 cron(8) 每天、每周和每月运行的脚本,请参阅 periodic(8) 获取更多信息。

/etc/rc.d

系统和守护进程的启动/控制脚本,请参阅 rc(8) 获取更多信息。

/etc/rc.conf

包含有关本地主机名称的描述性信息,潜在网络接口的配置细节以及应在系统初始启动时启动的服务。有关更多信息,请参见 管理系统特定配置

/etc/security

OpenBSM 审计配置文件,详见 audit(8) 获取更多信息。

/etc/ppp

ppp 配置文件,请参考 ppp(8) 获取更多信息。

/etc/ssh

OpenSSH 配置文件,更多信息请参见 ssh(1)

/etc/ssl

OpenSSL 配置文件。

/etc/sysctl.conf

包含内核的设置。更多信息请参见 sysctl 实用程序

14.2.2. sysctl 实用程序

sysctl(8) 实用程序用于对运行中的 FreeBSD 系统进行更改。

sysctl(8) 实用程序用于检索内核状态,并允许具有适当特权的进程设置内核状态。要检索或设置的状态使用“管理信息库(Management Information Base)”(“MIB”)样式的名称进行描述,该名称被描述为一组由点分隔的组件。

表 1. 管理信息库

sysctl 是一个用于管理和配置 Linux 内核参数的命令行工具。它允许用户查看和修改内核的运行时参数,以及控制系统的行为。通过 sysctl 命令,用户可以查询和修改各种系统设置,如网络配置、文件系统参数、内存管理等。这个工具在调优系统性能、解决问题和进行系统管理时非常有用。

"魔术"数字

kern

内核功能和特性

vm

虚拟内存

vfs

文件系统

net

网络

debug

调试参数

hw

硬件

machdep

机器依赖

user

用户空间

p1003_1b

POSIX 1003.1B

在其核心,sysctl(8) 有两个功能:读取和修改系统设置。

查看所有可读取的变量:

% sysctl -a

输出应该类似于以下内容:

kern.ostype: FreeBSD
...
vm.swap_enabled: 1
vm.overcommit: 0
vm.domain.0.pidctrl.kdd: 8
vm.domain.0.pidctrl.kid: 4
vm.domain.0.pidctrl.kpd: 3
...
vfs.zfs.sync_pass_rewrite: 2
vfs.zfs.sync_pass_dont_compress: 8
vfs.zfs.sync_pass_deferred_free: 2

要读取特定的变量,请指定其名称:

% sysctl kern.maxproc

输出应该类似于以下内容:

kern.maxproc: 1044

管理信息库(MIB)是分层的,因此,指定一个前缀将打印出所有挂在该前缀下的节点:

% sysctl net

输出应该类似于以下内容:

net.local.stream.recvspace: 8192
net.local.stream.sendspace: 8192
net.local.dgram.recvspace: 16384
net.local.dgram.maxdgram: 2048
net.local.seqpacket.recvspace: 8192
net.local.seqpacket.maxseqpacket: 8192
net.local.sockcount: 60
net.local.taskcount: 25
net.local.recycled: 0
net.local.deferred: 0
net.local.inflight: 0
net.inet.ip.portrange.randomtime: 1
net.inet.ip.portrange.randomcps: 9999
[...]

要设置特定的变量,请使用 variable=value 的语法:

# sysctl kern.maxfiles=5000

输出应该类似于以下内容:

kern.maxfiles: 2088 -> 5000

为了在重启后保留配置,需要按照下面的说明将这些变量添加到 /etc/sysctl.conf 文件中。

14.2.3. /etc/sysctl.conf 文件

sysctl(8) 的配置文件,/etc/sysctl.conf ,看起来很像 /etc/rc.conf

使用 variable=value 语法来设置值。

系统进入多用户模式后,设置了指定的值。并非所有变量都可以在此模式下设置。

例如,要关闭致命信号退出的日志记录并防止用户看到其他用户启动的进程,可以在[.filename]/etc/sysctl.conf 中设置以下可调整项:

# Do not log fatal signal exits (e.g., sig 11)
kern.logsigexit=0

# Prevent users from seeing information about processes that
# are being run under another UID.
security.bsd.see_other_uids=0

要获取关于特定 sysctl 函数的更多信息,可以执行以下命令:

% sysctl -d kern.dfldsiz

输出应该类似于以下内容:

kern.dfldsiz: Initial data size limit

14.2.4. 管理系统特定配置

系统配置信息的主要位置是 /etc/rc.conf

该文件包含了各种配置信息,并在系统启动时读取以配置系统。它为 rc* 文件提供配置信息。

/etc/rc.conf 中的条目会覆盖 /etc/defaults/rc.conf 中的默认设置。

不应编辑包含默认设置的文件 /etc/defaults/rc.conf 。相反,所有特定于系统的更改应该在 /etc/rc.conf 中进行。

在集群应用中,可以采用多种策略来将整个站点的配置与系统特定的配置分离,以减少管理开销。

推荐的方法是将系统特定的配置放置在 /etc/rc.conf.local 文件中。

例如,这些条目在 /etc/rc.conf 适用于所有系统:

sshd_enable="YES"
keyrate="fast"
defaultrouter="10.1.1.254"

而这些条目在 /etc/rc.conf.local 文件中仅适用于此系统:

hostname="node1.example.org"
ifconfig_fxp0="inet 10.1.1.1/8"

使用诸如 rsync 或 puppet 的应用程序,将 /etc/rc.conf 分发到每个系统,同时保持 /etc/rc.conf.local 的唯一性。

升级系统不会覆盖 /etc/rc.conf 文件,因此系统配置信息不会丢失。

/etc/rc.conf/etc/rc.conf.local 都由 sh(1) 解析。这使得系统操作员能够创建复杂的配置场景。有关此主题的更多信息,请参阅 rc.conf(5)

14.3. 在 FreeBSD 中管理服务

FreeBSD 在系统初始化和服务管理过程中使用 rc(8) 系统的启动脚本。

/etc/rc.d 中列出的脚本提供基本服务,可以通过 startstop 和 `restart`选项来控制,使用 service(8) 命令。

一个基本的脚本可能类似于以下内容:

#!/bin/sh
#
# PROVIDE: utility
# REQUIRE: DAEMON
# KEYWORD: shutdown

. /etc/rc.subr

name=utility
rcvar=utility_enable

command="/usr/local/sbin/utility"

load_rc_config $name

#
# DO NOT CHANGE THESE DEFAULT VALUES HERE
# SET THEM IN THE /etc/rc.conf FILE
#
utility_enable=${utility_enable-"NO"}
pidfile=${utility_pidfile-"/var/run/utility.pid"}

run_rc_command "$1"

请参考 这篇文章,了解如何创建自定义的 rc(8) 脚本的指南。

14.3.1. 启动服务

许多用户在 FreeBSD 上从 Ports Collection 安装第三方软件,并要求在系统初始化时启动已安装的服务。

服务,例如 security/openssh-portablewww/nginx 只是许多软件包中的两个,这些软件包可能在系统初始化期间启动。本节介绍了启动服务的可用程序。

由于 rc(8) 系统主要用于在系统启动和关闭时启动和停止服务,因此只有在设置了适当的 /etc/rc.conf 变量时,startstoprestart 选项才会执行其操作。

因此,启动服务的第一步,例如 www/nginx,是通过执行以下命令将其添加到 /etc/rc.conf 中:

# sysrc nginx_enable="YES"

然后可以执行以下命令来启动 nginx :

# service nginx start

无论 /etc/rc.conf 中的设置如何,要启动、停止或重新启动服务,这些命令都应以“one”为前缀。例如,要启动 www/nginx,无论当前 /etc/rc.conf 的设置如何,执行以下命令:

# service nginx onestart

14.3.2. 服务的状态

要确定服务是否正在运行,请使用 status 子命令。

例如,要验证 www/nginx 是否正在运行:

# service nginx status

输出应该类似于以下内容:

nginx is running as pid 27871.

14.3.3. 重新加载服务

在某些情况下,也可以“重新加载(reload)”一个服务。这将尝试向一个单独的服务发送一个信号,强制该服务重新加载其配置文件。

在大多数情况下,这意味着向服务发送一个 SIGHUP 信号。

并非所有服务都支持此功能。

rc(8) 系统用于网络服务,并且它还贡献了大部分系统初始化工作。例如,当执行 /etc/rc.d/bgfsck 脚本时,它会打印出以下消息:

Starting background file system checks in 60 seconds.

该脚本用于后台文件系统检查,仅在系统初始化期间进行。

许多系统服务依赖其他服务的正常运行。例如,yp(8) 和其他基于 RPC 的服务可能在 rpcbind(8) 服务启动之前无法启动。

可以在 rc(8)rc.subr(8) 中找到更多的信息。

14.3.4. 使用服务启动服务

其他服务可以使用 inetd(8) 启动。有关使用 inetd(8) 及其配置的详细信息,请参阅 “inetd 超级服务器”

在某些情况下,使用 cron(8) 来启动系统服务可能更合理。这种方法有许多优点,因为 cron(8)crontab(5) 的所有者身份运行这些进程。这使得普通用户可以启动和维护自己的应用程序。

@reboot 功能是 cron(8) 的一个特性,可以用来替代时间规范。这将导致作业在 cron(8) 启动时运行,通常是在系统初始化期间。

14.4. Cron 和周期性任务

在 FreeBSD 上,安排任务在特定的日期或时间运行是一项非常常见的任务。负责执行这项任务的工具是 cron(8)

除了用户可以通过 cron(8) 进行调度的任务之外,FreeBSD 还执行由 periodic(8) 管理的常规后台任务。

14.4.1. Cron

cron(8) 实用程序在后台运行,并定期检查 /etc/crontab 中的任务以执行,并在 /var/cron/tabs 中搜索自定义的 crontab 文件。

这些文件用于安排任务,cron 会在指定的时间运行这些任务。

crontab 中的每个条目定义了一个要运行的任务,被称为 cron 作业

使用了两种不同类型的配置文件:系统 crontab 和用户 crontab。系统 crontab 不应该被修改,而用户 crontab 可以根据需要创建和编辑。这些文件使用的格式在 crontab(5) 中有文档记录。系统 crontab 的格式(.filename]/etc/crontab)包括一个 who 列,在用户 crontab 中不存在。在系统 crontab 中,cron 根据该列中指定的用户运行命令。在用户 crontab 中,所有命令都以创建 crontab 的用户身份运行。

用户的 crontab 允许个别用户安排自己的任务。root 用户也可以拥有一个用户 crontab ,用于安排系统中不存在的任务。

这是系统 crontab 的一个示例条目,/etc/crontab:

# /etc/crontab - root's crontab for FreeBSD
#
# $FreeBSD$ (1)
#
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin (2)
#
#minute hour    mday    month   wday    who     command (3)
#
# Save some entropy so that /dev/random can re-seed on boot.
*/11    *       *       *       *       operator /usr/libexec/save-entropy (4)
#
# Rotate log files every hour, if necessary.
0       *       *       *       *       root    newsyslog
#
# Perform daily/weekly/monthly maintenance.
1       3       *       *       *       root    periodic daily
15      4       *       *       6       root    periodic weekly
30      5       1       *       *       root    periodic monthly
#
# Adjust the time zone if the CMOS clock keeps local time, as opposed to
# UTC time.  See adjkerntz(8) for details.
1,31    0-5     *       *       *       root    adjkerntz -a
1 # 字符开头的行是注释。注释可以放在文件中作为对所执行的操作的内容和原因的提醒。注释不能与命令在同一行,否则它们将被解释为命令的一部分;它们必须在新的一行上。空行会被忽略。
2 等号(=)字符用于定义任何环境设置。在这个例子中,它被用来定义 SHELLPATH。如果省略了 SHELL, cron 将使用默认的 Bourne shell。如果省略了 PATH,则必须提供要运行的命令或脚本的完整路径。
3 这行定义了系统 crontab 中使用的七个字段:minute(分钟)、hour(小时)、mday(月中的某一天)、month(月份)、wday(星期几)、who(用户)和 command(命令)。minute 字段表示指定命令将运行的分钟数,hour 字段表示指定命令将运行的小时数,mday 字段表示月份中的某一天,month 字段表示月份,wday 字段表示星期几。这些字段必须是数字值,表示 24 小时制的时间,或者是 *,表示该字段的所有值。who 字段仅存在于系统 crontab 中,用于指定命令应该以哪个用户身份运行。最后一个字段是要执行的命令。
4 此条目定义了此 cron 作业的值。*/11 后面跟着几个 * 字符,指定了 /usr/libexec/save-entropy 在每小时的每十一分钟,每天的每小时,每周的每天,每月的每天都由 operator 调用。命令可以包含任意数量的开关。然而,跨多行的命令需要使用反斜杠 "\" 继续字符进行分割。

14.4.2. 创建用户的定时任务表

要创建一个用户的定时任务表,可以在编辑器模式下调用 crontab 命令:

% crontab -e

这将使用默认的文本编辑器打开用户的 crontab。当用户第一次运行此命令时,它将打开一个空文件。一旦用户创建了一个 crontab,此命令将打开该文件以供编辑。

在 crontab 文件的顶部添加以下行是很有用的,这样可以设置环境变量并记住 crontab 中字段的含义:

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
# Order of crontab fields
# minute hour mday month wday command

然后为每个要运行的命令或脚本添加一行,指定运行命令的时间。此示例在每天下午两点运行指定的自定义 Bourne shell 脚本。由于脚本的路径没有在 PATH 中指定,因此给出了脚本的完整路径:

0 14 * * * /home/user/bin/mycustomscript.sh

在使用自定义脚本之前,请确保它是可执行的,并使用 cron 设置的有限环境变量集进行测试。要复制用于运行上述 cron 条目的环境,请使用:

env -i SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin HOME=/home/user LOGNAME=user /home/user/bin/mycustomscript.sh

crontab(5) 中讨论了由 cron 设置的环境。如果脚本中包含使用通配符删除文件的命令,那么在 cron 环境中检查脚本的正确运行尤为重要。

编辑完 crontab 后,保存文件。它将自动安装,并且 cron 将读取 crontab 并在指定的时间运行其 cron 作业。要列出 crontab 中的 cron 作业,请使用以下命令:

% crontab -l

输出应该类似于以下内容:

0 14 * * * /home/user/bin/mycustomscript.sh

要删除用户 crontab 中的所有 cron 作业:

% crontab -r

输出应该类似于以下内容:

remove crontab for user? y

14.4.3. Periodic

FreeBSD 提供了一组系统管理脚本,用于检查各种子系统的状态,执行与安全相关的检查,轮转日志文件等。这些脚本定期运行:每天、每周或每月。这些任务的管理由 periodic(8) 执行,并且其配置存储在 periodic.conf(5) 中。定期任务由系统 crontab 中的条目启动,如上所示。

periodic(8) 执行的脚本位于基本工具的 /etc/periodic/ 目录下,第三方软件的脚本位于 /usr/local/etc/periodic/ 目录下。

它们被组织在 4 个子目录中,分别是 daily(每日)、weekly(每周)、monthly(每月)和 security(安全)。

14.4.4. 启用或禁用定期任务

FreeBSD 默认启用了一些定期运行的脚本。

要启用或禁用任务,第一步是编辑 /etc/periodic.conf 文件,执行以下命令:

# ee /etc/periodic.conf

然后,要启用 daily_status_zfs_enable,请将以下内容放入文件中:

daily_status_zfs_enable="YES"

要禁用默认情况下处于活动状态的任务,只需将 YES 更改为 NO 即可。

14.4.5. 配置定期任务的输出

/etc/periodic.conf 文件中,变量 daily_outputweekly_outputmonthly_output 指定了脚本执行结果的发送位置。

默认情况下,周期性脚本的输出会发送到 root 的邮箱,因此最好阅读 root 的邮件或将 root 的别名设置为一个被监控的邮箱。

要将结果发送到另一个电子邮件或其他电子邮件,请将电子邮件地址以空格分隔添加到 /etc/periodic.conf 中:

要将周期性的输出记录到日志文件而不是通过电子邮件接收,将以下行添加到 /etc/periodic.conf 文件中。 newsyslog(8) 会在适当的时间对这些文件进行轮转:

daily_output=/var/log/daily.log
weekly_output=/var/log/weekly.log
monthly_output=/var/log/monthly.log

14.5. 配置系统日志

生成和读取系统日志是系统管理的重要方面。系统日志中的信息可以用于检测硬件和软件问题,以及应用程序和系统配置错误。这些信息在安全审计和事件响应中也起着重要作用。大多数系统守护进程和应用程序都会生成日志条目。

FreeBSD 提供了一个系统日志记录器,syslogd(8),用于管理日志记录。默认情况下,系统启动时会启用和启动 syslogd。

本节介绍了如何配置 FreeBSD 系统日志记录器以进行本地和远程日志记录,以及如何执行日志轮转和日志管理。

14.5.1. 配置本地日志记录

配置文件 /etc/syslog.conf 控制着 syslogd 在接收到日志条目时的处理方式。有几个参数用于控制处理传入事件的方式。facility 描述了生成消息的子系统,例如内核或守护进程,而 level 描述了发生事件的严重程度。这使得可以根据 facility 和 level 配置是否以及在哪里记录日志消息。还可以根据发送消息的应用程序以及远程日志记录的情况下生成日志事件的机器的主机名来采取行动。

该配置文件每行包含一个操作,每行的语法是选择器字段后跟一个操作字段。选择器字段的语法是 facility.level,它将匹配 facilitylevel 或更高级别的日志消息。还可以在级别之前添加一个可选的比较标志,以更精确地指定记录的内容。可以为同一个操作使用多个选择器字段,并用分号 (;) 分隔。使用 * 将匹配所有内容。操作字段表示将日志消息发送到何处,例如文件或远程日志主机。

以下是 FreeBSD 的默认 /etc/syslog.conf 示例:

# $FreeBSD$
#
#       Spaces ARE valid field separators in this file. However,
#       other *nix-like systems still insist on using tabs as field
#       separators. If you are sharing this file between systems, you
#       may want to use only tabs as field separators here.
#       Consult the syslog.conf(5) manpage.
*.err;kern.warning;auth.notice;mail.crit                /dev/console (1)
*.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err   /var/log/messages
security.*                                      /var/log/security
auth.info;authpriv.info                         /var/log/auth.log
mail.info                                       /var/log/maillog (2)
cron.*                                          /var/log/cron
!-devd
*.=debug                                        /var/log/debug.log (3)
*.emerg                                         *
daemon.info                                     /var/log/daemon.log
# uncomment this to log all writes to /dev/console to /var/log/console.log
# touch /var/log/console.log and chmod it to mode 600 before it will work
#console.info                                   /var/log/console.log
# uncomment this to enable logging of all log messages to /var/log/all.log
# touch /var/log/all.log and chmod it to mode 600 before it will work
#*.*                                            /var/log/all.log
# uncomment this to enable logging to a remote loghost named loghost
#*.*                                            @loghost
# uncomment these if you're running inn
# news.crit                                     /var/log/news/news.crit
# news.err                                      /var/log/news/news.err
# news.notice                                   /var/log/news/news.notice
# Uncomment this if you wish to see messages produced by devd
# !devd
# *.>=notice                                    /var/log/devd.log (4)
!*
include                                         /etc/syslog.d
include                                         /usr/local/etc/syslog.d
1 匹配所有级别为 err 或更高的消息,以及 kern.warningauth.noticemail.crit ,并将这些日志消息发送到控制台(/dev/console)。 <.> 匹配所有级别为 info 或更高的 mail 设施的消息,并将这些消息记录到 /var/log/maillog 。 <.> 使用比较标志(=)仅匹配级别为 debug 的消息,并将其记录到 /var/log/debug.log 。 <.> 是程序规范的示例用法。这使得其后的规则仅对指定的程序有效。在这种情况下,只有由 devd(8) 生成的消息被记录到 /var/log/devd.log

有关 /etc/syslog.conf 的更多信息,包括其语法和更高级的用法示例,请参阅 syslog.conf(5)

14.5.2. 日志记录设施

设施描述了系统生成消息的部分。设施是一种将不同的消息分开的方式,以便用户更容易查阅日志。

表 2. syslog 设施
名称 描述

认证

授权系统:login(1)su(1)getty(8) 等。

authpriv

与 auth 相同,但日志记录到一个只有 root 用户可读的文件中。

console

由内核控制台输出驱动程序写入到 /dev/console 的消息。

cron

cron(8) 守护进程编写的消息。

daemon

系统守护进程,例如 routed(8),这些进程不是由其他设施明确提供的。

ftp

文件传输协议守护进程:ftpd(8)tftpd(8)

kern

由内核生成的消息。这些消息不能由任何用户进程生成。

lpr

行式打印机的排队系统:lpr(1)lpc(8)lpd(8) 等等。

mail

邮件系统。

mark

该设施每 20 分钟添加一条记录。

news

网络新闻系统。

ntp

网络时间协议系统。

security

安全子系统,如 ipfw(4)

syslog

man:syslogd(8) 内部生成的消息。

user

由随机用户进程生成的消息。如果未指定,则为默认的设施标识符

uucp

Unix 到 Unix 复制系统。一个古老的协议。真的很奇怪看到来自这个设施的消息。

local0 through local7

保留供本地使用。

14.5.3. 日志级别

级别描述了消息的严重程度,并且是以下有序列表中的关键字(从高到低):

表 3. syslog 级别
名称 描述

emerg

一种恐慌的情况。通常会向所有用户广播。

alert

应立即纠正的条件,例如系统数据库损坏。

crit

关键条件,例如硬件设备错误。

err

错误。

warning

警告信息。

notice

不是错误条件,但可能需要特殊处理的条件。

info

信息性消息。

debug

包含通常仅在调试程序时有用的信息的消息。

none

这个特殊级别禁用了一个特定的功能。

14.5.4. 阅读日志消息

默认情况下,FreeBSD 日志文件使用 rfc3164 格式,也被称为 BSD syslog 协议。了解更多关于其他格式以及如何使用它们的信息,请参阅 syslog(8)

通常日志具有以下语法:

date time hostname program[pid]: the message

将使用 /var/log/cron 文件的输出作为示例:

[...]
Jul 16 12:40:00 FreeBSD /usr/sbin/cron[81519]: (root) CMD (/usr/libexec/atrun)
Jul 16 12:44:00 FreeBSD /usr/sbin/cron[83072]: (operator) CMD (/usr/libexec/save-entropy)
[...]

可以通过运行以下命令在 syslog(8) 中启用详细日志记录,这样每条消息的设施和级别都会被添加:

# sysrc syslogd_flags="-vv"

一旦函数被激活,设施和级别将会在日志中显示,如下面的示例所示:

[...]
Jul 16 17:40:00 <cron.info> FreeBSD /usr/sbin/cron[1016]: (root) CMD (/usr/libexec/atrun)
Jul 16 17:44:00 <cron.info> FreeBSD /usr/sbin/cron[1030]: (operator) CMD (/usr/libexec/save-entropy)
[...]

14.5.5. 日志管理和轮转

日志文件可以快速增长,占用磁盘空间,并且使得查找有用信息变得更加困难。

在 FreeBSD 中,newsyslog(8) 用于管理日志文件并尝试减轻这个问题。

这个内置程序定期轮转和压缩日志文件,并可选择创建丢失的日志文件,并在日志文件移动时向程序发送信号。

由于 newsyslog 是从 cron(8) 运行的,它不能比从 cron(8) 计划运行的频率更频繁地旋转文件。在默认配置中,它每小时运行一次。

以下是 FreeBSD 中的默认配置,在 newsyslog.conf(5) 中可以找到更多信息:

# configuration file for newsyslog
# $FreeBSD$
#
# Entries which do not specify the '/pid_file' field will cause the
# syslogd process to be signalled when that log file is rotated.  This
# action is only appropriate for log files which are written to by the
# syslogd process (ie, files listed in /etc/syslog.conf).  If there
# is no process which needs to be signalled when a given log file is
# rotated, then the entry for that file should include the 'N' flag.
#
# Note: some sites will want to select more restrictive protections than the
# defaults.  In particular, it may be desirable to switch many of the 644
# entries to 640 or 600.  For example, some sites will consider the
# contents of maillog, messages, and lpd-errs to be confidential.  In the
# future, these defaults may change to more conservative ones.
#
# logfilename          [owner:group]    mode count size when  flags [/pid_file] [sig_num]
/var/log/all.log                        600  7     *    @T00  J
/var/log/auth.log                       600  7     1000 @0101T JC
/var/log/console.log                    600  5     1000 *     J
/var/log/cron                           600  3     1000 *     JC
/var/log/daily.log                      640  7     *    @T00  JN
/var/log/debug.log                      600  7     1000 *     JC
/var/log/init.log                       644  3     1000 *     J
/var/log/kerberos.log                   600  7     1000 *     J
/var/log/maillog                        640  7     *    @T00  JC
/var/log/messages                       644  5     1000 @0101T JC
/var/log/monthly.log                    640  12    *    $M1D0 JN
/var/log/devd.log                       644  3     1000 *     JC
/var/log/security                       600  10    1000 *     JC
/var/log/utx.log                        644  3     *    @01T05 B
/var/log/weekly.log                     640  5     *    $W6D0 JN
/var/log/daemon.log                     644  5     1000 @0101T JC

<include> /etc/newsyslog.conf.d/[!.]*.conf
<include> /usr/local/etc/newsyslog.conf.d/[!.]*.conf
  1. logfilename - 要归档的系统日志文件的名称。

  2. [owner:group] - 这个可选字段指定了存档文件的所有者和组。

  3. mode - 指定日志文件和归档文件的文件模式。有效的模式位是 0666 (即,可以为所有者、组和其他用户指定旋转日志的读写权限)。

  4. count - 指定允许存在的归档文件的最大数量。

  5. size - 当日志文件的大小达到指定的大小(以千字节为单位)时,将按照上述描述进行修剪。如果该字段包含星号('*'),则不会根据大小来修剪日志文件。

  6. when - 由一个时间间隔、一个特定时间或两者组成。在 newsyslog.conf(5) 中支持的选项。

  7. flags - 表示 newsyslog 接受的标志,newsyslog.conf(5) 中支持的选项。

  8. [/pid_file] - 这个可选字段指定包含守护进程的进程 ID 或查找进程组 ID 的文件名。

  9. [sig_num] - 这个可选字段指定将发送给守护进程的信号。

最后两个字段是可选的,用于指定进程的进程 ID(PID)文件的名称以及在文件轮转时发送给该进程的信号编号。

14.5.6. 配置远程日志记录

随着系统数量的增加,监控多个主机的日志文件可能变得难以管理。配置集中式日志记录可以减轻一些日志文件管理的行政负担。

在 FreeBSD 中,可以使用 syslogd 和 newsyslog 来配置集中式日志文件聚合、合并和轮转。

本节演示了一个示例配置,其中主机 A,名为 logserv.example.com,将收集本地网络的日志信息。

主机 B,名为 logclient.example.com,将被配置为将日志信息传递给日志服务器。

14.5.6.1. 日志服务器配置

日志服务器是一个已配置好的系统,用于接收来自其他主机的日志信息。

在配置日志服务器之前,请检查以下内容:

  • 如果在日志服务器和任何日志客户端之间存在防火墙,请确保防火墙规则集允许客户端和服务器的 UDP 端口 514。

  • 日志服务器和所有客户端机器必须在本地 DNS 中具有正向和反向条目。如果网络没有 DNS 服务器,请在每个系统的 /etc/hosts 中创建条目。正确的名称解析是必需的,以便日志条目不会被日志服务器拒绝。

在日志服务器上,编辑 /etc/syslog.conf 文件,指定要接收日志条目的客户端名称,要使用的日志设施以及存储主机日志条目的日志名称。此示例将主机名 B 添加到日志中,记录所有设施,并将日志条目存储在 /var/log/logclient.log 文件中。

例 1. 示例日志服务器配置
+logclient.example.com
*.*     /var/log/logclient.log

当添加多个日志客户端时,为每个客户端添加类似的两行条目。有关可用设施的更多信息,请参阅 syslog.conf(5)

接下来,执行以下命令:

# sysrc syslogd_enable="YES"
# sysrc syslogd_flags="-a logclient.example.com -v -v"

第一条条目在系统启动时启动 syslogd 。第二条条目允许来自指定客户端的日志条目。 -v -v 增加了日志消息的详细程度。这对于调整设施非常有用,因为管理员可以看到每个设施下记录了什么类型的消息。

可以指定多个 -a 选项来允许从多个客户端进行日志记录。还可以指定 IP 地址和整个网络块。有关可能选项的完整列表,请参阅 syslogd(8)

最后,创建日志文件:

# touch /var/log/logclient.log

此时,应重新启动并验证 syslogd :

# service syslogd restart
# pgrep syslog

如果返回了一个 PID,则表示服务器成功重启,可以开始客户端配置。如果服务器没有重启,请查看错误信息,请参考 /var/log/messages 文件。

14.5.6.2. 日志客户端配置

一个日志客户端将日志条目发送到网络上的日志服务器。客户端还保留了自己日志的本地副本。

一旦配置了日志服务器,就在日志客户端上执行以下命令:

# sysrc syslogd_enable="YES"
# sysrc syslogd_flags="-s -v -v"

第一项启用了系统启动时的 syslogd。第二项阻止其他主机向此客户端接受日志(-s),并增加了日志消息的详细程度。

接下来,在客户端的 /etc/syslog.conf 文件中定义日志服务器。在这个例子中,所有记录的设施都会被发送到一个远程系统,用 @ 符号表示,并指定主机名:

*.*  @logserv.example.com

保存编辑后,重新启动 syslogd 以使更改生效:

# service syslogd restart

为了测试日志消息是否通过网络发送,可以在客户端使用 logger(1) 命令向 syslogd 发送一条消息。

# logger "Test message from logclient"

此消息现在应该同时存在于客户端的 /var/log/messages 和日志服务器的 /var/log/logclient.log 中。

14.5.6.3. 调试日志服务器

如果日志服务器上没有接收到任何消息,原因很可能是网络连接问题、主机名解析问题或配置文件中的拼写错误。为了确定原因,确保日志服务器和日志客户端都能够使用它们在 /etc/rc.conf 中指定的主机名相互 ping。如果失败,请检查网络电缆、防火墙规则集以及 DNS 服务器或日志服务器和客户端上的 /etc/hosts 中的主机名条目。重复此过程,直到从两个主机都成功 ping

如果在两台主机上都成功执行了 ping 命令,但仍然无法接收到日志消息,则可以暂时增加日志的详细程度以缩小配置问题的范围。在下面的示例中,日志服务器上的 /var/log/logclient.log 文件为空,而日志客户端上的 /var/log/messages 文件没有显示失败的原因。

为了增加调试输出,编辑日志服务器上的 syslogd_flags 条目并执行重启操作:

sysrc syslogd_flags="-d -a logclient.example.com -v -v"
# service syslogd restart

在重新启动后,类似以下的调试数据将立即在控制台上闪现:

logmsg: pri 56, flags 4, from logserv.example.com, msg syslogd: restart
syslogd: restarted
logmsg: pri 6, flags 4, from logserv.example.com, msg syslogd: kernel boot file is /boot/kernel/kernel
Logging to FILE /var/log/messages
syslogd: kernel boot file is /boot/kernel/kernel
cvthname(192.168.1.10)
validate: dgram from IP 192.168.1.10, port 514, name logclient.example.com;
rejected in rule 0 due to name mismatch.

在这个例子中,由于一个拼写错误导致日志消息被拒绝,从而导致主机名不匹配。客户端的主机名应该是 logclient,而不是 logclien。修复拼写错误,重新启动,并验证结果。

# service syslogd restart

输出应该类似于以下内容:

logmsg: pri 56, flags 4, from logserv.example.com, msg syslogd: restart
syslogd: restarted
logmsg: pri 6, flags 4, from logserv.example.com, msg syslogd: kernel boot file is /boot/kernel/kernel
syslogd: kernel boot file is /boot/kernel/kernel
logmsg: pri 166, flags 17, from logserv.example.com,
msg Dec 10 20:55:02 <syslog.err> logserv.example.com syslogd: exiting on signal 2
cvthname(192.168.1.10)
validate: dgram from IP 192.168.1.10, port 514, name logclient.example.com;
accepted in rule 0.
logmsg: pri 15, flags 0, from logclient.example.com, msg Dec 11 02:01:28 trhodes: Test message 2
Logging to FILE /var/log/logclient.log
Logging to FILE /var/log/messages

目前,消息已经被正确接收并放置在正确的文件中。

14.5.6.4. 安全考虑

与任何网络服务一样,在实施日志服务器之前应考虑安全要求。日志文件可能包含有关本地主机上启用的服务、用户帐户和配置数据的敏感信息。从客户端发送到服务器的网络数据将不会进行加密或密码保护。如果需要加密,请考虑使用 security/stunnel,它将通过加密隧道传输日志数据。

本地安全性也是一个问题。日志文件在使用过程中或在日志轮换后都没有加密。本地用户可以访问日志文件以获取有关系统配置的更多信息。在日志文件上设置适当的权限至关重要。内置的日志轮换程序 newsyslog 支持在新创建和轮换的日志文件上设置权限。将日志文件设置为 600 模式应该可以防止本地用户的非法访问。有关更多信息,请参阅 newsyslog.conf(5)

14.6. 功耗和资源管理

高效利用硬件资源是非常重要的。功耗和资源管理使操作系统能够监控系统限制,并可能根据与这些限制相关的事件运行一些操作。

14.6.1. ACPI 配置

在 FreeBSD 上,这些资源的管理由 acpi(4) 内核设备管理。

在 FreeBSD 中,默认情况下,在系统启动时加载 acpi(4) 驱动程序。

由于系统总线在各种硬件交互中使用该驱动程序,因此此驱动程序在引导后 无法卸载

除了 acpi(4) 之外,FreeBSD 还有几个专门的内核模块用于各种 ACPI 供应商子系统。这些模块将添加一些额外的功能,如风扇速度、键盘背光或屏幕亮度。

可以通过运行以下命令获取列表:

% ls /boot/kernel | grep acpi

输出应该类似于以下内容:

acpi_asus.ko
acpi_asus_wmi.ko
acpi_dock.ko
acpi_fujitsu.ko
acpi_hp.ko
acpi_ibm.ko
acpi_panasonic.ko
acpi_sony.ko
acpi_toshiba.ko
acpi_video.ko
acpi_wmi.ko
sdhci_acpi.ko
uacpi.ko

例如,如果使用 IBM/Lenovo 笔记本电脑,则需要通过执行以下命令加载模块 acpi_ibm(4)

# kldload acpi_ibm

并将以下行添加到 /boot/loader.conf 文件中,以在启动时加载它:

acpi_ibm_load="YES"

acpi_video(4) 模块的替代方案是 backlight(9) 驱动程序。它提供了一种通用的处理面板背光的方式。默认的 GENERIC 内核包含了这个驱动程序。backlight(8) 实用程序可用于查询和调整面板背光的亮度。在这个示例中,亮度减少了 10% :

% backlight decr 10

14.6.2. CPU 功耗管理

CPU 是系统中最消耗资源的部分。了解如何提高 CPU 效率是我们系统中节省能源的基本部分。

为了正确地充分利用机器的资源,FreeBSD 通过使用 powerd(8) 和 cpufreq[4] 等技术来支持诸如 Intel Turbo Boost、AMD Turbo Core、Intel Speed Shift 等技术。

第一步是通过执行以下命令来获取 CPU 信息:

% sysctl dev.cpu.0 (1)

在这种情况下,数字 0 代表 CPU 的第一个核心。

输出应该类似于以下内容:

dev.cpu.0.cx_method: C1/mwait/hwc C2/mwait/hwc C3/mwait/hwc/bma
dev.cpu.0.cx_usage_counters: 3507294 0 0
dev.cpu.0.cx_usage: 100.00% 0.00% 0.00% last 3804us
dev.cpu.0.cx_lowest: C3 (1)
dev.cpu.0.cx_supported: C1/1/1 C2/2/1 C3/3/57 (2)
dev.cpu.0.freq_levels: 2267/35000 2266/35000 1600/15000 800/12000 (3)
dev.cpu.0.freq: 1600 (4)
dev.cpu.0.temperature: 40.0C (5)
dev.cpu.0.coretemp.throttle_log: 0
dev.cpu.0.coretemp.tjmax: 105.0C
dev.cpu.0.coretemp.resolution: 1
dev.cpu.0.coretemp.delta: 65
dev.cpu.0.%parent: acpi0
dev.cpu.0.%pnpinfo: _HID=none _UID=0 _CID=none
dev.cpu.0.%location: handle=\_PR_.CPU0
dev.cpu.0.%driver: cpu
dev.cpu.0.%desc: ACPI CPU
1 用于使 CPU 处于空闲状态的最低 Cx 状态。
2 CPU 支持的 Cx 状态。
3 当前可用的 CPU 级别(频率 / 功耗)。
4 当前活动的 CPU 频率(以 MHz 为单位)。
5 CPU 的当前温度。

如果温度信息未显示,请加载 coretemp(4) 模块。如果使用 AMD CPU,请加载 amdtemp(4) 模块。

一旦 CPU 信息可用,配置节能的最简单方法是让 powerd(8) 接管。

/etc/rc.conf 中启用 powerd(8) 服务,使其在系统启动时启动:

# sysrc powerd_enable=YES

还需要向 powerd(8) 指定一些参数,以告诉它如何管理执行以下命令的 CPU 的状态:

# sysrc powerd_flags="-a hiadaptive -i 25 -r 85 -N"
  1. -a:选择在交流电源下使用的模式。

  2. hiadaptive:操作模式。更多信息请参考 powerd(8)

  3. -i:指定当自适应模式开始降低性能以节省电力时的 CPU 负载百分比水平。

  4. -r:指定自适应模式应该考虑 CPU 运行并提高性能的 CPU 负载百分比水平。

  5. -N:将“nice”时间视为空闲时间,用于负载计算;即,如果 CPU 仅忙于“nice”进程,则不增加 CPU 频率。

然后执行以下命令启用服务:

# service powerd start

14.6.3. CPU 频率控制

FreeBSD 包含一个通用的 cpufreq(4) 驱动程序,允许管理员或者像 powerd(8)sysutils/powerdxx 这样的软件来管理 CPU 的频率,以实现性能和经济之间的理想平衡。降低设置可以节省电力,同时减少 CPU 产生的热量。提高设置可以增加性能,但会消耗额外的电力并产生更多的热量。

14.6.4. Intel® Enhanced Speed Step™

Intel® Enhanced Speed Step™ 驱动程序,est(4),用于替代提供此功能的 CPU 的通用 cpufreq(4) 驱动程序。可以使用 sysctl(8)/etc/rc.d/power_profile 启动脚本静态调整 CPU 频率。还可以使用 powerd(8)sysutils/powerdxx 等其他软件根据处理器利用率自动调整 CPU 频率。

可以通过检查 sysctl(3) 树来列出每个支持的频率及其预期的功耗。

# sysctl dev.cpufreq.0.freq_driver dev.cpu.0.freq_levels dev.cpu.0.freq

输出应该类似于以下内容:

dev.cpufreq.0.freq_driver: est0
dev.cpu.0.freq_levels: 3001/53000 3000/53000 2900/50301 2700/46082 2600/43525 2400/39557 2300/37137 2100/33398 2000/31112 1800/27610 1700/25455 1500/22171 1400/20144 1200/17084 1100/15181 900/12329 800/10550
dev.cpu.0.freq: 800

CPU 的最大频率加 1 MHz 表示 Intel® Turbo Boost™ 功能。

14.6.5. Intel Speed Shift™

运行较新的 Intel® CPU 的用户在升级到 FreeBSD 13 时可能会发现动态频率控制方面存在一些差异。针对某些 SKU 可用的 Intel® Speed Shift™ 功能集,提供了一种新的驱动程序,可以使硬件能够动态地变化核心频率,包括每个核心的频率。FreeBSD 13 配备了 hwpstate_intel(4) 驱动程序,可以自动启用配备了 Speed Shift™ 控制功能的 CPU,取代了较旧的 Enhanced Speed Step™ est(4) 驱动程序。sysctl(8) dev.cpufreq.%d.freq_driver 将指示系统是否正在使用 Speed Shift。

要确定正在使用哪个频率控制驱动程序,请检查 dev.cpufreq.0.freq_driver oid 。

# sysctl dev.cpufreq.0.freq_driver

输出应该类似于以下内容:

dev.cpufreq.0.freq_driver: hwpstate_intel0

这表示正在使用新的 hwpstate_intel(4) 驱动程序。在这种系统上,oid dev.cpu.%d.freq_levels 只会显示最大的 CPU 频率,并且会显示一个功耗级别为 -1

可以通过检查 dev.cpu.%d.freq oid 来确定当前的 CPU 频率。

# sysctl dev.cpu.0.freq_levels dev.cpu.0.freq

输出应该类似于以下内容:

dev.cpu.0.freq_levels: 3696/-1
dev.cpu.0.freq: 898

有关更多信息,包括如何平衡性能和能源使用,以及如何禁用此驱动程序,请参阅手册页面 hwpstate_intel(4)

习惯使用 powerd(8)sysutils/powerdxx 的用户会发现这些实用程序已被 hwpstate_intel(4) 驱动程序取代,并且不再按预期工作。

14.6.6. 图形卡功耗管理

近年来,显卡已成为计算机的基本组成部分。一些显卡可能具有过高的功耗。FreeBSD 允许进行某些配置以改善功耗。

如果使用 Intel® 显卡与 graphics/drm-kmod 驱动程序,可以将以下选项添加到 /boot/loader.conf 文件中:

compat.linuxkpi.fastboot=1 (1)
compat.linuxkpi.enable_dc=2 (2)
compat.linuxkpi.enable_fbc=1 (3)
1 尝试在启动时跳过不必要的模式设置。 <.> 启用省电显示 C 状态。 <.> 启用帧缓冲压缩以节省电量。

14.6.7. 挂起/恢复

挂起/恢复功能允许机器保持在低能耗状态,并且在不丢失运行程序状态的情况下恢复系统。

为了使挂起/恢复功能正常工作,必须在系统上加载图形驱动程序。在不支持 KMS 的图形卡上,必须使用 sc(4) 来避免破坏挂起/恢复功能。

有关使用哪个驱动程序以及如何配置它的更多信息,请参阅 X Window 系统章节

acpi(4) 支持以下睡眠状态的列表:

表 4. 支持的睡眠状态
S1 快速挂起到 RAM。CPU 进入较低的功耗状态,但大多数外设仍然保持运行。

S2

比 S1 更低的功耗状态,但具有相同的基本特征。不被许多系统支持。

S3 (Sleep mode)

挂起到 RAM。大多数设备都关闭电源,系统停止运行,只进行内存刷新。

S4 (Hibernation)

磁盘挂起。所有设备都被关闭,系统停止运行。在恢复时,系统会像从冷启动一样启动。FreeBSD 尚不支持此功能

S5

系统正常关闭并关闭电源。

14.6.7.1. 配置挂起/恢复

第一步是要知道我们正在使用的硬件支持哪种类型的睡眠状态,执行以下命令:

% sysctl hw.acpi.supported_sleep_state

输出应该类似于以下内容:

hw.acpi.supported_sleep_state: S3 S4 S5

如上所述, FreeBSD 目前 不支持 S4 状态。

acpiconf(8) 可以通过运行以下命令来检查 S3 状态是否正常工作,如果成功,屏幕应该变黑,机器将关闭:

# acpiconf -s 3

在绝大多数情况下,挂起/恢复功能是用于笔记本电脑的。

在关闭笔记本盖子时,可以通过在 /etc/sysctl.conf 文件中添加以下行来配置 FreeBSD 进入 S3 状态。

hw.acpi.lid_switch_state=S3

14.6.7.2. 挂起/恢复的故障排除

为了使 FreeBSD 上的挂起和恢复功能正常工作并以最佳方式运行,已经付出了很多努力。但目前,挂起和恢复功能只在一些特定的笔记本电脑上正常工作。

如果它无法正常工作,可以进行一些检查。

在某些情况下,关闭蓝牙就足够了。在其他情况下,只需加载正确的显卡驱动程序等即可。

如果它不能正常工作,可以在 FreeBSD Wiki 的 Suspend/Resume 部分找到一些提示。

14.7. 添加交换空间

有时候 FreeBSD 系统需要更多的交换空间。本节介绍了两种增加交换空间的方法:在现有分区或新硬盘上添加交换空间,以及在现有文件系统上创建交换文件。

有关如何加密交换空间、存在哪些选项以及为什么应该这样做的信息,请参考 “加密交换空间”

14.7.1. 在新硬盘或现有分区上进行交换

在现有驱动器上使用分区相比使用新的驱动器进行交换会提供更好的性能。在 “添加磁盘” 中解释了如何设置分区和驱动器,而 “设计分区布局” 则讨论了分区布局和交换分区大小的考虑事项。

可以使用任何当前未挂载的分区,即使它已经包含数据。在包含数据的分区上使用 swapon 命令将覆盖并销毁该数据。在运行 swapon 之前,请确保要添加为交换分区的分区确实是预期的分区。

swapon(8) 可以用于向执行以下命令的系统添加交换分区:

# swapon /dev/ada1p2

要在启动时自动添加此交换分区,请在 /etc/fstab 中添加一个条目:

/dev/ada1p2 none swap sw 0 0

请参阅 fstab(5),了解 /etc/fstab 中条目的解释。

14.7.2. 创建交换文件

这些示例创建一个名为 /usr/swap0 的 512M 交换文件。

强烈不建议在 ZFS 文件系统上使用交换文件,因为交换可能导致系统挂起。

第一步是创建交换文件:

# dd if=/dev/zero of=/usr/swap0 bs=1m count=512

第二步是给新文件设置适当的权限:

# chmod 0600 /usr/swap0

第三步是通过在 /etc/fstab 中添加一行来通知系统关于交换文件的信息:

md none swap sw,file=/usr/swap0,late 0 0

系统启动时将添加交换空间。要立即添加交换空间,请使用 swapon(8) 命令。

# swapon -aL

上次修改时间: September 18, 2024 by fiercex