1. 目标
将一块独立物理 SSD 直接挂载给 WSL2 使用,格式化为 Linux 原生 ext4 文件系统,并挂载到:
/data
用于存放:
AI 数据集 模型权重 Docker 数据 Conda 环境 HuggingFace / ModelScope 缓存 训练输出
最终结构:
Windows
└── WSL2 Ubuntu-22.04
├── 系统盘:WSL 自带 ext4.vhdx
└── 数据盘:独立物理 SSD → /data
2. 为什么不用 VHDX
之前使用:
D:\wsl-data\deep_learning.vhdx
挂载到 WSL,发现存在一些不稳定因素:
VHDX attach 失败 权限问题 任务计划程序启动顺序问题 WSL 启动早于磁盘 attach wsl --mount 后 mount 失败 Windows 重启后需要重新 attach
因此改为:
独立物理 SSD + WSL2 直接挂载 + ext4
这种方案更接近真实 Linux 工作站,适合 AI / CUDA / Docker / PyTorch 开发。
3. 查看 Windows 物理磁盘编号
在管理员 PowerShell 中执行:
Get-Disk
找到目标 SSD 对应的编号。
例如:
Number Friendly Name Size ------ ------------- ---- 0 Windows SSD 1 TB 4 Fanxiang S790C 2 TB
其中:
Number = 4
对应:
\\.\PHYSICALDRIVE4
所以后续挂载命令使用:
wsl --mount \\.\PHYSICALDRIVE4 --bare
4. Windows 中不要给这块盘分配盘符
建议在 Windows 磁盘管理中处理:
diskmgmt.msc
对这块专门给 WSL 的 SSD:
不要分配盘符 不要作为 Windows 普通磁盘使用
推荐让它完全作为 WSL / Linux 专用盘。
5. 将物理盘挂载到 WSL
在管理员 PowerShell 中执行:
wsl --mount \\.\PHYSICALDRIVE4 --bare
注意:
必须使用管理员权限
否则会报错:
WSL_E_ELEVATION_NEEDED_TO_MOUNT_DISK
6. 在 WSL 中确认磁盘
进入 Ubuntu-22.04:
wsl -d Ubuntu-22.04
查看磁盘:
lsblk
你看到的结果类似:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 364.8M 1 disk
sdb 8:16 0 144.5M 1 disk
sdc 8:32 0 16G 0 disk [SWAP]
sdd 8:48 0 1T 0 disk /mnt/wslg/distro
/
sde 8:64 0 1.8T 0 disk
其中:
sdd
是 WSL 自己的系统盘。
sde
是新挂载进来的物理 SSD。
7. 查看磁盘分区情况
执行:
sudo fdisk -l /dev/sde
你当时看到类似:
Disk /dev/sde: 1.82 TiB Disk model: Fanxiang S790C 2 Disklabel type: gpt Disk identifier: ...
但没有看到:
/dev/sde1
说明磁盘是 GPT 磁盘,但没有分区。
8. 格式化为 ext4
因为这块盘是 WSL 专用盘,所以采用最简单方案:
不单独分区 直接将整块 /dev/sde 格式化为 ext4
执行:
sudo mkfs.ext4 /dev/sde
注意:
这一步会清空整块硬盘数据。
格式化完成后,查看 UUID:
sudo blkid
你的结果中关键一行是:
/dev/sde: UUID="b9dbc448-2b26-47d7-b6a9-299640c9e6a1" BLOCK_SIZE="4096" TYPE="ext4"
记录 UUID:
b9dbc448-2b26-47d7-b6a9-299640c9e6a1
9. 挂载到 /data
创建挂载目录:
sudo mkdir -p /data
手动挂载测试:
sudo mount /dev/sde /data
查看结果:
df -h | grep /data
成功时会看到:
/dev/sde 1.8T 28K 1.7T 1% /data
进入目录:
cd /data ls
看到:
lost+found
说明 ext4 文件系统已经正常挂载。
10. 配置 /etc/fstab 自动挂载
编辑:
sudo vim /etc/fstab
加入这一行:
UUID=b9dbc448-2b26-47d7-b6a9-299640c9e6a1 /data ext4 defaults,nofail 0 0
这里建议使用:
nofail
原因是:
如果 Windows 登录时物理盘还没 attach 成功, WSL 启动时不会因为 /data 挂载失败而卡住。
最终 /etc/fstab 中关键配置:
UUID=b9dbc448-2b26-47d7-b6a9-299640c9e6a1 /data ext4 defaults,nofail 0 0
11. 配置 /etc/wsl.conf
编辑:
sudo vim /etc/wsl.conf
加入:
[automount] enabled=true mountFsTab=true
作用是让 WSL 启动时处理:
/etc/fstab
12. 测试挂载
如果当前目录在 /data 里面,不能直接卸载。
错误示例:
sudo umount /data
如果当前就在 /data,会报:
umount: /data: target is busy
正确测试方式:
cd ~ sudo umount /data sudo mount -a df -h | grep /data
看到:
/dev/sde 1.8T 28K 1.7T 1% /data
说明 /etc/fstab 配置正确。
13. Windows 登录时自动 attach 物理盘
因为:
wsl --mount \\.\PHYSICALDRIVE4 --bare
在 Windows 重启后需要重新执行,所以使用任务计划程序自动执行。
13.1 创建启动脚本
创建文件:
D:\wsl-data\start_ubuntu_with_data.bat
内容如下:
@echo off rem Attach physical SSD to WSL wsl --mount \\.\PHYSICALDRIVE4 --bare rem Wait for device ready timeout /t 5 /nobreak >nul rem Start Ubuntu and mount /data wsl -d Ubuntu-22.04 --exec bash -lc "sudo /usr/bin/mount -a || true" rem Keep WSL alive wsl -d Ubuntu-22.04 --exec bash -c "sleep infinity"
14. 解决 sudo mount -a 要密码的问题
如果脚本运行到:
[sudo] password for pengchao:
说明自动脚本会卡住。
可以配置 mount 免密。
执行:
sudo visudo
在最后加入:
pengchao ALL=(root) NOPASSWD: /usr/bin/mount, /usr/bin/umount
保存退出。
然后脚本中使用:
wsl -d Ubuntu-22.04 --exec bash -lc "sudo /usr/bin/mount -a || true"
这样任务计划程序可以自动完成 mount。
15. 配置任务计划程序
打开 Windows 任务计划程序:
任务计划程序
创建或修改原来的 WSL 启动任务。
常规
勾选:
使用最高权限运行
这是必须的。
否则会报:
WSL_E_ELEVATION_NEEDED_TO_MOUNT_DISK
触发器
设置为:
用户登录时
操作
程序填:
cmd.exe
参数填:
/c D:\wsl-data\start_ubuntu_with_data.bat
16. 最终启动流程
最终流程是:
Windows 用户登录 ↓ 任务计划程序启动 bat ↓ 管理员权限执行 wsl --mount \\.\PHYSICALDRIVE4 --bare ↓ 物理 SSD attach 到 WSL2 ↓ 等待 5 秒 ↓ 启动 Ubuntu-22.04 ↓ 执行 sudo mount -a ↓ 根据 /etc/fstab 挂载 /data ↓ 执行 sleep infinity ↓ WSL 保持常驻