为什么 /dev 以只读方式挂载后仍然可以写入 /dev/null?

为什么 /dev 以只读方式挂载后仍然可以写入 /dev/null?

我惊讶地发现/dev/null即使重新安装/dev为只读后我仍然可以写入。

这是一个演示:

# echo foo > /dev/null
# echo foo > /dev/foo
# mount -o remount,ro /dev
# echo foo > /dev/null
# echo foo > /dev/foo
-bash: /dev/foo: Read-only file system

这是什么原因呢?

(我想一种解释可能是,对于某些(所有?)设备,该设备不是链接到该设备的文件系统的一部分。)

是否有任何设备受到影响mount -o remount,ro?或者remount,ro对指定文件系统中的设备基本上没有影响?

有谁知道这种行为记录在哪里?

答案1

只是猜测:您实际上并没有通过写入/dev/null.

设备文件只是一个句柄,用于将内核指向具有主/次设备号的设备。事实上,相同的设备文件可以存在于多个文件系统上,并且它们将引用相同的设备。

所以我想写入它们并不被视为写入文件系统。

答案2

当内核看到对设备文件的写入尝试时,它开始忽略其他所有内容(考虑到您是 root 用户并且还没有使用 chattr)。

IOW 当您使用设备文件时,您不是使用底层文件系统时,您正在使用设备文件。

尝试修改设备文件本身,即重命名/删除/更新其时间戳,将失败。

一切都按预期进行。

答案3

  1. 目录的riteW权限仅控制该目录中文件的创建/删除。可能会破坏您的系统,sudo chmod a-w /dev/null.

  2. /dev/null是一个伪设备,可能不尊重该W位。

答案4

设备文件是特殊文件,其工作方式或多或少类似于符号链接:尝试相同的操作(链接到 rw fs 中文件的只读 fs 中的符号链接),也可以编辑文件。

相关内容