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

Posted by baicai on December 13, 2018

技术的世界却是日新月异,连微软都拥抱开源了,Windows subsystem for Linux (WSL) 简直是在赤裸裸的勾引程序员扔掉Mac投奔Windows。

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

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

What’s new for the Command Line in Windows 10 version 1803文件读写权限配置

  • 启动WSL,windows的硬盘会自动mount到linux系统下,但是早期版本所有windows文件的owner和group都会设置为root,读写权限则是从windows系统下继承过来。经常可以看到一片绿油油的777权限的文件和文件夹列表,这显然和linux系统中的最佳实践不符的,特别是从Git上拉下来的文件的权限都被改变了,而且对这些文件使用chmod或者chown是不起作用的,简直没法忍。

 Insider Build 17063 中,wsl加入了DrvFs功能,在WSL和Windows文件系统中充当桥梁,使WSL的文件权限可以支持更多的Metadata和更多的Mount选项。详细介绍看这里 Chmod/Chown WSL Improvements

使用简单命令就可以用drvfs重新mount硬盘:

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


或者使用添加umask和fmask等参数:

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文件中就可以了。

[automount] 
enabled = true 
root = /mnt/ 
options = "metadata,umask=22,fmask=11" 
mountFsTab = false 

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

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