WSL 跨文件系统(即从 WSL 内部访问 /mnt/d/ 下的文件)读写性能确实较差,这会显著拖慢深度学习数据加载(Dataloader)的速度。可以选择将 WSL 发行版迁移到 D 盘,并将代码和数据移入 WSL 的文件系统内部(例如 /home/user/project)。
以下是关于迁移 WSL 的操作步骤。
1. WSL 默认安装位置
是的,默认情况下 WSL 2 的虚拟硬盘(ext4.vhdx)会安装在 C 盘的用户目录下,路径通常是:
C:\Users\<你的用户名>\AppData\Local\Packages\<发行版包名>\LocalState\
比如 Ubuntu 可能是:
C:\Users\Alice\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx
这个 .vhdx 文件是一个虚拟磁盘,里面包含了整个 Linux 文件系统。
2. 从 WSL 访问 D 盘文件是否影响性能?
- WSL 1 :通过 9P 协议直接访问 Windows 文件系统(如
/mnt/d/),I/O 性能较差,尤其对大量小文件(如数据集)或频繁读写(如训练日志、checkpoint)会有明显延迟。 - WSL 2 :使用 Hyper-V 虚拟机 + 虚拟硬盘,Linux 文件系统内部(即
/home/...)性能接近原生 ;但跨系统访问 Windows 文件(如/mnt/d/)仍然较慢,因为要经过 9P 文件共享协议。
✅ 结论 :如果你的代码和数据都放在 D 盘并通过 /mnt/d/... 访问,确实会影响训练速度,尤其是 I/O 密集型任务(如加载图像、读取 TFRecord、频繁保存模型等)。
3. 将已配置好的 WSL 迁移到 D 盘
可以把整个 WSL 发行版"导出 → 删除 → 导入到 D 盘",保留所有配置(包括 SSH、Python 环境、Tailscale 等)。
- 检查当前状态并记录发行版名称
powershell
# 以管理员身份打开PowerShell
wsl -l -v
显示结果示例:
NAME STATE VERSION
* Ubuntu-22.04 Running 2
记下发行版名称(如 Ubuntu-22.04)
- 关闭 WSL
powershell
wsl --shutdown
可再运行wsl -l -v确认关闭。
-
导出当前发行版为 tar 文件(保存到 D 盘)
powershellwsl --export Ubuntu-22.04 D:\wsl\ubuntu-2204-backup.tar注意:
Ubuntu-22.04是你在wsl -l中看到的发行版名称。另外D盘中需要提前建立备份路径。 -
卸载原发行版(不会删除 tar 文件)
这一步会删除 C 盘上的旧 WSL 系统。请务必确认第二步的 tar 文件已经成功生成且大小正常。执行完后,C 盘空间会被释放。
# 语法:wsl --unregister <发行版名称>powershellwsl --unregister Ubuntu-22.04 -
在 D 盘创建新目录并导入
# 语法:wsl --import <新发行版名称> <安装路径> <备份文件路径> --version 2powershellmkdir D:\wsl\ubuntu-2204 wsl --import Ubuntu-22.04 D:\wsl\ubuntu-2204 D:\wsl\ubuntu-2204-backup.tar --version 2 -
设置默认用户(否则每次登录都是 root)
启动 WSL 查看是否正常:powershellwsl此时你应该以 root 身份进入了系统。显示为
root@hzh25:/mnt/c/Windows/system32#,输入exit退出。
设置默认用户:退出后在 PowerShell 中(不是在 WSL 里),根据发行版类型执行配置命令。
powershellubuntu2204.exe config --default-user 新的用户名如gonglab -
验证
powershellwsl df -h # 查看根分区是否在虚拟硬盘中(不是 /mnt/c)
进入wsl系统后显示为 (base) gonglab@hzh25:/mnt/c/Windows/system32$,这里能够看到当前的工作目录是 Windows 的 C:\Windows\system32。看到 Windows 目录的原因是,默认情况下,WSL 启动时的工作目录继承自 Windows 的当前目录。如果从 PowerShell 或 CMD 中在 Windows 的 C:\Windows\system32 目录下执行 wsl 启动,那么 WSL 的启动目录就是 /mnt/c/Windows/system32。
4. 迁移会影响 SSH 和 Tailscale 吗?
正常情况下,只要导入后 WSL 能正常启动,SSH 和 Tailscale 都会继续工作,无需重新配置。
(1)查看Windows和WSL的IP
在公司电脑上,对于Windows 而言,从桌面右下角系统托盘(通知区域)中的Tailscale可查看Windows的IP。
在PowerShell中或者启动wsl后,输入
powershell
tailscale status
都可以查看三个IP类似格式如下
100.88.74.120 office-pc yourname@ windows -
100.88.74.110 office-pc yourname@ linux -
100.92.45.67 home-pc yourname@ windows -
对于WSL系统而言,如果ssh没有运行,则按如下步骤启动。
- Windows 开始菜单 → 搜索 "PowerShell" 或 "Terminal" → 以普通用户身份打开
-
输入命令进入 WSL:
powershellwsl -
在 WSL 中检查 SSH 服务状态:
bashsudo service ssh status
如果看到 Active: active (running),说明 SSH 正常。
如果没运行?启动它:
bash
sudo service ssh start
(2)在家中电脑验证
通过Win+R输入cmd打开终端,可以分别验证Windows和WSL的ssh连接:
ssh winname@100.88.74.120
和
ssh wslname@100.88.74.110
如果可以顺利连接,则可以在VSCode中进一步开展工作。
(3)监测显卡占用
在被控电脑的WSL终端中,运行 which nvidia-smi,得到 /usr/lib/wsl/lib/nvidia-smi,即找到nvidia-smi的完整路径。
在家中电脑终端运行
ssh -t researcher@100.64.10.25 "watch -n 1 /usr/lib/wsl/lib/nvidia-smi"
即可在家中电脑持续监控显卡占用。