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


40

我相信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显示文件权限?


好问题!欢迎
0xSheepdog

Answers:


71

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

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

因此,驱动程序会伪造一些权限,所有文件的权限都相同。这些权限以及文件的所有者和组可以在安装时进行配置。这些在mount(8)手册页的 “胖的装载选项”下进行了描述:

fat的挂载选项
(注意:fat不是独立的文件系统,而是msdos,umsdos和vfat文件系统的公共部分。)

uid=valuegid=value
设置所有文件的所有者和组。(默认值:当前进程的UID和GID。)

umask=value
设置umask(不存在的权限的位掩码)。默认值为当前进程的umask。该值以八进制表示。

dmask=value
设置仅应用于目录的umask。默认值为当前进程的umask。该值以八进制表示。

fmask=value
设置仅适用于常规文件的umask。默认值为当前进程的umask。该值以八进制表示。

请注意,权限以掩码形式显示,因此最终权限是掩码的取反。fmask=0133会导致所有文件都具有权限0644,或者rw-r--r--

而且,默认值是从调用的进程继承而来的mount(),因此,如果mount从命令行调用,则将使用shell的默认值umask


7
而且它确实伪造了权限的原因是,否则ls和查看文件权限的任何其他程序(甚至只是您的代码试图读取文件)都必须具有处理内置的所有不同文件系统组织的逻辑。
jamesqf

4
@jamesqf,是的,甚至系统调用界面也没有“没有权限”的选项,因为权限一直都存在。(这就是我写它们是“不可或缺的部分”时的想法。)因此,权限也始终应存在,并且会进行诸如ACL之类的事情以使它们有意义。
ilkkachu

2
我通常看到FAT文件系统中的所有文件都为777模式(至少具有旧驱动程序的FAT16)。
森林

2
@forest取决于umask安装选项,其默认值为mount进程的umask (请参见此答案中链接至的手册页)。
Ruslan

但是FAT 确实存储了一些权限/属性(只读,隐藏,系统等),即使它们未完全映射到Unix上也是如此。chmod ugo-w在文件上打开只读属性。fmask=0133如您的示例中那样使用该选项将不会导致所有文件都具有0644权限。FAT绝对不存储的是每个文件的uid和gid。请澄清; 目前的答案是极具误导性的。
mosvy

22

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

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


15

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

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

对于这些字段,没有特殊的代码表示“不可用”或“不适用”,因此内核的vfat驱动程序必须组成一些东西。FAT16 / FAT32确实具有只读标志,但是所有者/组来自安装选项,而umask也是如此。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.