0%

WSL文件权限

最近需要在wsl下启动windows应用,但发现无论执行任何程序,如notepad.exe、powershell.exe均提示permission denied,但我清晰的记得之前微软更新过一个版本,是可以让wsl和windows互通的,而且是比较早的一个特性,谷歌一下搜到了官方的文档:
https://docs.microsoft.com/en-us/windows/wsl/interop

经过一系列排查,才发现之前为了修改wsl的挂载权限,在/etc/wsl.conf中增加了一些配置,导致挂载的时候没有挂载执行权限。原配置:

1
2
3
4
5
6
7
8
[automount]
enabled = true
root = /mnt/
options = "metadata,dmask=022,fmask=133"
mountFsTab = false

[network]
generateResolveConf = true

其中dmask和fmask代表的是挂载的目录权限和文件权限,这个和传统的linux权限(chmod)正好是完全相反的,mask是过滤的意思,比如原来644的权限,对应的mask为777-644=133,因为原来设置的是644权限,所以必然提示permission denied,但是如果改成fmask=033,又会出现所有的文件都有执行权限的问题,所以要想两者兼顾,只能针对盘符进行不同的设置了,比如C盘和D盘一般都是安装的可执行程序,那么就把这两个盘挂载的时候设置为033,E盘和F盘一般为普通文件,就可以设置为133,故只需要在wsl.conf中的mountFsTab设置为true,最终wsl.conf的配置如下:

1
2
3
4
5
6
7
8
[automount]
enabled = true
root = /mnt/
options = "metadata,dmask=022,fmask=133"
mountFsTab = true

[network]
generateResolveConf = true

然后修改/etc/fstab如下:

1
2
3
4
C: /mnt/c drvfs rw,relatime,uid=1000,gid=1000,metadata,umask=22,fmask=033 0 0
D: /mnt/d drvfs rw,relatime,uid=1000,gid=1000,metadata,umask=22,fmask=033 0 0
E: /mnt/e drvfs rw,relatime,uid=1000,gid=1000,metadata,umask=22,fmask=133 0 0
F: /mnt/f drvfs rw,relatime,uid=1000,gid=1000,metadata,umask=22,fmask=133 0 0

至此完美解决。