找出 sysctl 默认值? (无需重启)

找出 sysctl 默认值? (无需重启)

net.core.rmem_max我已经修改了with的值sysctl,现在我想将其设置回默认值。

如果我重新启动,net.core.rmem_max将返回到其默认值(因为它没有在 中被覆盖/etc/sysctl.conf),但是我可以在不重新启动的情况下知道这个值吗?

理想情况下,我应该sysctl net.core.rmem_max在修改它之前运行读取该值,但我忘记了......

答案1

这通常是不可能的:内核不会保留原始值(至少在 Linux 下不会,对于其他 UNIX 变体来说可能也是如此)。设置的值存储在变量中;当您更改设置时,包含变量的内存将被不可逆转地更新。

对于大多数设置,变量的初始值是在编译时确定并存储在内核二进制文件中的常量。因此,原则上您可以检查内核二进制文件以查找默认值。您必须找到与您感兴趣的设置相对应的符号,并跟踪内核二进制文件中该符号的地址。在虚拟机中启动内核会减少工作量。

对于大多数设置,您可以查看内核源代码 -kernel/sysctl.c和其他文件。你会看到类似的定义

    {
            .procname       = "rmem_max",
            .data           = &sysctl_rmem_max,
    },

(在net/core/sysctl_net_core.c),从中您可以跟踪初始化sysctl_rmem_max多变的。虽然这个是从常量初始化的,但需要大量阅读 C 代码才能扩展。

答案2

在我的 OpenBSD 机器上,/etc/sysctl.conf 列出了一堆默认的 sysctl 值,但这个列表并不详尽。

也许最好的方法是阅读 sysctl 代码或向运行相同操作系统的朋友询问他的值:)

相关内容