我正在 Hetzner Cloud 的 Debian 12 VPS 上设置 Netdata。预检的一部分是确保将两个文件/sys/kernel/mm/ksm/
设置为所需的值:
/sys/kernel/mm/ksm/run
应该是1
;目前是0
。/sys/kernel/mm/ksm/sleep_millisecs
应该是1000
;目前是20
。
我的路线rm
-> echo
+ tee
-> chown
->chmod
在第一步就失败了,因为我无权提交rm -f
任何文件:
$ sudo rm -f /sys/kernel/mm/ksm/run
rm: cannot remove '/sys/kernel/mm/ksm/run': Operation not permitted
sed
就地使用也会失败Permission denied
。
/sys/kernel/mm/ksm/
请问对 进行持久更改的最安全/最明智的方法是什么?
/sys
是一个合成文件系统,不与系统上的任何持久存储相关联。本质上,它只是伪造的对内核内部的一堆文件的访问。这意味着写入其中的任何内容都不会在重新启动后保留下来,您需要确保每次重新启动时都会应用您想要进行的任何更改。用户空间也不能(直接)在那里创建或删除文件;如果您想要文件中的新值,只需将新值回显到该文件即可。您也不应该随意修改那里的内容的权限(这很可能以意想不到的方式破坏事情)。有时,可以从
/sys
内核命令行更改某些参数的默认值。例如,transparent_hugepage
可用于设置初始值/sys/kernel/mm/transparent_hugepage/enabled
。但是,据我所知,KSM 没有任何相关的内核命令行选项。在理想情况下,您将为系统的服务管理器编写一个服务文件,该文件在启动时设置所需的参数(并且,在更理想的情况下,在停止时将它们重置为默认值,因为这样可以更容易地测试)。
但是,如果您不想采用正确的基于服务的方法,那么在大多数 Linux 发行版上都有一种更简单的方法。所有基于 systemd 的系统以及少数不基于 systemd 的系统都使用它
systemd-tmpfiles
来管理诸如创建所需临时目录之类的事情。而且,相当有用的是,它可以做的一件事是将任意数据写入任意文件。您可以创建一个名为的文件,ksm.conf
其中/etc/tmpfiles.d
包含以下内容,以便在每次系统启动时写出您在原始问题中要求的特定值(理论上,每次systemd-tmpfiles
运行该--create
选项时也是如此):第一个字符表示要做什么(
f
表示创建或更新文件),第二个字段是要创建/修改的具体路径,其余字段特定于操作。对于f
,第三、第四和第五个字段表示模式、所有者和组,行的其余部分是要写入文件的值。关于该格式的完整细节可以在 中找到
man tmpfiles.d
。您不能那样做。整个
/sys
文件系统在启动时重新创建,并且不用于控制系统。请/proc
改用,请参阅https://www.tecmint.com/change-modify-linux-kernel-runtime-parameters/并阅读man proc
。您必须将适当的sysctl
命令添加到系统启动中。请参阅https://www.baeldung.com/linux/run-script-on-startupsystemd
部分