我目前正在嵌入式 Linux 环境(内核 3.10.0)中进行开发,在挂载procfs
系统时我发现所有进程在其/proc/[pid]
文件夹中都存在以下文件:
-rw-r--r-- 1 root root 0 Feb 22 09:10 make-it-fail
只是为了测试,我从 shell 启动sleep 360 &
并尝试读取/写入cat
该echo
文件make-if-fail
。结果如下:
# stat /proc/[sleep_pid]/make-it-fail
File: /proc/[sleep_pid]/make-it-fail
Size: 0 Blocks: 0 IO Block: 1024 regular empty file
[...]
# cat /proc/[sleep_pid]/make-it-fail
0
# echo "1" > /proc/[sleep_pid]/make-it-fail
# cat /proc/[sleep_pid]/make-it-fail
1
# stat /proc/[sleep_pid]/make-it-fail
File: /proc/[sleep_pid]/make-it-fail
Size: 0 Blocks: 0 IO Block: 1024 regular empty file
[...]
奇怪的事情:
- 尽管
stat
声称该文件的大小为 0,但我可以在那里读取和写入一些内容,并检索我写入的内容。 - 该进程仍然活跃,在该文件的读写中“幸存”。我实际上期望它......好吧,失败或退出。
我知道这procfs
是一个伪文件系统(因此stat
结果可能不是“真实的”/误导性的)并且它与内核结构交互,但我觉得我现在在这里遗漏了一些东西。
那么,这个文件的目的和用途是什么?我不记得在其他发行版中看到过它(例如,它不在我用于开发的 Ubuntu 中)
答案1
我正在调查你的一些问题,因为读到这篇文章我开始怀疑将错误注入内核失败是一面旗帜。
其实已经确认阅读了将错误注入内核:
因此,有许多选项可用于将故障集中在内核的特定部分。
其中包括: 任务过滤器:如果该变量设置为正值,则仅当专门标记的进程正在运行时才会注入故障。为了启用此标记,每个进程都有一个新标志(让它失败) 在其 /proc 目录中; 将该值设置为 1 将导致错误注入到该进程中。
归根结底,make-it-fail 是一个布尔标志,标记是否将在相关 PID 中对多个进程进行条件注入操作。因此,像您所做的那样将其值更改为 1 不会产生任何后果。
至于变量/文件名本身,文章还指出必须在打开错误注入功能的情况下编译内核;因此你通常不会在其他 Linux 机器上看到它们。
至于proc存在文件系统不一致的问题,proc是一个虚拟文件系统,将文件名映射到linux内部结构/变量;文件大小自然为 0 字节。
来自 TLDPLinux 文件系统层次结构:/proc
该目录中的文件最显着的特点是,除了 kcore、mtrr 和 self 之外,所有文件的文件大小均为 0。