我们有一台 Linux 机器(Redhat 6)
当我们打印所有参数时,/etc/sysctl.conf
我们只能看到大约 20 个,但当我们执行时,sysctl -a
我们会看到超过 200 个。
那么从哪里sysctl -a
打印所有这些参数呢?
或者例如当我们这样做时
sysctl -w variable=value
如何知道变量应该保存在哪里?
如何知道每个参数是动态的还是静态的?
答案1
系统控制寄存器设置存储在内核中。这些设置会影响内核行为;基本上,它们是系统上运行的程序可以读取和写入的内核变量。
当内核启动时,每个 sysctl 设置都有一个默认值。该值可以通过命令等程序随时更改sysctl
,或者在 Linux 下通过写入/proc/sys
.
该文件/etc/sysctl.conf
不会在运行时确定设置的值。它仅在启动时使用,以更改编译到内核中的默认值的某些设置。如果您对 进行了一些更改/etc/sysctl.conf
,则可以通过重新启动 sysctl“服务”来将它们作为一个整体应用 - sysctl 服务不对应于正在运行的进程,它是一个伪服务,仅在以下情况下将设置加载到内核中:开始。
如果您想更改设置以便在重新启动后保留该值,请将其添加到/etc/sysctl.conf
.要临时应用设置或尝试设置,请使用sysctl
或echo … >/proc/sys/…
。
答案2
如何知道每个参数是动态的还是静态的?
中的所有内核参数sysctl
都是动态的。当你根据你的内核版本检查这个数字时,sysctl -a | wc -l
它应该超过 1000。
要读取这些值,您有几个智能选项:
sysctl net.ipv4.ip_forward # display specific parameter
sysctl net.ipv4 # display all net.ipv4.* parameters
sysctl -a # display all parameters
要持久写入值,您可以使用目录/etc/sysctl.conf
中的任何conf文件/etc/sysctl.d/
,一旦更新conf文件,您需要重新加载配置文件。
sysctl -p [filename]
当然,您可以sysctl
按照 Gilles 的概述重新启动“服务”。
sysctl -a 从哪里打印所有内核参数?
来自伪文件系统 procfs (man procfs)。它提供了内核数据结构的接口。它通常/proc
由系统自动安装。