![为什么“ls”命令显示 FAT32 分区中文件的权限?](https://linux22.com/image/150284/%E4%B8%BA%E4%BB%80%E4%B9%88%E2%80%9Cls%E2%80%9D%E5%91%BD%E4%BB%A4%E6%98%BE%E7%A4%BA%20FAT32%20%E5%88%86%E5%8C%BA%E4%B8%AD%E6%96%87%E4%BB%B6%E7%9A%84%E6%9D%83%E9%99%90%EF%BC%9F.png)
我认为 FAT32 文件系统不支持文件权限,但是当我ls -l
在 FAT32 分区上执行此操作时,ls -l
显示文件具有权限:
-rw-r--r-- 1 john john 11 Mar 20 15:43 file1.txt
-rw-r--r-- 1 john john 5 Mar 20 15:49 file2.txt
为什么ls -l
显示文件的权限?
答案1
存储在磁盘上的文件系统并不存储所有文件权限,但文件系统驱动程序必须将它们提供给操作系统,因为它们是 Unix 文件系统概念的组成部分,并且系统调用接口无法表示权限缺失。
还要考虑如果文件根本没有任何权限位会发生什么?是否与 相同0777
,即访问全部;或与 相同0000
,即无法访问任何人?但这两个是文件权限,那么为什么不显示它们呢?或者做一些更有用的事情,并有办法设置一些合理的权限。
因此,驱动程序伪造了一些权限,大部分是所有文件的相同权限。权限以及文件的所有者和组可以在安装时进行配置。这些在“脂肪的安装选项”下进行了描述mount(8) 手册页:
脂肪的安装选项
(注意:fat 不是一个单独的文件系统,而是 msdos、umsdos 和 vfat 文件系统的公共部分。)
uid=value
并gid=value
设置所有文件的所有者和组。 (默认:当前进程的UID和GID。)
umask=value
设置umask(不存在的权限的位掩码)。默认是当前进程的umask。该值以八进制给出。
dmask=value
设置仅应用于目录的 umask。默认是当前进程的umask。该值以八进制给出。
fmask=value
设置仅应用于常规文件的 umask。默认是当前进程的umask。该值以八进制给出。
请注意,FAT 文件系统存储的一项有用权限是只读位,如果运行chmod ugo-w file
,其写入权限将会消失。
这也可能是上述选项将其值作为屏蔽权限的原因离开,因此fmask=0133
将导致所有文件的所有x
权限被删除并w
从组和其他人中删除。然后,文件将具有权限0644
/rw-r--r--
或0444
/ r--r--r--
,具体取决于只读位是否被清除或设置。
另外,默认值是从调用进程继承的mount()
,因此如果您mount
从命令行调用,则 shell 的值umask
将适用。
答案2
但这些文件确实有权限。用户约翰具有 RW 访问权限,而某些随机用户仅具有读取访问权限。这些权限不是来自文件系统本身,而是来自挂载选项(-o uid/gid/umask),这并不会让它们变得不那么真实。
您可以使用不同的选项安装多个 vfat 分区,并且可以使用LS以确定这些选项是什么。你甚至可以使用挂载--绑定让单个目录包含来自不同 vfat 分区的文件,以及LS将正确显示为每个文件指定的权限。
答案3
ls
它不知道FAT32,它只知道内核通过POSIX open
//系统调用公开readdir
的虚拟文件系统(VFS)接口。stat
Linux 不支持文件的概念没有用户/组/其他权限位,struct stat
仅包含mode_t st_mode;
内核认为的成员(以及uid、gid成员)必须ls -l
制作时填写stat(2)
系统调用。
没有特殊代码表示这些字段“不可用”或“不适用”,因此内核的 vfat 驱动程序必须编造一些东西。 FAT16/FAT32 确实有一个只读标志,但所有者/组来自挂载选项,umask 也是如此。