WSL工作站配置02:独立物理硬盘挂载

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 保持常驻

发表评论