为什么“ls”命令会显示 FAT32 分区中文件的权限?

use*_*731 43 linux filesystems permissions fat fat32

我相信 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
Run Code Online (Sandbox Code Playgroud)

为什么ls -l显示文件的权限?

ilk*_*chu 75

存储在磁盘上的文件系统并不存储所有文件权限,但文件系统驱动程序必须将它们提供给操作系统,因为它们是 Unix 文件系统概念的一个组成部分,并且系统调用接口无法表示权限缺失。

还要考虑如果文件根本没有任何权限位会发生什么?它是否与0777,即访问所有相同;或与 相同0000,即无法访问任何人?但是这两个都是文件权限,为什么不显示它们呢?或者做一些更有用的事情,并有办法设置一些合理的权限。

因此,驱动程序会伪造一些权限,所有文件的权限大多相同。权限以及文件的所有者和组在安装时是可配置的。这些在mount(8) 手册页中的“用于 fat 的挂载选项”下有描述:

fat 的挂载选项
(注意: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从命令行调用,shellumask将适用。

  • 它伪造权限的原因是,否则 ls 和任何其他查看文件权限的程序(甚至只是尝试读取文件的代码)都必须具有处理内置的所有不同文件系统组织的逻辑。 (7认同)
  • @jamesqf,是的,甚至系统调用接口也没有“没有权限”的选项,因为权限一直存在。(这就是我在写它们是“不可或缺的一部分”时的想法。)因此,权限也应始终存在,并且制作 ACL 之类的东西以使它们有意义。 (5认同)
  • 我通常看到 FAT 文件系统中所有文件的模式 777(至少是旧驱动程序的 FAT16)。 (2认同)
  • @forest 依赖于 `umask` 挂载选项,默认值为 `mount` 进程的 umask(请参阅此答案中链接的手册页)。 (2认同)

Rom*_*sky 24

但是这些文件确实有权限。用户john具有 RW 访问权限,而某些随机用户仅具有读取访问权限。这些权限并非来自文件系统本身,而是来自挂载选项(-o uid/gid/umask),这并没有使它们变得不那么真实。

您可以使用不同的选项挂载多个 vfat 分区,您可以使用ls来确定这些选项是什么。您甚至可以使用mount --bind使单个目录包含来自不同 vfat 分区的文件,并且ls将正确显示为每个文件指定的权限。


Pet*_*des 16

ls不知道FAT32,只知道用POSIX内核暴露的虚拟文件系统(VFS)接口open/ readdir/stat系统调用。

Linux不支持的文件的概念,没有用户/组/其他权限位,struct stat只包含一个mode_t st_mode;成员(UID,GID成员),内核必须在填写ls -l使得stat(2)系统调用。

对于这些字段中的任何一个,都没有表示“不可用”或“不适用”的特殊代码,因此内核的 vfat 驱动程序必须进行一些修改。FAT16/FAT32 确实有一个只读标志,但所有者/组来自挂载选项,umask 也是如此。