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

14.1. 概要

FreeBSD 的一个重要方面是正确的系统配置。本章解释了 FreeBSD 配置过程的大部分内容,包括可以设置以调整 FreeBSD 系统的一些参数。

在阅读本章之前,您应该

阅读本章后,您将了解

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

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

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

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

14.2. 配置文件

FreeBSD 在基本系统和第三方应用程序之间保持清晰的分隔,因此这会影响这些应用程序的配置文件所在的位置。

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

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

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

一般来说,配置文件没有使用标准来规定它们必须遵循的语法。虽然 # 字符通常用于注释一行,并且每一行都有一个配置变量,但这是真的。

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

14.2.1. /etc 目录

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

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

/etc

系统配置文件和脚本。

/etc/defaults

默认系统配置文件,有关更多信息,请参阅 rc(8)

/etc/fstab

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

/etc/mail

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

/etc/mtree

mtree 配置文件,有关更多信息,请参阅 man:mtree[8]。

/etc/pam.d

可插入身份验证模块 (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) 实用程序检索内核状态,并允许具有适当权限的进程设置内核状态。要检索或设置的状态使用“管理信息库”(“MIB”)样式名称描述,该名称被描述为一组带点的组件。

表 1. 管理信息库

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
[...]

要设置特定变量,请使用 *变量*=*值* 语法

# 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

使用 变量=值 语法设置值。

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

例如,要关闭对致命信号退出进行记录,并防止用户看到其他用户启动的进程,可以在 /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 中的脚本提供基本服务,可以使用 startstoprestart 选项来控制 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. 启动服务

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

security/openssh-portablewww/nginx 等服务只是在系统初始化期间可能启动的众多软件包中的两个。本节解释了启动服务的可用程序。

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

因此,启动服务的第一步(例如,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

也可以将服务自动放入 jail 中,请参阅相应的服务 Jails说明。

14.3.2. 服务状态

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

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

# service nginx status

输出应类似于以下内容

nginx is running as pid 27871.

14.3.3. 重新加载服务

在某些情况下,也可以重新加载服务。这尝试向单个服务发送信号,强制服务重新加载其配置文件。

在大多数情况下,这意味着向服务发送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)及其配置的详细说明在“The inetd Super-Server”中。

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

cron(8)@reboot功能可以代替时间规范使用。这会导致作业在cron(8)启动时运行,通常在系统初始化期间。

14.4. Cron 和 Periodic

将任务安排在特定日期或时间运行是 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(5)中有所说明。系统 crontab 的格式,/etc/crontab包含一个who列,该列在用户 crontab 中不存在。在系统 crontab 中,cron 以此列中指定的用户的身份运行命令。在用户 crontab 中,所有命令都以创建 crontab 的用户的身份运行。

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

以下来自系统 crontab,/etc/crontab的示例条目

# /etc/crontab - root's crontab for 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 中使用的七个字段:minutehourmdaymonthwdaywhocommandminute字段是在指定命令将要运行的分钟时间,hour是指定命令将要运行的小时,mday是月中的日期,month是月份,而wday是星期几。这些字段必须是数字值,表示 24 小时制时钟,或一个*,表示该字段的所有值。who字段仅存在于系统 crontab 中,并指定应以哪个用户的身份运行命令。最后一个字段是要执行的命令。
4此条目定义了此 cron 作业的值。*/11,后面跟着几个*字符,指定/usr/libexec/save-entropyoperator在每个小时的每 11 分钟,每天和每周的每一天,每个月的每一天被调用。命令可以包含任意数量的开关。但是,跨越多行的命令需要用反斜杠“\”续行符来断开。

14.4.2. 创建用户 Crontab

要创建用户 crontab,请在编辑模式下调用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

cron 设置的环境在crontab(5)中有所说明。检查脚本在 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 或更高的日志消息。还可以添加一个可选的比较标志在级别之前,以更精确地指定记录的内容。多个选择器字段可以用于同一操作,并用分号 (;) 分隔。使用 * 将匹配所有内容。操作字段表示将日志消息发送到哪里,例如发送到文件或远程日志主机。

例如,以下是 FreeBSD 中的默认 /etc/syslog.conf

#       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)。
2匹配来自 mail 设施的所有级别为 info 或更高的消息,并将这些消息记录到 /var/log/maillog
3使用比较标志 (=) 仅匹配级别为 debug 的消息,并将它们记录到 /var/log/debug.log
4这是程序规范的示例用法。这使它之后的规则仅对指定的程序有效。在本例中,仅由 devd(8) 生成的消息被记录到 /var/log/devd.log

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

14.5.2. 日志设施

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

表 2. syslog 设施
名称描述

auth

授权系统: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

由 syslogd(8) 内部生成的邮件。

user

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

uucp

Unix 到 Unix 复制系统。一个古老的协议。看到来自此设施的邮件真的很奇怪。

local0 到 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
#
# 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 - 当日志文件的大小达到 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中定义日志服务器。在本示例中,所有已记录的工具都发送到远程系统(由符号 @ 表示),并使用指定的 hostname

*.*  @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)
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 状态。
2CPU 支持的 Cx 状态。
3CPU 当前可用的级别(频率/功耗)。
4CPU 当前的活动频率(以 MHz 为单位)。
5CPU 当前的温度。

如果未显示温度信息,请加载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: 选择在 AC 电源下使用的模式。

  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)驱动程序,以在配备的 CPU 上自动启用 Speed Shift™ 控制,替换旧的 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 允许在某些配置中提高功耗。

如果使用的是带有graphics/drm-kmod驱动程序的 Intel® 显卡,可以将以下选项添加到/boot/loader.conf

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

14.6.7. 挂起/恢复

挂起/恢复功能允许机器保持在低功耗状态,并允许系统恢复而无需丢失正在运行程序的状态。

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

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

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

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

S2

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

S3(睡眠模式)

挂起到内存。大多数设备断电,系统停止运行,除了内存刷新。

S4(休眠)

挂起到磁盘。所有设备都断电,系统停止运行。恢复时,系统从冷启动开始。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

在大多数情况下,挂起/恢复功能希望在笔记本电脑上使用。

FreeBSD 可以配置为在关闭盖子时进入 S3 状态,方法是在 /etc/sysctl.conf 文件中添加以下行。

hw.acpi.lid_switch_state=S3

14.6.7.2. 挂起/恢复故障排除

已经做了很多努力来使挂起和恢复功能在 FreeBSD 上正常工作并以最佳方式工作。但目前,挂起和恢复功能仅在某些特定笔记本电脑上正常工作。

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

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

如果无法正常工作,可以在 FreeBSD Wiki 的 挂起/恢复 部分找到一些提示。

14.7. 添加交换空间

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

有关如何加密交换空间、存在哪些选项以及为什么要这样做,请参阅 “加密交换空间”

14.7.1. 在新硬盘或现有分区上添加交换空间

为交换空间添加新的驱动器比使用现有驱动器上的分区性能更好。设置分区和驱动器在 添加磁盘 中有说明,而 设计分区布局 讨论分区布局和交换分区大小的考虑因素。

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

swapon(8) 可用于通过执行以下命令将交换分区添加到系统中

# swapon /dev/ada1p2

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

/dev/ada1p2 none swap sw 0 0

有关 /etc/fstab 中条目说明,请参见 fstab(5)

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

最后修改时间:2024 年 9 月 23 日,作者 Fernando Apesteguía