原先我一直认为WSL1仅仅是一个proot/chroot在Windows上的移植,但是微软除了在API和内置文件系统外还做了一些兼容性的工作。

在WSL1中,Windows默认将内置硬盘的各分区挂载至/mnt下的各文件夹,而对于移动硬盘、U盘、SD卡、光盘等连接的介质则不会自动挂载。
但实际上,WSL1中可使用drvfs挂载其他驱动器。以u盘盘符为E为例,在WSL中先创建文件夹,再进行挂载,即可在WSL中直接访问U盘了:

sudo mkdir /mnt/e
sudo mount -t drvfs "E:\\" /mnt/e

当Windows中需要安全删除该驱动器时,需要在WSL先卸载该存储器,否则LxssMgr服务可能回持续占用住该驱动器:

sudo umount /mnt/e

按照微软官方文档的说法,如果NTFS挂载点不是驱动器卷符,而是一个NTFS驱动器的空目录中,则可以将该目录挂载进WSL。以分区挂载点为D:\NTFS_Partition1\挂载至/mnt/f为例:

sudo mkdir /mnt/f
sudo mount -t drvfs "D:\\NTFS_Partition1\\" /mnt/f

这种挂载子目录的形式要求目录必须为NTFS分区的挂载点,而不能是任意一个分区内的文件夹。
此外,Windows中映射的网络位置也是可以在WSL中挂载的。
假定路由器192.168.1.1中使用samba分享了某个目录,分享名为share(即Windows中访问的网络位置为\\192.168.1.1\share),希望将其挂载为/mnt/share

sudo mkdir /mnt/share
sudo mount -t drvfs "\\\\192.168.1.1\\share" /mnt/share

注意,网络位置的挂载只能是在Windows的资源管理器中已经添加的网络位置,如果是新的网络位置,则不能直接挂载(会提示权限受限、只读等错误),需要先在资源管理器先添加网络位置才可避免出现相关错误(推测drvfs应该是WSL借助Windows内核实现的访问,而不是完全独立的一个模块)。

标签: Linux, Windows, WSL

添加新评论