UP | HOME

Sysctl工具

Table of Contents

sysctl(8) 实用程序用于检索和设置当前运行的 FreeBSD 系统内核状态

本节涵盖 sysctl 命令用法与 sysctl.conf 的配置方法

sysctl(8) 工具可以检索内核状态,并为具有适当权限的进程设置内核状态

读取内核状态变量

sysctl 命令支持读取和写入内核状态变量。要查看所有可读取的变量:

$ sysctl -a

输出类似如下内容:

kern.ostype: FreeBSD
kern.osrelease: 16.0-CURRENT
kern.osrevision: 199506
kern.version: FreeBSD 16.0-CURRENT #0 main-n285005-e9fc0c538264: Mon Apr 13 12:44:54 UTC 2026
    root@releng3.nyi.freebsd.org:/usr/obj/usr/src/amd64.amd64/sys/GENERIC

kern.maxvnodes: 184403
kern.maxproc: 9428
kern.maxfiles: 129441
kern.argmax: 524288
kern.securelevel: -1
kern.hostname: ykla
kern.hostid: 4270621168
kern.clockrate: { hz = 100, tick = 10000, profhz = 8128, stathz = 127 }

……省略其他输出……

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

$ sysctl kern.maxproc

输出类似于以下内容:

kern.maxproc: 9428

使用管理信息库表读取内核状态变量

sysctl 基于管理信息库(MIB)风格的 ASCII 名称标识

Table 1: 管理信息库表
sysctl 说明
kern 内核功能和特性
vm 虚拟存储器
vfs 文件系统
net 网络
debug 调试参数
hw 硬件
machdep 机器相关
user 用户空间
p1003_1b POSIX 1003.1B

管理信息库(MIB)是分层的,因此指定特定前缀将列出它下面的所有节点:

$ sysctl net

输出类似于以下内容:

net.local.stream.recvspace: 65536
net.local.stream.sendspace: 65536
net.local.dgram.recvspace: 16384
net.local.dgram.maxdgram: 8192
net.local.seqpacket.recvspace: 65536
net.local.seqpacket.maxseqpacket: 65536
net.local.sockcount: 19
net.local.taskcount: 9

……省略其他输出……

sysctl 工具相关文件结构

/
└── etc/
    ├── rc.d/
    │   ├── sysctl               # rc(8) 脚本,处理 sysctl.conf,在系统过渡到多用户模式早期执行
    │   └── sysctl_lastload      # rc(8) 脚本,处理 sysctl.conf,在系统接近多用户模式时执行
    ├── sysctl.conf              # sysctl(8) 的初始设置
    ├── sysctl.conf.local        # 机器特定设置,用于共享 /etc/sysctl.conf 的位置(默认不存在)
    └── sysctl.kld.d/            # 内核模块特定设置,用于通过 rc.subr(8) 加载的模块(默认为空目录)

系统启动时, /etc/rc.d/sysctl 脚本加载 /etc/sysctl.conf 文件:

不建议直接修改 /etc/sysctl.conf 文件

如需自定义配置,应使用 /etc/sysctl.conf.local 文件扩展本地配置,避免系统更新时配置被覆盖

配置文件

系统进入多用户模式时读取 /etc/sysctl.conf 文件,用于设置内核的默认配置。格式看起来类似于 /etc/rc.conf。基本系统默认的 /etc/sysctl.conf 文件实际上是空文件:

#  此文件在系统进入多用户模式时读取,其内容通过 sysctl 管道传递以调整内核值
#  详情参见 man 5 sysctl.conf


#  取消注释此行可以防止用户查看由其他 UID 运行的进程信息
#security.bsd.see_other_uids=0
虽然 /etc/sysctl.conf 文件实质上为空,但这不代表系统默认的 sysctl 参数为空

它们是通过不同的宏(如 SYSCTL_INT)注入到系统中的!

使用命令 sysctl -a 可列出当前系统所有默认的参数值

设置内核状态变量

要设置特定变量:

sysctl 管理信息标识符=值

示例:

$ sysctl kern.maxfiles=9500
注意:指定的值会在系统进入多用户模式后设置。并非所有变量都可以在此模式下设置

输出类似于以下内容:

kern.maxfiles: 9428 -> 9500
注意: 为了在重启后保持配置,必须将这些变量添加到 /etc/sysctl.conf 文件中

例如,要关闭致命信号退出的日志记录,并防止用户查看其他用户启动的进程,可以在 /etc/sysctl.conf 文件中设置以下参数:

# 不记录致命信号退出(例如,sig 11)
kern.logsigexit=0

# 防止用户查看由其他 UID 启动的进程信息。
security.bsd.see_other_uids=0
Next: 系统恢复 Previous: 驱动参数 Home: 系统管理