为什么我不能用 vi 编辑 /proc/sys/kernel/perf_event_max_sample_rate

为什么我不能用 vi 编辑 /proc/sys/kernel/perf_event_max_sample_rate

我是 root,在裸机上运行 Centos8,/proc/sys/kernel/perf_event_max_sample_rate 的权限如下

-rw-r--r--. 1 root root 0 Oct  3 14:00 perf_event_max_sample_rate

我想通过使用 vi 打开此文件、进行更改然后使用 w 或 w! 写入来更改采样率。当我这样做时,它会返回

perf_event_max_sample_rate“E667:Fsync失败

当我试图戒烟时,它告诉我

E37: No write since last change (add ! to override)

所以我无法使用 vi 更改值。但是我可以使用

echo 4000 > /proc/sys/kernel/perf_event_max_sample_rate

这仅仅是因为 /proc 不是真正的文件系统,对 /proc 中内容的所有更改都必须使用带重定向的 echo 或 sed 进行吗?这种行为在某处有记录吗?

答案1

这是因为fsyncvi/vim 的选项:

fsync fs
[…]
启用后,写入文件后将调用库函数fsync()。这会将文件刷新到磁盘,确保即使在仅执行元数据日志记录的文件系统上也能安全写入。[…]

来源

显然 procfs 不支持这个。它不需要。由于它是内核内部数据结构的接口,因此既没有缓存也没有日志记录。永久配置存储在/etc/sysctl.conf和与之相关的其他几个位置sysctl

我的测试表明,这个问题并不像“不支持的呼叫写入文件”。失败阻止了更改。无论如何,为了让它vi停止尝试fsync()告诉它set nofsync,然后用写入w。这在 Ubuntu 18.04.2 LTS 上对我有用。

相关内容