这篇文章的目的是解释如何使用 sysctl 实用程序在 Red Hat (RHEL/CentOS) 和 Oracle Linux (OL) 系统上配置内核参数。
sysctl 实用程序 (/sbin/sysctl) 允许(特权)用户在运行时查询和修改内核参数。
该实用程序对于大多数 Linux 发行版都是通用的,但是,发行版之间可能存在细微的差异,例如RHEL/OL 和 SuSE。
可以查看/修改的参数是那些通过 procfs 文件系统 /proc/sys 公开的参数。
在配置文件中设置时使用点(“.”)符号。
查询所有内核参数
要查询所有内核参数值,请使用“-a”参数运行 systctl 实用程序,例如:
# sysctl -a | more kernel.sched_child_runs_first = 0 kernel.sched_min_granularity_ns = 4000000 kernel.sched_latency_ns = 20000000 kernel.sched_wakeup_granularity_ns = 4000000 kernel.sched_tunable_scaling = 1
我们可以在上面的输出中搜索特定的内核参数。
使用正则表达式过滤出一组内核参数。
例如,
# sysctl -a | grep ^kernel.s[h,e]m kernel.shmmax = 68719476736 kernel.shmall = 4294967296 kernel.shmmni = 4096 kernel.shm_rmid_forced = 0 kernel.sem = 250 32000 100 128
CentOS/RHEL 7下永久设置内核参数
CentOS/RHEL 7 下设置内核参数的方法与旧版本略有不同。
在 /etc/sysctl.d/ 目录下新建一个 conf 文件。
文件名采用 /etc/sysctl.d/[name].conf 格式。
/etc/sysctl.d/ 目录中的文件是按顺序解析的,因此建议在文件名前面加上一个数字,表示我们希望解析文件的顺序。
例如,/etc/sysctl.d/ 01-custom.conf:
# cat /etc/sysctl.d/01-custom.conf net.ipv4.ip_forward=1 net.ipv4.ip_local_port_range="1025 65535"
要让系统立即应用新/更新的 /etc/sysctl.d 文件中的值,请运行 sysctl -p [filename]:
# sysctl -p /etc/sysctl.d/01-custom.conf
永久设置内核参数
使用“systctl -w”方法更改的内核参数值是不稳定的,例如:服务器重启时丢失。
sysctl 实用程序的配置文件 /etc/sysctl.conf 应该用于永久存储非默认内核参数值。
该文件在服务器启动时解析,其中的值用于配置内核。
使用 /etc/sysctl.conf 文件配置内核参数所需的语法遵循 component.parameter=value 符号,例如内核.shmmax = 33554432.
语法
# vi /etc/sysctl.conf [component].[parameter]=[value]
以下是一个示例 /etc/sysctl.conf 文件:
# grep -v ^# /etc/sysctl.conf net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 ....
除了使用“systctl -w”方法修改内核参数外,还可以通过将参数添加到 /etc/sysctl.conf 文件来修改参数,然后使用带有“-p”参数的 sysctl 实用程序解析文件,例如:
# sysctl -n kernel.ctrl-alt-del 0
# echo "kernel.ctrl-alt-del=1" >> /etc/sysctl.conf
# sysctl -p kernel.ctrl-alt-del = 1
通过将内核参数添加到 /etc/sysctl.conf 文件来修改内核参数不仅可以设置它们 (sysctl -p),还可以确保修改后的值在服务器重新启动后仍然存在。
查询特定的内核参数
要查询命名的内核参数值,请使用“-n”或者根本不带参数运行 sysctl 实用程序,例如:
# sysctl kernel.shmmax kernel.shmmax = 68719476736
# sysctl -n kernel.shmmax 68719476736
在上面的例子中,参数 kernel.shmmax 与 /proc/sys/kernel/shmmax 相关,例如:
# cat /proc/sys/kernel/shmmax 68719476736
立即设置内核参数(临时)
要立即(非持久)设置 sysctl 参数值,请使用 sysctl -w 命令。
例如 :
# sysctl -w kernel.sysrq=0 kernel.sysrq = 0
采用多个值的参数应将值括在引号中。
例如,将 net.ipv4.ip_local_port_range 设置为 1025-65535:
# sysctl -w net.ipv4.ip_local_port_range="1025 65535"
或者,可以将值直接回显到表示 sysctl 参数的 procfs 文件中。
例如:
# echo 1 > /proc/sys/net/ipv4/ip_forward # echo "1025 65535" > /proc/sys/net/ipv4/ip_local_port_range