本页详细介绍了如何在适用于 Linux 的 Windows 子系统中解释 Linux 文件权限,尤其是在 NT 文件系统上的 Windows 内部访问资源时。 本文档假定你基本了解 Linux 文件系统权限结构和umask 命令。
从 WSL 访问 Windows 文件时,文件权限是从 Windows 权限计算的,或者从 WSL 添加到文件的元数据中读取。 默认情况下不启用此元数据。
Windows 文件中的 WSL 元数据
在 WSL 中启用元数据作为装载选项时,可以添加和解释 Windows NT 文件上的扩展属性以提供 Linux 文件系统权限。
WSL 可以添加四个 NTFS 扩展属性:
| 属性名称 | DESCRIPTION |
|---|---|
| $LXUID | 用户所有者 ID |
| $LXGID | 组所有者 ID |
| $LXMOD | 文件模式(文件系统权限八进制和类型,例如:0777) |
| $LXDEV | 设备(如果是设备文件) |
此外,任何不是常规文件或目录的文件(例如符号链接、FIDO、块设备、unix 套接字和字符设备)也具有 NTFS 重新分析点。 这样就可以更快地确定给定目录中的文件类型,而无需查询其扩展属性。
文件访问方案
下面是使用适用于 Linux 的 Windows 子系统以不同方式访问文件时如何确定权限的说明。
从 Linux 访问 Windows 驱动器文件系统中的文件(DrvFS)
从 WSL 访问 Windows 文件时,很可能通过 /mnt/c这些方案。
从现有 Windows 文件读取文件权限
结果取决于文件是否已有现有元数据。
DrvFS 文件没有元数据(默认值)
如果文件没有与之关联的元数据,我们将 Windows 用户的有效权限转换为读/写/执行位,并将其设置为与用户、组和其他值相同的值。 例如,如果你的 Windows 用户帐户具有读取和执行访问权限,但对文件没有写入访问权限,则这会显示为 r-x 用户、组和其他帐户。 如果该文件在 Windows 中设置了“只读”属性,则我们不会在 Linux 中授予写入访问权限。
该文件具有元数据
如果文件存在元数据,我们只需使用这些元数据值,而不是转换 Windows 用户的有效权限。
使用 chmod 更改现有 Windows 文件的文件权限
结果取决于文件是否已有现有元数据。
chmod 文件没有元数据(默认值)
如果删除文件的所有写入属性,则设置 Windows 文件中的“只读”属性,因为这是与 Linux 中的 SMB(服务器消息块)客户端 CIFS(Common Internet File System)相同的行为。
chmod 文件具有元数据
Chmod 将根据文件现有的元数据更改或添加元数据。
请记住,即使元数据显示这种情况,你也不能给自己更多的访问权限,而不是你在 Windows 上拥有的访问权限。 例如,可以将元数据设置为显示你有权使用 chmod 777的文件写入权限,但如果尝试访问该文件,你仍无法写入该文件。 这要归功于互作性,因为对 Windows 文件的任何读取或写入命令都通过 Windows 用户权限路由。
在 DriveFS 中创建文件
结果取决于是否启用了元数据。
未启用元数据(默认值)
新创建文件的 Windows 权限与在 Windows 中创建文件时没有特定安全描述符时的权限相同,它将继承父级的权限。
已启用元数据
文件的权限位设置为遵循 Linux umask,该文件将随元数据一起保存。
哪个 Linux 用户和 Linux 组拥有该文件?
结果取决于文件是否已有现有元数据。
用户文件没有元数据(默认值)
在默认方案中,自动装载 Windows 驱动器时,我们指定任何文件的用户 ID(UID)设置为 WSL 用户的用户 ID,并将组 ID (GID) 设置为 WSL 用户的主体组 ID。
用户文件具有元数据
元数据中指定的 UID 和 GID 将作为文件的用户所有者和组所有者应用。
使用 从 Windows 访问 Linux 文件
通过 \\wsl$ 访问 Linux 文件将使用 WSL 分发版的默认用户。 因此,任何访问 Linux 文件的 Windows 应用都将具有与默认用户相同的权限。
创建新文件
在 Windows 中的 WSL 分发版内创建新文件时,将应用默认的 umask。 默认的 umask 是 022,或者换句话说,它允许除对组和其他组的写入权限之外的所有权限。
从 Linux 访问 Linux 根文件系统中的文件
在 Linux 根文件系统中创建、修改或访问的任何文件都遵循标准 Linux 约定,例如将 umask 应用到新创建的文件。
配置文件权限
可以使用 wsl.conf 中的装载选项在 Windows 驱动器中配置文件权限。 装载选项允许设置umaskdmask和fmask权限掩码。 将 umask 应用于所有文件,将 dmask 仅应用于目录, fmask 并且仅应用于文件。 然后,这些权限掩码将在应用于文件时通过逻辑 OR作进行,例如:如果你有一个 umask 值 023 和一个 fmask 值 022 ,则生成的文件权限掩码将是 023。
了解详细信息: 使用 wsl.conf 按分发配置选项。