WSL中的文件系统 架构如下图所示。与Windows文件系统接口的是DrvFs。
从图上可以看出,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/