由于要在本地存储大量数据,需要使用大容量硬盘。鉴于WSL和NTFS文件系统之间存在一些“不兼容性”,读取/写入存储在NTFS上的的文件时读写速度较慢,因此较好的方式是创建一块虚拟硬盘,并格式化为Linux系统使用的格式,比如ext4。理论上也可以直接将物理硬盘全部格式化,但鉴于这块硬盘在windows上使用,并且可能存储一些其他东西,因此不考虑这种方案。

首先创建虚拟硬盘。创建虚拟硬盘可以直接使用windows提供的磁盘管理:

选择“操作——创建VHD”,进入创建虚拟磁盘界面:

选择一个存放虚拟磁盘的位置,例如 E://data.vhdx ,硬盘大小根据需要自定义,格式最好选择VHDX,因为支持的容量比较大,适合存放数据;类型可以选择动态扩展,使得虚拟磁盘的大小能随着存储量的大小增加至给定的上限而非直接分配,有利于优化空间使用。

创建好后,以管理员身份打开 powershell ,查看目前windows上挂载的硬盘信息。输入

GET-CimInstance -query "SELECT * from Win32_DiskDrive"

一般来说当创建好虚拟硬盘时系统会自动挂载,因此可以在输出看到:

DeviceID           Caption                        Partitions Size           Model
--------           -------                        ---------- ----           -----
\\.\PHYSICALDRIVE0 WDC  WUH721816ALE6L4           1          16000900392960 WDC  WUH721816ALE6L4
\\.\PHYSICALDRIVE2 WD Elements SE 2623 USB Device 1          2000363420160  WD Elements SE 2623 USB Device
\\.\PHYSICALDRIVE1 KBG50ZNS512G NVMe KIOXIA 512GB 3          512105932800   KBG50ZNS512G NVMe KIOXIA 512GB
\\.\PHYSICALDRIVE3 Microsoft 虚拟磁盘             0          15945058967040 Microsoft 虚拟磁盘
\\.\PHYSICALDRIVE4 Microsoft 虚拟磁盘             0          966363471360   Microsoft 虚拟磁盘

其中,最后两行是创建的虚拟磁盘(有两行是因为作者创建了两个)。如果没有挂载,请参考文末的解决方案。选择要挂载的虚拟磁盘,例如 \\.\PHYSICALDRIVE4 ,在 powershell 中挂载到WSL上:

wsl --mount \\.\PHYSICALDRIVE4 --bare

因为虚拟硬盘还未格式化,因此暂时使用 --bare 进行挂载。

此时,在WSL中,使用 lsblk 命令,就能看到这块虚拟硬盘(即 sde ):

NAME MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda    8:0    0 363.3M  1 disk
sdb    8:16   0     2G  0 disk [SWAP]
sdc    8:32   0  14.5T  0 disk /data
sdd    8:48   0     1T  0 disk /mnt/wslg/distro
sde    8:64   0   900G  0 disk

接下来,需要将硬盘格式化并挂载到指定的目录下。使用 mkfs 命令将硬盘格式化为 ext4 文件系统,然后使用 mount 命令挂载到 /data2 目录下:

user@localhost:/$ sudo mkfs -t ext4 /dev/sde
mke2fs 1.45.5 (07-Jan-2020)
Discarding device blocks: done
Creating filesystem with 235929600 4k blocks and 58982400 inodes
Filesystem UUID: 2b6571ba-4bb8-4768-9629-2259dcf6a8d3
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done
user@localhost:/$ sudo mount /dev/sde /data2

再次利用 lsblk 命令,就能看到磁盘被挂载到了指定的目录:

NAME MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda    8:0    0 363.3M  1 disk
sdb    8:16   0     2G  0 disk [SWAP]
sdc    8:32   0  14.5T  0 disk /data
sdd    8:48   0     1T  0 disk /mnt/wslg/distro
sde    8:64   0   900G  0 disk /data2

此时,就可以在wsl中正常使用这块虚拟磁盘了。

如果虚拟磁盘没有成功挂载到windows中(例如系统重新启动时),可以使用 diskpart 工具解决。同样,利用管理员身份启动 powershell , 输入 diskpart 启动该工具,然后输入:

select vdisk your://virtual/disk/location
attach vdisk

就能成功挂载。最后使用 exit 退出 diskpart。 以上方法可以添加到自动任务中,设定为开机执行,就能“永久”挂载虚拟硬盘。