WSL文件读写权限的配置方法

Windows subsystem for Linux

昨天晚上俄罗斯世界杯开踢了,看起来足球世界还是没怎么变,梅罗仍然统治世界,沙特仍然被欧洲球队打穿,中国队仍然四年一度的缺席……但是技术的世界却是日新月异,连微软都拥抱开源了,Windows subsystem for Linux (WSL) 简直是在赤裸裸的勾引程序员扔掉Mac投奔Windows。

既有Windows的桌面和Office套件,又可以方便的使用Linux的工具链,这样的生活不要太美好!当然前期坑是少不了的,经过两年时间的改进,wsl团队解决了不少问题(比如本文将提到的文件权限问题),个人觉得已经可以入坑了。当前时间节点18年6月,版本windows 10 1803, build 17134。

WSL的介绍和安装请看下这里:

Insider Build 17063 中,wsl加入了DrvFs功能,在WSL和Windows文件系统中充当桥梁,使WSL的文件权限可以支持更多的Metadata和更多的Mount选项。详细介绍看这里 Chmod/Chown WSL Improvements
使用简单命令就可以用drvfs重新mount硬盘:

1
2
sudo umount /mnt/c
sudo mount -t drvfs C: /mnt/c -o metadata

或者使用添加umask和fmask等参数:
1
sudo mount -t drvfs C: /mnt/c -o metadata,uid=1000,gid=1000,umask=22,fmask=111

但是每次使用时手动mount也太麻烦了,这时正好用上另一个新特性 Automatically Configuring WSL。把下面automount的选项添加到/etc/wsl.conf文件中就可以了。

1
2
3
4
5
[automount] 
enabled = true
root = /mnt/
options = "metadata,umask=22,fmask=11"
mountFsTab = false

现在重启WSL的console, windows硬盘上的文件和文件夹都拥有正常权限了。但是坑还没有完,如果这时用mkdir命令创建一个空文件夹,就会发现新的文件夹还是777权限。这可能是wsl的一个bug (Issue 1801, Issue 352),console默认的umask值仍然是0000。work-around的方法是在.profile、.bashrc、.zshrc或者其他shell配置文件中重新设置一下umask。

1
2
3
4
5
6
#Fix mkdir command has wrong permissions
if grep -q Microsoft /proc/version; then
if [ "$(umask)" == '0000' ]; then
umask 0022
fi
fi