我注意到 Linux 上很多特殊文件的权限似乎不正确:
例如:
$ ls -l /dev/fuse
crw-rw-rw- 1 root root 10, 229 May 29 09:59 /dev/fuse
看似可写,但实际上不可写
$ echo 1 > /dev/fuse
-bash: echo: write error: Operation not permitted
相同,例如,对于以下位置的所有文件/proc/$pid/attr
:
$ ls -l /proc/1/attr/
total 0
-rw-rw-rw- 1 root root 0 May 30 11:01 current
-rw-rw-rw- 1 root root 0 May 30 11:01 exec
-rw-rw-rw- 1 root root 0 May 30 13:31 fscreate
-rw-rw-rw- 1 root root 0 May 30 11:01 keycreate
-r--r--r-- 1 root root 0 May 30 11:01 prev
-rw-rw-rw- 1 root root 0 May 30 11:01 sockcreate
$ echo 1 >| /proc/1/attr/keycreate
-bash: echo: write error: Permission denied
这是一个错误吗?
(顺便说一句,我不知道这些文件的作用)。
答案1
我想我的两条评论可能是一个答案......
1)如果您不知道文件的用途(或如何使用它),则永远不要“>文件”...您可以清除它/弄乱它而无法修复...
2)对于你的2个具体例子:
/dev/fuse 用于:en.wikipedia.org/wiki/Filesystem_in_Userspace。例如,如果您使用“sshfs”或类似的东西。当不使用时,它将不会导致任何结果(权限是正确的,但它当前没有指向/导致任何结果)。在使用时,它可能会导致一个可行的文件系统,如果您“>”进入它,您可能会弄乱甚至破坏它...... [ymmv]
/proc/1 用于“init”,您不想弄乱它。
(还有很多其他你不想惹恼的......^^)
答案2
这些不仅仅是 ext4 和其他熟悉的文件系统上的文件......
# mount | grep -E "on /proc |on /dev "
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
dev on /dev type devtmpfs (rw,...)
就 /proc 而言,您有一个虚拟文件系统 procfs,它代表内核中正在发生的事情,这些东西根本不是真正的文件,而是基于文件的内核接口。它们由某些驱动程序支持,该驱动程序的工作不仅仅是组织数据和元数据字节。在这样的“虚拟文件系统”上,可能会出现一些特殊的行为,这些行为似乎违背了您对文件系统的正常理解。
例如,这可能看起来很奇怪:
# echo hi > /proc/testfile
-bash: /proc/testfile: No such file or directory
对于 /dev,它是 tmpfs、devtmpfs(例如在没有 systemd 的 Arch 上)或 devfs(例如 FreeBSD),也许还有其他带有 systemd 的东西,事情的行为就像在普通文件系统上一样(或者可能不是),但它通常有“特殊文件”而不是常规文件。您可以将它们复制到另一个文件系统或创建您自己的文件系统(例如使用 mknod 或 mkfifo)以查看它们的行为有何不同。对于特殊文件“echo hi > somefile”可能并不意味着“打开文件,截断它,然后写入 hi”,而是将“hi”转发到某些驱动程序或其他东西。
# file /dev/sda /dev/mem /dev/fuse /dev/null
/dev/sda: block special (8/0)
/dev/mem: character special (1/1)
/dev/fuse: character special (10/229)
/dev/null: character special (1/3)
# file -s /dev/sda /dev/mem /dev/fuse /dev/null
/dev/sda: DOS/MBR boot sector, extended partition table (last)
/dev/mem: ERROR: cannot read `/dev/mem' (Operation not permitted)
/dev/fuse: ERROR: cannot read `/dev/fuse' (Operation not permitted)
/dev/null: empty
但是用 cp 复制它们并不(总是?)有效。 (我忘了怎么做,或者可能是想象的)
# cp /dev/null /tmp
# file -s /tmp/null
/tmp/null: empty
# echo hi > /tmp/null
# file -s /tmp/null
/tmp/null: ASCII text
# cp /dev/sda /tmp/
... it is copying the whole disk to /tmp now ... hit ctrl+c