第十四章 配置、服务、日志记录和电源管理14.1. 简介14.2. 配置文件14.2.1. /etc 目录14.2.2. sysctl 实用程序14.2.3. /etc/sysctl.conf 文件14.2.4. 管理系统特定配置14.3. 在FreeBSD中管理服务14.3.1. 启动服务14.3.2. 服务状态14.3.3. 重新加载服务14.3.4. 使用服务启动服务14.4. Cron 和 Periodic14.4.1. Cron14.4.2. 创建一个用户Crontab14.4.3. Periodic14.4.4. 启用或禁用定期任务14.4.5. 配置周期性任务的输出14.5. 配置系统日志记录14.5.1. 配置本地日志记录14.5.2. 日志设施14.5.3. 日志记录级别14.5.4. 读取日志消息14.5.5. 日志管理和轮换14.5.6. 配置远程日志记录14.5.6.1. 日志服务器配置14.5.6.2. 日志客户端配置14.5.6.3. 调试日志服务器14.5.6.4. 安全考虑14.6. 电力和资源管理14.6.1. ACPI配置14.6.2. CPU电源管理14.6.3. CPU频率控制14.6.4. Intel® Enhanced Speed Step™14.6.5. Intel Speed Shift™14.6.6. 图形卡电源管理14.6.7. 挂起/恢复14.6.7.1. 配置挂起/恢复14.6.7.2. 挂起/恢复时的故障排除14.7. 添加交换空间14.7.1. 在新硬盘或现有分区上进行交换14.7.2. 创建swap文件
FreeBSD的一个重要方面是正确的系统配置。本章解释了FreeBSD配置过程的大部分内容,包括可以设置以调整FreeBSD系统的一些参数。
在阅读本章之前,您应该:
阅读本章后,你会知道:
sysctl(8) 变量调整FreeBSD。FreeBSD在基础系统和第三方应用程序之间保持了明确的分离,因此这会影响这些应用程序的配置文件的位置。
FreeBSD基本系统配置位于 /etc 目录,/usr/local/etc 目录包含通过ports集合和包安装在系统上的应用程序的所有配置文件。
内核状态配置位于 /etc/sysctl.conf 中。在【14.2.2. sysctl 实用程序】一节中,将更详细地解释 sysctl(8) 的操作。
有关FreeBSD文件系统结构的更多信息,请参阅 hier(7) 。
一般来说,配置文件不使用必须遵循的语法标准。虽然 # 字符通常用于注释一行,并且每行都有一个配置变量,但这是真的。
xxxxxxxxxx像pkg(8)这样的一些应用程序开始使用通用配置语言(Universal ConfigurationLanguage,UCL)。Universal Configuration Language (UCL)
/etc 目录包含所有负责配置FreeBSD的FreeBSD基本系统配置文件。
xxxxxxxxxx修改/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 | 可插拔身份验证模块(Pluggable Authentication Modules,PAM)库的配置文件。 |
| /etc/periodic | 通过 cron(8) 每天、每周和每月运行的脚本,有关更多信息,请参阅 periodical(8) 。 |
| /etc/rc.d | 系统和守护进程启动/控制脚本,有关更多信息,请参阅 rc(8) 。 |
| /etc/rc.conf | 包含有关本地主机名、任何潜在网络接口的配置详细信息以及应在系统初始启动时启动哪些服务的描述性信息。更多信息参阅【14.2.4. 管理系统特定配置】 |
| /etc/security | OpenBSM审核配置文件,有关更多信息,请参阅 audit(8) 。 |
| /etc/ppp | ppp配置文件,有关更多信息,请参阅 ppp(8) 。 |
| /etc/ssh | OpenSSH配置文件,有关更多信息,请参阅 ssh(1) 。 |
| /etc/ssl | OpenSSL配置文件。 |
| /etc/sysctl.conf | 包含内核的设置。更多信息请参见【14.2.2. sysctl 实用程序】 |
sysctl(8) 实用程序用于对正在运行的FreeBSD系统进行更改。
sysctl(8) 实用程序检索内核状态,并允许具有适当权限的进程设置内核状态。要检索或设置的状态使用“管理信息库”(Management Information Base,“MIB”)样式名称进行描述,该名称被描述为一组虚线组件。
表24. 管理信息库
| 名称 | 含义 |
|---|---|
| sysctl | “Magic”数字 |
| kern | 内核功能和特性 |
| vm | 虚拟内存 |
| vfs | 文件系统 |
| net | 网络 |
| debug | 调试参数 |
| hw | 硬件 |
| machdep | 取决于机器 |
| user | 用户空间 |
| p1003_1b | POSIX 1003.1B |
sysctl(8) 的核心有两个功能:读取和修改系统设置。
要查看所有可读变量,请执行以下操作:
xxxxxxxxxx% sysctl -a输出应类似于以下内容:
xxxxxxxxxxkern.ostype: FreeBSD...vm.swap_enabled: 1vm.overcommit: 0vm.domain.0.pidctrl.kdd: 8vm.domain.0.pidctrl.kid: 4vm.domain.0.pidctrl.kpd: 3...vfs.zfs.sync_pass_rewrite: 2vfs.zfs.sync_pass_dont_compress: 8vfs.zfs.sync_pass_deferred_free: 2要读取特定变量,请指定其名称:
xxxxxxxxxx% sysctl kern.maxprockern.maxproc: 1044管理信息库(Management Information Base,MIB)是分层的,因此,指定前缀会打印出挂在上面的所有节点:
xxxxxxxxxx% sysctl netnet.local.stream.recvspace: 8192net.local.stream.sendspace: 8192net.local.dgram.recvspace: 16384net.local.dgram.maxdgram: 2048net.local.seqpacket.recvspace: 8192net.local.seqpacket.maxseqpacket: 8192net.local.sockcount: 60net.local.taskcount: 25net.local.recycled: 0net.local.deferred: 0net.local.inflight: 0net.inet.ip.portrange.randomtime: 1net.inet.ip.portrange.randomcps: 9999[...]要设置特定变量,请使用 variable=value 语法:
xxxxxxxxxx# sysctl kern.maxfiles=5000kern.maxfiles: 2088 -> 5000xxxxxxxxxx为了在重新启动后保持配置,有必要将这些变量添加到/etc/sysctl.conf文件中,如下所述。sysctl(8) 的配置文件 /etc/sysctl.conf 看起来很像 /etc/rc.conf 。
使用 variable=value 语法设置值。
xxxxxxxxxx指定值在系统进入多用户模式后设置。并非所有变量都可以在此模式下设置。例如,为了关闭致命信号退出的日志记录并防止用户看到其他用户启动的进程,可以在 /etc/sysctl.conf 中设置以下可调参数:
xxxxxxxxxxkern.logsigexit=0 security.bsd.see_other_uids=0要获取有关特定 sysctl 具有什么功能的更多信息,可以执行以下命令:
xxxxxxxxxx% sysctl -d kern.dfldsizkern.dfldsiz: Initial data size limit系统配置信息的主要位置是 /etc/rc.conf 。
此文件包含广泛的配置信息,在系统启动时读取以配置系统。它提供 rc* 文件的配置信息。
/etc/rc.conf 中的条目会覆盖 /etc/defaults/rc.conf 的默认设置。
xxxxxxxxxx不应编辑包含默认设置的/etc/defaults/rc.conf文件。相反,所有系统特定的更改都应该对/etc/rc.conf进行。在集群应用程序中可以应用多种策略,将站点范围的配置与系统特定的配置分开,以减少管理开销。
推荐的方法是将特定于系统的配置放入 /etc/rc.conf.local 。
例如,/etc/rc.conf 中的这些条目适用于所有系统:
xxxxxxxxxxsshd_enable="YES"keyrate="fast"defaultrouter="10.1.1.254"然而,/etc/rc.conf.local 中的这些条目仅适用于此系统:
xxxxxxxxxxhostname="node1.example.org"ifconfig_fxp0="inet 10.1.1.1/8"使用 rsync 或 puppet 等应用程序将 /etc/rc.conf 分发到每个系统,而 /etc/rc.conf.local 保持唯一。
升级系统不会覆盖 /etc/rc.conf ,因此系统配置信息不会丢失。
xxxxxxxxxxetc/rc.conf和/etc/rc.conf.local都由sh(1)解析。这允许系统操作员创建复杂的配置场景。有关此主题的更多信息,请参阅 rc.conf(5)FreeBSD在系统初始化和管理服务时使用启动脚本的 rc(8) 系统。
/etc/rc.d 中列出的脚本提供了基本服务,可以使用 service(8) 的 start 、 stop 和 restart 选项来控制这些服务。
基本脚本可能类似于以下内容:
x## PROVIDE: utility# REQUIRE: DAEMON# KEYWORD: shutdown. /etc/rc.subrname=utilityrcvar=utility_enablecommand="/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) 脚本的说明,请参阅 本文 。
许多用户从Ports Collection在FreeBSD上安装第三方软件,并要求在系统初始化时启动已安装的服务。
诸如 security/openssh-portable 或 www/nginx 之类的服务只是系统初始化过程中可能启动的众多软件包中的两个。本节解释了启动服务的程序。
由于 rc(8) 系统主要用于在系统启动和关闭时启动和停止服务,因此启动、停止和重新启动选项只有在设置了适当的 /etc/rc.conf 变量时才会执行其操作。
因此,启动服务的第一步,例如 www/nginx ,是通过执行以下命令将其添加到 /etc/rc.conf 中:
xxxxxxxxxx# sysrc nginx_enable="YES"然后可以执行以下命令启动nginx:
xxxxxxxxxx# service nginx startxxxxxxxxxx要启动、停止或重新启动服务,无论/etc/rc.conf中的设置如何,这些命令都应该以“one”作为前缀。例如,要启动www/nginx,而不管当前的/etc/rc.conf设置如何,请执行以下命令: # service nginx onestart也可以将服务自动放入jail,请参阅相应的【17.2.3. jails 服务】解释。
要确定服务是否正在运行,请使用 status 子命令。
例如,要验证 www/nginx 是否正在运行:
xxxxxxxxxx# service nginx statusnginx is running as pid 27871.在某些情况下,也可以重新加载(reload)服务。这试图向单个服务发送信号,迫使该服务重新加载其配置文件。
在大多数情况下,这意味着向服务发送 SIGHUP 信号。
并非所有服务都支持此功能。
rc(8) 系统用于网络服务,它也有助于大部分系统初始化。例如,当执行 /etc/rc.d/bgfsck 脚本时,它会打印出以下消息:
xxxxxxxxxxStarting background file system checks in 60 seconds.此脚本用于仅在系统初始化期间进行的后台文件系统检查。
许多系统服务依赖于其他服务才能正常运行。例如,在 rpcbind(8) 服务启动之前, yp(8) 和其他基于RPC的服务可能无法启动。
更多信息可以在 rc(8) 和 rc.subr(8) 中找到。
其他服务可以使用 inetd(8) 启动。使用 inetd(8) 及其配置在【32.2. inetd超级服务器】中有详细描述。
在某些情况下,使用 cron(8) 启动系统服务可能更有意义。这种方法有很多优点,因为 cron(8) 以 crontab(5) 的所有者身份运行这些进程。这允许普通用户启动和维护自己的应用程序。
cron(8) 的 @reboot 特性可以用来代替时间规范。这会导致作业在 cron(8) 启动时运行,通常是在系统初始化期间。
periodic —— 圆周句; 周期; 周期性; 定期; 周期性边界
在FreeBSD上,安排任务在某一天或某个时间运行是一项非常常见的任务。负责执行此任务的工具是 cron(8) 。
除了用户可以通过 cron(8) 安排的任务外,FreeBSD还执行由 periodic(8) 管理的常规后台任务。
cron(8) 实用程序在后台运行,定期检查 /etc/crontab 中要执行的任务,并在 /var/cron/tabs 中搜索自定义crontab文件。
这些文件用于安排cron在指定时间运行的任务。
crontab中的每个条目都定义了一个要运行的任务,称为 cron job 。
使用两种不同类型的配置文件:【不应修改的系统crontab】和【可以根据需要创建和编辑的用户crontab】。这些文件使用的格式记录在 crontab(5) 中。系统crontab (/etc/crontab) 的格式包含一个在用户crontab中不存在的 who 列。在系统crontab中,cron以本列中指定的用户身份运行命令。在用户crontab中,所有命令都以创建crontab的用户身份运行。
用户crontabs允许单个用户安排自己的任务。root用户还可以有一个用户crontab,可用于调度系统crontab中不存在的任务。
以下是来自系统crontab的示例条目,/etc/crontab:
xxxxxxxxxx# /etc/crontab - root's crontab for FreeBSD#①#SHELL=/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin ②##minute hour mday month wday who command ③## Save some entropy so that /dev/random can re-seed on boot.*/11 * * * * operator /usr/libexec/save-entropy ④## Rotate log files every hour, if necessary.0 * * * * root newsyslog## Perform daily/weekly/monthly maintenance.1 3 * * * root periodic daily15 4 * * 6 root periodic weekly30 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① 以 # 字符开头的行是注释。可以在文件中添加注释,提醒执行所需操作的内容和原因。注释不能与命令在同一行,否则它们将被解释为命令的一部分;他们一定在新的线路上。空白行将被忽略。
② 等号(=)字符用于定义任何环境设置。在这个例子中,它用于定义SHELL和PATH。如果省略了SHELL,cron将使用默认的Bourne SHELL。如果省略了PATH,则必须为要运行的命令或脚本提供完整路径。
③ 此行定义了系统crontab中使用的七个字段:minute(分钟)、hour(小时)、mday 、month(月份)、wday、who 和 command(命令)。
minute字段是将运行指定命令的时间(以分钟为单位)hour 是将运行特定命令的小时mday 是月份中的第几天month 是月份wday 是星期几这些字段必须是表示24小时时钟的数值,或者是表示该字段所有值的 * 。who 字段仅存在于系统crontab中,指定应以哪个用户身份运行命令。最后一个字段是要执行的命令。
④ 此条目定义了此cron作业的值。*/11 ,后面还有几个 * 字符,指定 operator 在每个小时、每天、一周中的每一天、每个月的每十一分钟调用 /usr/libexec/save-entropy 。命令可以包含任意数量的开关。但是,扩展到多行的命令需要用反斜杠 \ 连续字符打断。
要创建用户crontab,请在编辑器模式下调用 crontab :
xxxxxxxxxx% crontab -e这将使用默认文本编辑器打开用户的crontab。用户第一次运行此命令时,将打开一个空文件。一旦用户创建了crontab,此命令将打开该文件进行编辑。
将这些行添加到crontab文件的顶部是有用的,以便设置环境变量并记住crontab中字段的含义:
xxxxxxxxxxSHELL=/bin/shPATH=/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 中没有指定脚本的路径,因此给出了脚本的完整路径:
xxxxxxxxxx0 14 * * * /home/user/bin/mycustomscript.shxxxxxxxxxx在使用自定义脚本之前,请确保它是可执行的,并使用cron设置的有限环境变量集对其进行测试。要复制用于运行上述cron条目的环境,请使用:env -i SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbinHOME=/home/user LOGNAME=user /home/user/bin/mycustomscript.shcrontab(5)中讨论了cron设置的环境。如果脚本包含任何使用通配符删除文件的命令,则检查脚本在cron环境中是否正常运行尤为重要。编辑完crontab后,保存文件。它将自动安装,cron将读取crontab并在指定时间运行其cron作业。要在crontab中列出cron作业,请使用以下命令:
xxxxxxxxxx% crontab -l0 14 * * * /home/user/bin/mycustomscript.sh要删除用户crontab中的所有cron作业,请执行以下操作:
xxxxxxxxxx% crontab -rremove crontab for user? yFreeBSD提供了一组系统管理脚本,用于检查各个子系统的状态、执行安全相关检查、轮换日志文件等。这些脚本定期运行:每天、每周或每月。这些任务的管理由 periodic(8) 执行,其配置位于 periodity.conf(5) 中。周期性任务由系统crontab中的条目启动,如上所示。
由 periodic(8) 执行的脚本位于 /etc/periodity/ 中,用于基本实用程序;位于 /usr/local/etc/periodity 中,用于第三方软件。
它们被组织在4个子目录中,分别是daily(每日)、weekly(每周)、monthly(每月)和security(安全)。
FreeBSD默认启用了一些定期运行的脚本。
要启用或禁用任务,第一步是编辑 /etc/periodic.conf ,执行以下命令:
xxxxxxxxxx# ee /etc/periodic.conf然后,为了启用,例如,daily_status_zfs_enable 将以下内容放入文件中:
xxxxxxxxxxdaily_status_zfs_enable="YES"要禁用默认处于活动状态的任务,只需将 YES 更改为 NO 即可。
在 /etc/periodic.conf 中,变量 daily_output 、weekly_output 和 monthly_output 指定了脚本执行结果的发送位置。
默认情况下,周期性脚本的输出会通过电子邮件发送给root,因此最好将root的邮件或别名root读取到受监视的邮箱中。
要将结果发送到另一封电子邮件或其他电子邮件,请将用空格分隔的电子邮件地址添加到 /etc/periodic.conf :
xxxxxxxxxxdaily_output="email1@example.com email2@example.com"weekly_output="email1@example.com email2@example.com"monthly_output="email1@example.com email2@example.com"要记录定期输出而不是通过电子邮件接收,请在 /etc/periodic.conf 中添加以下行。 newyslog(8) 中添加以下行。这些文件将在适当的时间轮换:
xxxxxxxxxxdaily_output=/var/log/daily.logweekly_output=/var/log/weekly.logmonthly_output=/var/log/monthly.log生成和读取系统日志是系统管理的一个重要方面。系统日志中的信息可用于检测硬件和软件问题以及应用程序和系统配置错误。这些信息在安全审计和事件响应中也起着重要作用。大多数系统守护进程和应用程序都会生成日志条目。
FreeBSD提供了一个系统记录器 syslogd(8) 来管理日志记录。默认情况下,syslogd处于启用状态,并在系统启动时启动。
本节介绍如何为本地和远程日志记录配置FreeBSD系统记录器,以及如何执行日志轮换和日志管理。
配置文件 /etc/syslog.conf 控制syslogd在收到日志条目时对其做什么。有几个参数可以控制传入事件的处理。该设施描述了哪个子系统生成了消息,如内核或守护进程,级别描述了发生的事件的严重性。这使得可以根据设施和级别配置是否以及在何处记录日志消息。还可以根据发送消息的应用程序采取行动,在远程日志记录的情况下,还可以根据生成日志记录事件的机器的主机名采取行动。
此配置文件每个操作包含一行,其中每行的语法是一个选择器字段,后面是一个操作字段。选择器字段的语法是 facility.level ,它将匹配来自级别或更高级别设施的日志消息。还可以在级别之前添加一个可选的比较标志,以更精确地指定记录的内容。多个选择器字段可用于同一操作,并用分号(;)分隔。使用 * 将匹配所有内容。操作字段表示将日志消息发送到何处,例如发送到文件或远程日志主机。
例如,这是FreeBSD的默认 /etc/syslog.conf:
xxxxxxxxxx# 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 ①*.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err /var/log/messagessecurity.* /var/log/securityauth.info;authpriv.info /var/log/auth.logmail.info /var/log/maillog ②cron.* /var/log/cron!-devd*.=debug /var/log/debug.log ③*.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 ④!*include /etc/syslog.dinclude /usr/local/etc/syslog.derr 或更高的消息,以及 kern.warning 、auth.notice 和 mail.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) 。
设施(facility)描述了生成消息的系统部分。设施是一种分离不同消息的方法,使用户更容易查阅日志。
表25. 日志设施
| 名称 | 描述 |
|---|---|
| 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 | 行式打印机假脱机(spooling)系统:lpr(1)、lpc(8)、lpd(8) 等。 |
| 邮件系统。 | |
| mark | 该设施每20分钟增加一条记录。 |
| news | 网络新闻系统。 |
| ntp | 网络时间协议系统。 |
| security | 安全子系统,如 ipfw(4) 。 |
| syslog | syslogd(8) 内部生成的消息。 |
| user | 由随机用户进程生成的消息。如果没有指定,这是默认的设施标识符。 |
| uucp | Unix到Unix复制系统(Unix-to-Unix Copy system)。一个古老的协议。看到这个设施的消息真的很奇怪。 |
| local0 到 local7 | 保留供当地使用。 |
该级别描述了消息的严重性,是以下顺序列表中的关键字(从高到低):
表26. 日志记录级别
| 名称 | 描述 |
|---|---|
| emerg | 恐慌(panic)状态。这通常会向所有用户广播。 |
| alert | 应立即纠正的情况,如系统数据库损坏。 |
| crit | 关键(critical)条件,例如硬件设备错误。 |
| err | 错误(errors)。 |
| warning | 警告信息。 |
| notice | 不是错误条件,但可能需要特殊处理的条件。 |
| info | 信息性消息。 |
| debug | 包含通常仅在调试程序时使用的信息的消息。 |
| none | 此特殊级别禁用特定设施。 |
默认情况下,FreeBSD日志文件使用 rfc3164 格式,也称为 BSD syslog协议 。在syslog(8) 中了解更多关于其他格式以及如何使用它们的信息。
通常,日志具有以下语法:
xxxxxxxxxxdate time hostname program[pid]: the message/var/log/cron 文件的输出将用作示例:
xxxxxxxxxx[...]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/saveentropy)[...]通过运行以下命令,可以在 syslog(8) 中启用详细日志记录,从而添加每条消息的设施和级别:
xxxxxxxxxx# sysrc syslogd_flags="-vv"一旦激活该功能,设施和级别将显示在日志中,如下例所示:
xxxxxxxxxx[...]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)[...]日志文件可能会快速增长,占用磁盘空间,使查找有用信息变得更加困难。
在FreeBSD中,newsyslog(8) 用于管理日志文件,并试图减轻这种情况。
此内置程序会定期旋转(rotates)和压缩日志文件,并可选择在移动日志文件时创建丢失的日志文件和向程序发送信号。
xxxxxxxxxx由于newsyslog是从 cron(8) 运行的,因此它不能比从cron。在默认配置中,它每小时运行一次。以下是FreeBSD中的默认配置,更多信息请参阅 newsyslog.conf(5) :
xxxxxxxxxx# 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/[!.]*.conflogfilename
要存档的系统日志文件的名称。
[owner:group]
此可选字段指定存档文件的所有者和组。
mode
指定日志文件和存档的文件模式。有效模式位为0666。(也就是说,可以为所有者、组和其他人指定轮换日志的读写权限。)
count
指定可能存在的存档文件的最大数量。
size
当日志文件的大小达到以千字节为单位的大小时,日志文件将如上所述进行修剪。如果此字段包含星号(*),则不会根据大小修剪日志文件。
when
由间隔(interval)、特定时间或两者组成。newsyslog.conf(5) 中支持的选项。
flags
表示newsyslog接受的标志,newsyslog.conf(5) 中支持的选项。
[/pid_file]
此可选字段指定包含守护进程进程ID的文件名,或查找组进程ID。
[sig_num]
此可选字段指定将发送到守护进程的信号。
xxxxxxxxxx最后两个字段是可选的,指定进程的进程ID(PID)文件的名称以及文件旋转时发送给该进程的信号号。随着系统数量的增加,监视多个主机的日志文件可能会变得难以操作。配置集中式日志记录可以减轻日志文件管理的一些管理负担。
在FreeBSD中,可以使用syslogd和newsyslog配置集中式日志文件聚合、合并和轮换。
本节演示了一个示例配置,其中名为 logserv.example.com 的主机 A 将收集本地网络的日志信息。
名为 logclient.example.com 的主机 B 将被配置为将日志信息传递给日志服务器。
日志服务器是一个已配置为接受来自其他主机的日志信息的系统。
在配置日志服务器之前,请检查以下内容:
在日志服务器上,编辑 /etc/syslog.conf 以指定要从中接收日志条目的客户端名称、要使用的日志记录工具以及存储主机日志条目的日志名称。此示例添加了 B 的主机名,记录了所有设施,并将日志条目存储在 /var/log/logclient.log 中。
示例22. 日志服务器配置示例
xxxxxxxxxx+logclient.example.com*.* /var/log/logclient.log添加多个日志客户端时,为每个客户端添加类似的两行条目。有关可用设施的更多信息,请参阅 syslog.conf(5) 。
接下来,执行以下命令:
xxxxxxxxxx# sysrc syslogd_enable="YES"# sysrc syslogd_flags="-a logclient.example.com -v -v"第一个条目在系统启动时启动syslogd。第二个条目允许来自指定客户端的日志条目。 -v -v 增加了日志消息的冗长程度。这对于调整设施非常有用,因为管理员能够看到每个设施下记录的消息类型。
多个 -a 选项可以指定允许从多个客户端进行日志记录。也可以指定IP地址和整个网络块。有关可能选项的完整列表,请参阅 syslogd(8) 。
最后,创建日志文件:
xxxxxxxxxx# touch /var/log/logclient.log此时,应重新启动并验证 syslogd :
xxxxxxxxxx# service syslogd restart# pgrep syslog如果返回PID,则服务器已成功重新启动,客户端配置可以开始。如果服务器没有重新启动,请查阅 /var/log/messages 以了解错误。
日志客户端将日志条目发送到网络上的日志服务器。客户端还保留自己日志的本地副本。
配置日志服务器后,在日志客户端上执行以下命令:
xxxxxxxxxx# sysrc syslogd_enable="YES"# sysrc syslogd_flags="-s -v -v"第一个条目在启动时启用syslogd。第二个条目阻止此客户端接受来自其他主机(-s)的日志,并增加了日志消息的详细程度。
接下来,在客户端的 /etc/syslog.conf 中定义日志服务器。在这个例子中,所有记录的设施都被发送到具有指定主机名的远程系统,用 @ 符号表示:
xxxxxxxxxx*.* @logserv.example.com保存编辑后,重新启动syslogd以使更改生效:
xxxxxxxxxx# service syslogd restart要测试日志消息是否通过网络发送,请在客户端上使用 logger(1) 向syslogd发送消息:
xxxxxxxxxx# logger "Test message from logclient"此消息现在应该同时存在于客户端的 /var/log/messages 和日志服务器的 /var/log/logclient.log 中。
如果日志服务器上没有收到任何消息,则原因很可能是网络连接问题、主机名解析问题或配置文件中的拼写错误。要隔离原因,请确保日志服务器和日志客户端都能够使用其 /etc/rc.conf 中指定的主机名相互 ping 。如果失败,请检查网络布线、防火墙规则集以及DNS服务器或日志服务器和客户端上的 /etc/hosts 中的主机名条目。重复此操作,直到两台主机的 ping 都成功为止。
如果 ping 在两台主机上都成功,但仍然没有收到日志消息,请暂时增加日志的详细程度以缩小配置问题。在下面的示例中,日志服务器上的 /var/log/logclient.log 为空,日志客户端上的 /var/log/messages 没有指出失败的原因。
要增加调试输出,请编辑日志服务器上的 syslogd_flags 条目并重新启动:
xxxxxxxxxx# sysrc syslogd_flags="-d -a logclient.example.com -v -v"# service syslogd restart重启后,控制台上将立即闪烁与以下类似的调试数据:
xxxxxxxxxxlogmsg: pri 56, flags 4, from logserv.example.com, msg syslogd: restartsyslogd: restartedlogmsg: pri 6, flags 4, from logserv.example.com, msg syslogd: kernel boot file is /boot/kernel/kernelLogging to FILE /var/log/messagessyslogd: kernel boot file is /boot/kernel/kernelcvthname(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 。修复拼写错误,重新启动并验证结果:
xxxxxxxxxx# service syslogd restartlogmsg: pri 56, flags 4, from logserv.example.com, msg syslogd: restartsyslogd: restartedlogmsg: pri 6, flags 4, from logserv.example.com, msg syslogd: kernel boot file is/boot/kernel/kernelsyslogd: kernel boot file is /boot/kernel/kernellogmsg: pri 166, flags 17, from logserv.example.com,msg Dec 10 20:55:02 <syslog.err> logserv.example.com syslogd: exiting on signal 2cvthname(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: Testmessage 2Logging to FILE /var/log/logclient.logLogging to FILE /var/log/messages此时,消息已被正确接收并放置在正确的文件中。
与任何网络服务一样,在实现日志服务器之前,应该考虑安全要求。日志文件可能包含有关本地主机上启用的服务、用户帐户和配置数据的敏感数据。从客户端发送到服务器的网络数据将不会被加密或密码保护。如果需要加密,可以考虑使用 security/stennel ,它将通过加密隧道传输日志数据。
本地安全也是一个问题。日志文件在使用过程中或日志轮换后未加密。本地用户可以访问日志文件,以进一步了解系统配置。对日志文件设置适当的权限至关重要。内置的日志旋转器newsyslog支持对新创建和旋转的日志文件设置权限。将日志文件设置为模式 600 应防止本地用户进行不必要的访问。有关更多信息,请参阅 newsyslog.conf(5) 。
以有效的方式利用硬件资源很重要。电源和资源管理允许操作系统监视系统限制,并可能运行由与这些限制相关的事件触发的一些操作。
在FreeBSD上,这些资源的管理由 acpi(4) 内核设备管理。
xxxxxxxxxx在FreeBSD中,acpi(4)驱动程序默认在系统启动时加载。启动后无法卸载此驱动程序,因为系统总线将其用于各种硬件交互。除了 acpi(4) 之外,FreeBSD还为各种ACPI供应商子系统提供了几个专用的内核模块。这些模块将添加一些额外的功能,如风扇速度、键盘背光或屏幕亮度。
可以通过运行以下命令获得列表:
xxxxxxxxxx% ls /boot/kernel | grep acpiacpi_asus.koacpi_asus_wmi.koacpi_dock.koacpi_fujitsu.koacpi_hp.koacpi_ibm.koacpi_panasonic.koacpi_sony.koacpi_toshiba.koacpi_video.koacpi_wmi.kosdhci_acpi.kouacpi.ko例如,如果使用IBM/Lovo笔记本电脑,则有必要通过执行以下命令加载模块 acpi_ibm(4) :
xxxxxxxxxx# kldload acpi_ibm并将此行添加到 /boot/loder.conf 中,以便在引导时加载它:
xxxxxxxxxxacpi_ibm_load="YES"acpi_video(4) 模块的替代方案是 backlight(9) 驱动器。它提供了一种处理面板背光的通用方法。默认的GENERIC内核包含此驱动程序。 backlight(9) 实用程序可用于查询和调整面板背光的亮度。在这个例子中,亮度降低了10%:
xxxxxxxxxx% backlight decr 10CPU是系统中最消耗的部分。为了节约能源,了解如何提高CPU效率是我们系统的基本组成部分。
为了以正确的方式正确使用机器的资源,FreeBSD通过使用 powerd(8) 和 cpufreq(4) 支持Intel Turbo Boost、AMD Turbo Core、Intel Speed Shift等技术。
第一步是通过执行以下命令获取CPU信息:
xxxxxxxxxx% sysctl dev.cpu.0 ①0 位数字表示CPU的第一个核心。输出应类似于以下内容:
xxxxxxxxxxdev.cpu.0.cx_method: C1/mwait/hwc C2/mwait/hwc C3/mwait/hwc/bmadev.cpu.0.cx_usage_counters: 3507294 0 0dev.cpu.0.cx_usage: 100.00% 0.00% 0.00% last 3804usdev.cpu.0.cx_lowest: C3 ①dev.cpu.0.cx_supported: C1/1/1 C2/2/1 C3/3/57 ②dev.cpu.0.freq_levels: 2267/35000 2266/35000 1600/15000 800/12000 ③dev.cpu.0.freq: 1600 ④dev.cpu.0.temperature: 40.0C ⑤dev.cpu.0.coretemp.throttle_log: 0dev.cpu.0.coretemp.tjmax: 105.0Cdev.cpu.0.coretemp.resolution: 1dev.cpu.0.coretemp.delta: 65dev.cpu.0.%parent: acpi0dev.cpu.0.%pnpinfo: _HID=none _UID=0 _CID=nonedev.cpu.0.%location: handle=\_PR_.CPU0dev.cpu.0.%driver: cpudev.cpu.0.%desc: ACPI CPUxxxxxxxxxx如果未显示温度信息,请加载coretemp(4)模块。如果使用AMD CPU,请加载amdtemp(4)模块。一旦CPU信息可用,配置节能的最简单方法是让 powerd(8) 接管。
在 /etc/rc.conf 中启用 powerd(8) 服务,以便在系统启动时启动:
xxxxxxxxxx# sysrc powerd_enable=YES还需要向 powerd(8) 指示某些参数,以告诉它如何管理执行以下命令的CPU的状态:
xxxxxxxxxx# sysrc powerd_flags="-a hiadaptive -i 25 -r 85 -N"-a:选择使用交流电源时使用的模式。hiadaptive:操作模式。更多信息请访问 powerd(8) 。-i:指定自适应模式应开始降低性能以节省功耗时的CPU负载百分比级别。-r:指定CPU负载百分比级别,自适应模式应考虑CPU运行并提高性能。-N:为了计算负载,将 nice 时间视为空闲时间;即,如果CPU只忙于 nice 进程,则不要增加CPU频率。然后启用执行以下命令的服务:
xxxxxxxxxx# service powerd startFreeBSD包含一个通用的 cpufreq(4) 驱动程序,允许管理员或 powerd(8) 和 sysutils/powerdxx 等软件管理CPU的频率,以实现性能和经济性之间的理想平衡。较低的设置将节省电力,同时减少CPU产生的热量。更高的设置将以使用额外的功率和产生更多的热量为代价来提高性能。
Intel®Enhanced Speed Step™驱动程序 est(4) 取代了提供此功能的CPU的通用 cpufreq(4) 驱动程序。CPU频率可以使用 sysctl(8) 或 /etc/rc.d/power_profile 启动脚本进行静态调整。其他软件,如 powerd(8) 或 sysutils/powerdxx ,可用于根据处理器利用率自动调整CPU频率。
通过检查 sysctl(3) 树,可以列出每个支持的频率及其预期功耗:
xxxxxxxxxx# sysctl dev.cpufreq.0.freq_driver dev.cpu.0.freq_levels dev.cpu.0.freq输出应类似于以下内容:
xxxxxxxxxxdev.cpufreq.0.freq_driver: est0dev.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/10550dev.cpu.0.freq: 800频率比CPU的最大频率高1 MHz表示Intel®Turbo Boost™功能。
升级到FreeBSD 13时,运行较新Intel®CPU的用户可能会发现动态频率控制存在一些差异。某些SKU上提供的Intel®Speed Shift™功能集的新驱动程序,使硬件能够动态改变核心频率,包括基于每个核心的频率。FreeBSD 13附带了 hwpstate_intel(4) 驱动程序,可以在配备的CPU上自动启用Speed Shift™控制,取代旧的Enhanced Speed Step™ est(4) 驱动器。 sysctl(8) dev.cpufreq.%d.freq_driver 将指示系统是否正在使用速度换档。
要确定正在使用哪种频率控制驱动器,请检查 dev.cpufreq.0.freq_driver oid。
xxxxxxxxxx# sysctl dev.cpufreq.0.freq_driverdev.cpufreq.0.freq_driver: hwpstate_intel0这表示新的 hwpstate_intel(4) 驱动程序正在使用中。在这种系统上,oid dev.cpu.%d.freq_levels 将仅显示最大CPU频率,并表示功耗级别为 -1 。
当前的CPU频率可以通过检查 dev.CPU.%d.freq oid来确定。
xxxxxxxxxx# sysctl dev.cpu.0.freq_levels dev.cpu.0.freq输出应类似于以下内容:
xxxxxxxxxxdev.cpu.0.freq_levels: 3696/-1dev.cpu.0.freq: 898有关更多信息,包括如何平衡性能和能源使用,以及如何禁用此驱动程序,请参阅手册页 hwpstate_intel(4) 。
xxxxxxxxxx习惯使用powerd(8)或sysutils/powerdxx的用户会发现这些实用程序已被hwpstate_intel(4) 驱动程序取代,不再按预期工作。近年来,图形卡已成为计算的基本组成部分。某些图形卡的功耗可能过高。FreeBSD允许某些配置来提高功耗。
如果使用带有 graphics/drm-kmod 驱动程序的Intel®图形卡,可以将这些选项添加到 /boot/loader.conf 中:
xxxxxxxxxxcompat.linuxkpi.fastboot=1 ①compat.linuxkpi.enable_dc=2 ②compat.linuxkpi.enable_fbc=1 ③① 尝试在启动时跳过不必要的模式设置。 ② 启用节能显示C状态。 ③ 启用帧缓冲区压缩以节省功耗
挂起/恢复(suspend/resume)功能允许机器保持在没有大能耗的状态,并允许系统在不失去运行程序状态的情况下恢复。
xxxxxxxxxx为了使挂起/恢复功能正常工作,必须在系统上加载图形驱动程序。在非KMS支持的图形卡中,必须使用sc(4),以免中断挂起/恢复功能。有关使用哪个驱动程序以及如何配置它的更多信息,请参阅【5. X Window系统】一章。acpi(4) 支持下一个睡眠状态列表:
表27. 支持的睡眠状态
| 状态 | 描述 |
|---|---|
| S1 | 快速挂接到RAM。CPU进入低功耗状态,但大多数外围设备仍在运行。 |
| S2 | 功率状态低于S1,但具有相同的基本特性。许多系统不支持。 |
| S3(休眠模式) | 挂起到RAM。大多数设备都已断电,系统停止运行,内存刷新除外。 |
| S4(冬眠) | 挂起到磁盘。所有设备均已断电,系统停止运行。恢复时,系统会像冷启动一样启动。FreeBSD尚不支持。 |
| S5 | 系统干净地关闭并断电。 |
第一步是知道哪种类型的睡眠状态支持我们正在使用的硬件执行以下命令:
xxxxxxxxxx% sysctl hw.acpi.supported_sleep_statehw.acpi.supported_sleep_state: S3 S4 S5xxxxxxxxxx如上所述,FreeBSD还不支持S4状态。acpiconf(8) 可用于通过运行以下命令检查S3状态是否正常工作,如果成功,屏幕应变黑,机器将关闭:
xxxxxxxxxx# acpiconf -s 3在绝大多数情况下,挂起/恢复功能希望在笔记本电脑上使用。
通过在 /etc/sysctl.conf 文件中添加以下行,FreeBSD可以配置为在关闭盖子时进入S3状态。
xxxxxxxxxxhw.acpi.lid_switch_state=S3为了使Suspend和Resume函数在FreeBSD上以最佳方式正常工作,已经做了很多努力。但目前,挂起和恢复功能仅在某些特定的笔记本电脑上正常工作。
如果它不能正常工作,可以进行一些检查。
在某些情况下,关闭蓝牙就足够了。在其他情况下,为图形卡加载正确的驱动程序就足够了。
如果它不能正常工作,可以在FreeBSD Wiki的 Suspend/Resume部分找到一些提示。
有时FreeBSD系统需要更多的交换空间。本节介绍两种增加交换空间的方法:将交换添加到现有分区或新硬盘驱动器,以及在现有文件系统上创建交换文件。
有关如何加密交换空间、存在哪些选项以及为什么应该这样做的信息,请参阅【20.13. 加密Swap】。
添加新的驱动器进行交换比在现有驱动器上使用分区具有更好的性能。设置分区和驱动器在【20.2. 添加硬盘】中进行了说明,而【2.6.1. 设计分区布局】则讨论了分区布局和交换分区大小的考虑因素。
xxxxxxxxxx可以使用当前未挂载的任何分区,即使它已经包含数据。在包含数据的分区上使用swapon将覆盖并销毁该数据。在运行swapon之前,确保要添加为swap的分区确实是预期的分区。swapon(8) 可用于向执行以下命令的系统添加交换分区:
xxxxxxxxxx# swapon /dev/ada1p2要在启动时自动添加此交换分区,请在 /etc/fstab 中添加一个条目:
xxxxxxxxxx/dev/ada1p2 none swap sw 0 0有关 /etc/fstab 中条目的说明,请参阅 fstab(5) 。
这些示例创建了一个名为 /usr/swap0 的512M交换文件。
xxxxxxxxxx强烈建议不要在ZFS文件系统上交换文件,因为交换可能会导致系统挂起。第一步是创建交换文件:
xxxxxxxxxx# dd if=/dev/zero of=/usr/swap0 bs=1m count=512第二步是对新文件赋予适当的权限:
xxxxxxxxxx# chmod 0600 /usr/swap0第三步是通过在 /etc/fstab 中添加一行来通知系统交换文件:
xxxxxxxxxxmd none swap sw,file=/usr/swap0,late 0 0系统启动时将添加交换空间。要立即添加交换空间,请使用 swapon(8) :
xxxxxxxxxx# swapon -aL