本文内容
本页详尽说明了Linux文件权限在适用于Linux的Windows子系统上是怎么解释的,尤其是在访问NT文件系统上Windows内部的资源时。本文档假设读者基本了解Linux文件系统权限结构和umask命令。
从WSL访问Windows文件时,文件权限是按照Windows权限估算的,或则是从已由WSL添加到文件的元数据中读取的。默认情况下,此元数据处于未启用状态。
Windows文件上的WSL元数据
若果在WSL中以装载选项的方式启用了元数据,则可以在WindowsNT文件上添加扩充属性并对其进行解释,因而提供Linux文件系统权限。
WSL可以添加四个NTFS扩充属性:
属性名称说明
$LXUID
用户所有者ID
$LXGID
组所有者ID
$LXMOD
文件模式(文件系统权限八补码数字和类型,比如:0777)
$LXDEV
设备(假如它是设备文件)
据悉,任何并非常规文件或目录的文件(比如:符号链接、FIFO、块设备、unix套接字和字符设备)也有NTFS重新剖析点。这样一来,就能否以快得多的速率确定给定目录中的文件类型,而毋须查询其扩充属性。
文件访问方案
下边介绍了在使用适用于Linux的Windows子系统以不同的形式访问文件时,权限是怎样确定的。
从Linux访问Windows驱动器文件系统(DrvFS)中的文件
在从WSL访问Windows文件(最有可能是通过/mnt/c)时,会出现这种情况。
从现有Windows文件读取文件权限
结果取决于文件是否已具有现有元数据。
DrvFS文件没有元数据(默认)
假如文件没有关联的元数据,则我们会将Windows用户的有效权限转换为读取/写入/执行位,并将其设置为对用户、组和其他用户而言相同的值。诸如,假如你的Windows用户账户具有对该文件的读取和执行访问权限,但不具有对该文件的写入访问权限,则该账户将对用户、组和其他对象显示为r-x。假如该文件在Windows中设有“只读”属性,则我们不会在Linux中授予写入权限。
文件有元数据
假如文件的元数据存在如果主机里的文件不能复制到虚拟机linux系统里面linux 虚拟主机,则只需使用这种元数据值,而不是转换Windows用户的有效权限。
使用chmod修改现有Windows文件的文件权限
结果取决于文件是否已具有现有元数据。
chmod文件没有元数据(默认)
Chmod只有一种疗效,假如删掉文件的所有写入属性,则会设置Windows文件上的“只读”属性,由于这是与CIFS(通用Internet文件系统)相同的行为。CIFS是Linux中的SMB(服务器消息块)顾客端。
chmod文件有元数据
Chmod将按照文件已有的现有元数据修改或添加元数据。
请记住,你为自己授予的访问权限不能少于你在Windows上具有的访问权限,虽然元数据显示的情况与此相反,也是这么。诸如,你可以使用chmod777将元数据设置为显示你对文件具有写入权限linux site:infoq.cn,但若果你尝试访问该文件,则你仍未能写入到该文件。这是因为互操作性而引起的,由于对Windows文件的任何读取或写入命令均通过Windows用户权限进行路由。
在DriveFS中创建文件
结果取决于是否启用了元数据。
元数据未启用(默认)
新创建的文件的Windows权限将与你在未使用特定安全描述符的情况下在Windows中创建的文件相同,它将承继父级的权限。
元数据已启用
文件的权限位设置为遵守Linuxumask,文件将随元数据一起保存。
那个Linux用户和Linux组拥有该文件?
结果取决于文件是否已具有现有元数据。
用户文件没有元数据(默认)
在默认情况下,当手动装载Windows驱动器时,我们指定任何文件的用户ID(UID)将设置为WSL用户的用户ID,但是组ID(GID)将设置为WSL用户的主体组ID。
用户文件有元数据
在元数据手指定的UID和GID将应用为该文件的用户所有者和组所有者。
使用\wsl$从Windows访问Linux文件
通过\wsl$访问Linux文件时将使用WSL分发版的默认用户。因而如果主机里的文件不能复制到虚拟机linux系统里面,任何访问Linux文件的Windows应用都具有与默认用户相同的权限。
创建新文件
从Windows向WSL分发版内部创建新文件时,将应用默认umask。默认的umask是022,也就是说,它容许不仅组和其他用户的写入权限以外的所有权限。
从Linux访问Linux根文件系统中的文件
在Linux根文件系统中创建、修改或访问的任何文件都遵守标准Linux约定,比如将umask应用到新创建的文件。
配置文件权限
可以使用wsl.conf中的装载选项在Windows驱动器内配置文件权限。装载选项容许你设置umask、dmask和fmask权限网段。umask应用于所有文件,dmask只应用于目录,而fmask只应用于文件。这种权限网段在应用到文件时会通过一个“逻辑或”操作进行估算,比如:假如umask值为023而且fmask值为022,则为文件生成的权限网段将为023。