WSL中的文件系统 架构如下图所示。与Windows文件系统接口的是DrvFs。

file system graphic

从图上可以看出,window盘C,D,E等都被挂载(mount)到了/mnt目录下。 但是,这种自动挂载的一个问题是,在Linux中,这些目录都没有写的权限,无法修改或者添加内容。使用起来非常不方便。

这是因为所有文件的权限都继承于Windows,所有的文件都隶属于root。其他用户没有权限写操作。

解决方案有两种:

1 临时解决: 卸载然后重新挂载时,添加元数据参数

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

sudo umount /mnt/f
sudo mount -t drvfs F:  /mnt/f -o metadata

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

sudo mount -t drvfs C: /mnt/c -o metadata,uid=1000,gid=1000,umask=22,fmask=111
sudo mount -t drvfs f: /mnt/f -o metadata,uid=1000,gid=1000,umask=22,fmask=111

2. 使用WSL自动配置文件

文件路径为 /etc/wsl.conf.

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

在增加修改这个配置文件之后,需要重启WSL,重新进入才能生效。

重启的方法

WSL 子系统是基于 LxssManager 服务运行的。
只需要将 LxssManager 重启即可。
可以做成一个 bat 文件。

net stop LxssManager

net start LxssManager

了解wsl.conf其它内容,可以参考 链接 https://devblogs.microsoft.com/commandline/automatically-configuring-wsl/

后记:

两个硬盘,主硬盘使用上面的自动配置文件,可以自动挂载,权限也没问题。但是另外一个硬盘,挂载之后还是没有权限。于是写了一个脚本,利用mount命令重新挂载了一下。结果发现,在盘根目录下没有写权限,但是在子目录下,是可以创建文件和目录的,于是就这样吧。

参考资料

http://zuyunfei.com/2018/06/15/file-system-configuration-in-wsl/