文件权限/属性如何工作?内核级、FS 级还是两者兼而有之?

Jos*_* R. 8 permissions architecture

我之前遇到的一个问题:文件权限/属性是依赖于操作系统(以及内核)还是依赖于文件系统?在我看来,第二种选择更合乎逻辑,但我从未听说过reiserfs文件权限,例如:只有“Unix 文件权限”。另一方面,引用维基百科文章

随着新版本的 Windows 的出现,Microsoft 已将NTFS 文件系统上的可用属性添加到清单中

这似乎表明 Windows 文件属性以某种方式与文件系统相关联。

有人可以启发我吗?

Gil*_*il' 7

内核和文件系统都发挥着作用。权限存储在文件系统中,因此需要有一个地方以文件系统格式存储信息。权限由内核强制执行并传递给应用程序,因此内核必须实施规则来确定存储在文件系统中的信息意味着什么。

“Unix 文件权限”是指传统的权限系统,它涉及通过三种角色类型(用户、组、其他)控制的三个操作(读取、写入、执行)。文件系统的工作是存储 3×3=9 位的信息。内核的工作是将这些位解释为权限;特别是,当进程尝试对文件进行操作时,内核必须根据给定进程运行的用户和组、文件的权限位和请求的操作来确定是否允许该操作。(“Unix 文件权限”通常还包括setuid 和 setgid bits,严格来说这不是权限。)

现代 Unix 系统可能支持其他形式的权限。大多数现代 Unix 系统(Solaris、Linux、*BSD)支持访问控制列表,允许为多个用户和多个组为每个文件分配读/写/执行权限。文件系统必须有空间来存储这些额外的信息,内核必须包含查找和使用这些信息的代码。Ext2、reiserfs、btrfs、zfs 和大多数其他现代 unix 文件系统格式都定义了存储此类 ACL 的位置。Mac OS X 支持一组不同的 ACL,其中包括非传统权限,例如“追加”和“创建子目录”;HFS+ 文件系统格式支持它们。如果您在 Linux 上挂载 HFS+ 卷,则不会强制执行这些 ACL,因为 Linux 内核不支持它们。

相反,有些操作系统和文件系统不支持访问控制。例如,FAT和变体是为单用户操作系统和可移动媒体设计的,其权限仅限于读/读-写和隐藏/可见。这些是DOS强制执行的权限。如果你在 DOS 上挂载一个 ext2 文件系统,它不会强制执行 ext2 权限。相反,如果您在 Linux 上访问 FAT 文件系统,则所有文件都将具有相同的权限。

Windows 的后续版本增加了对更多权限类型的支持。NTFS 文件系统被扩展以存储这些额外的权限。如果您在较旧的操作系统上使用较新的权限访问文件系统,操作系统将不知道这些较新的权限,因此不会强制执行它们。相反,如果您使用较新的操作系统访问较旧的文件系统,它将不包含新的权限,并且由操作系统提供合理的回退。