1. 目标架构
最终目标是把 Windows 主机作为一台远程 Linux GPU 工作站使用,Mac 只负责终端、编辑器和远程开发。
Mac ↓ SSH Windows 上的 WSL2 Ubuntu ↓ CUDA / Docker / AI 开发环境 NVIDIA GPU
最终效果:
Windows 开机 / 登录 ↓ 任务计划程序自动启动 WSL ↓ WSL mirrored networking 生效 ↓ systemd 自动启动 sshd ↓ Mac 通过局域网直接 SSH 到 WSL ↓ 在 WSL 中使用 CUDA / nvidia-smi / PyTorch / Docker
2. 当前使用环境
本次最终使用的 WSL 发行版是:
Ubuntu-22.04
在 Windows PowerShell 中确认:
wsl -l -v
输出类似:
NAME STATE VERSION * Ubuntu-22.04 Stopped 2
说明:
- WSL 发行版名称是
Ubuntu-22.04 - 使用的是 WSL2
- 星号
*表示它是默认发行版
一、开启 WSL systemd
1. 编辑 /etc/wsl.conf
进入 WSL:
sudo vim /etc/wsl.conf
写入:
[boot] systemd=true
如果文件中已经有其他内容,就保留原内容,把 [boot] 这一段补进去即可。
2. 重启 WSL
在 Windows PowerShell 中执行:
wsl --shutdown
然后重新进入 WSL:
wsl -d Ubuntu-22.04
3. 检查 systemd 是否生效
在 WSL 中执行:
systemctl status
如果可以正常显示 systemd 状态,说明配置成功。
如果看到类似:
System has not been booted with systemd
说明 systemd 没有生效,需要重新检查 /etc/wsl.conf,然后再次执行:
wsl --shutdown
二、安装并配置 SSH 服务
1. 安装 OpenSSH Server
在 WSL 中执行:
sudo apt update sudo apt install openssh-server -y
2. 启动 SSH 服务
sudo systemctl start ssh
3. 设置 SSH 服务随 WSL 启动
sudo systemctl enable ssh
注意:这一步的含义是:
只要 WSL 启动,sshd 就会自动启动。
它不代表 Windows 开机后 WSL 会自动启动。Windows 开机启动 WSL 需要后面通过任务计划程序配置。
4. 查看 SSH 状态
systemctl status ssh
正常状态类似:
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running)
重点看:
enabled active (running)
说明 SSH 服务已经启动,并且会在 WSL 启动后自动运行。
三、设置 WSL 用户密码
如果需要使用密码登录 SSH,需要先给 WSL 用户设置密码。
passwd
如果提示:
You must choose a longer password.
说明密码太短或太简单,需要设置更长、更复杂的密码。建议包含:
- 大写字母
- 小写字母
- 数字
- 符号
例如:
Pchao@2026
如果中途输错或按了 Ctrl+C,可能出现:
passwd: Authentication token manipulation error
一般重新执行即可:
passwd
如果普通用户方式一直失败,可以使用:
sudo passwd pengchao
四、配置 WSL 镜像网络 mirrored networking
本次最终使用的是 WSL2 的 mirrored networking 模式。
默认情况下,WSL2 使用 NAT 网络,WSL 会拿到类似:
172.x.x.x
这种虚拟网段 IP。这个 IP 通常只能被 Windows 本机访问,局域网里的 Mac 不一定能直接访问。
开启 mirrored networking 后,WSL 的网络行为更接近 Windows 主机本身,局域网访问、SSH、开发服务暴露会更方便。
1. 编辑 Windows 用户目录下的 .wslconfig
在 Windows 中编辑:
C:\Users\你的Windows用户名\.wslconfig
例如你的 Windows 用户名如果是 chao.peng,路径类似:
C:\Users\chao.peng\.wslconfig
如果这个文件不存在,就新建一个。
写入:
[wsl2] networkingMode=mirrored
如果还需要限制或分配 WSL 的内存、CPU,也可以写在一起,例如:
[wsl2] networkingMode=mirrored memory=96GB processors=24
如果暂时不确定内存和 CPU 配置,可以只保留:
[wsl2] networkingMode=mirrored
2. 重启 WSL
配置保存后,需要完全关闭 WSL:
wsl --shutdown
然后重新进入 WSL:
wsl -d Ubuntu-22.04
或者直接从开始菜单打开 Ubuntu-22.04。
3. 检查 mirrored networking 是否生效
在 WSL 中执行:
ip addr
或者:
hostname -I
如果看到 WSL 里出现和 Windows 同网段的局域网地址,例如:
192.168.x.x
就说明 mirrored networking 已经生效。
4. mirrored networking 下不需要 portproxy
使用 mirrored networking 后,一般不需要再配置:
netsh interface portproxy
也就是不需要:
Mac -> Windows:2222 -> WSL:22
而是可以直接:
Mac -> WSL:22
Mac 直接登录:
ssh pengchao@192.168.x.x
或者配合 SSH config:
Host wsl
HostName 192.168.x.x
User pengchao
Port 22
之后直接:
ssh wsl
5. Windows 防火墙检查
如果 WSL 中 sshd 已经正常运行,但 Mac 仍然无法连接,可以检查 Windows 防火墙。
管理员 PowerShell 执行:
New-NetFirewallRule ` -DisplayName "WSL SSH" ` -Direction Inbound ` -Protocol TCP ` -LocalPort 22 ` -Action Allow
然后在 Mac 上测试:
nc -zv 192.168.x.x 22
如果返回:
succeeded
说明 Mac 已经可以访问 WSL 的 SSH 服务。
五、Windows 开机自动启动 WSL
注意:
sudo systemctl enable ssh
只表示:
WSL 启动后,sshd 自动启动。
但它不代表:
Windows 开机后,WSL 自动启动。
所以还需要让 Windows 登录后自动启动 WSL。
1. 确认发行版名称
PowerShell:
wsl -l -v
本次实际名称是:
Ubuntu-22.04
所以启动命令应该是:
wsl -d Ubuntu-22.04 --exec bash -c "sleep infinity"
不能写成:
wsl -d Ubuntu --exec bash -c "sleep infinity"
否则会报错:
不存在具有所提供名称的分发。 错误代码: Wsl/Service/WSL_E_DISTRO_NOT_FOUND
2. 手动测试 WSL 常驻启动
PowerShell 执行:
wsl -d Ubuntu-22.04 --exec bash -c "sleep infinity"
这个命令执行后不会自动退出,这是正常的。
因为:
sleep infinity
就是故意让 WSL 保持常驻。
然后再打开一个新的 PowerShell,执行:
wsl -l -v
如果看到:
Ubuntu-22.04 Running
说明 WSL 已经常驻运行。
3. 配置 Windows 任务计划程序
打开 Windows:
任务计划程序
创建新任务。
常规
名称:
Start WSL
建议勾选:
使用最高权限运行
触发器
选择:
登录时
操作
程序填写:
wsl.exe
参数填写:
-d Ubuntu-22.04 --exec bash -c "sleep infinity"
这样 Windows 登录后会自动启动 WSL,并保持 WSL 常驻。
最终链路变成:
Windows 登录 ↓ 任务计划程序启动 WSL ↓ WSL 常驻运行 ↓ systemd 启动 ↓ sshd 自动启动 ↓ Mac 可以随时 SSH 登录
六、Mac 通过 SSH 登录 WSL
1. 查看 WSL IP
在 WSL 中查看 IP:
ip addr
或者:
hostname -I
在 mirrored networking 模式下,应该可以看到局域网 IP,例如:
192.168.x.x
2. Mac 测试 SSH 端口
在 Mac 终端执行:
nc -zv 192.168.x.x 22
如果看到:
succeeded
说明端口可达。
3. Mac 登录 WSL
ssh pengchao@192.168.x.x
如果配置了 SSH config,可以直接:
ssh wsl
七、Mac 配置 SSH 快捷别名
编辑 Mac 上的 SSH 配置:
vim ~/.ssh/config
加入:
Host wsl
HostName 192.168.x.x
User pengchao
Port 22
以后直接:
ssh wsl
Cursor / VSCode Remote SSH 中也可以直接选择 wsl。
八、推荐配置 SSH Key 登录
为了后续 Remote SSH、Cursor、VSCode 使用更顺滑,建议使用 SSH Key 登录。
1. Mac 生成 SSH Key
Mac 上执行:
ssh-keygen -t ed25519
一路回车即可。
2. 拷贝公钥到 WSL
Mac 上执行:
ssh-copy-id pengchao@192.168.x.x
如果已经配置了 SSH config:
ssh-copy-id wsl
3. 测试免密码登录
ssh wsl
如果不再要求输入密码,说明配置成功。
九、NVIDIA GPU 配置检查
1. 在 WSL 中检查 GPU
进入 WSL 后执行:
nvidia-smi
本次正常输出中可以看到:
NVIDIA-SMI 590.57 Driver Version: 591.86 CUDA Version: 13.1 NVIDIA GeForce RTX 4070 Ti
说明 WSL 已经能正常访问 NVIDIA GPU。
2. 查看 nvidia-smi 路径
which nvidia-smi
正常路径是:
/usr/lib/wsl/lib/nvidia-smi
WSL 中的 NVIDIA 工具不在传统 Linux 的:
/usr/bin/nvidia-smi
而是在:
/usr/lib/wsl/lib/
十、解决 Mac SSH 后找不到 nvidia-smi 的问题
本次遇到的问题是:
在 Windows 本地 WSL 中可以直接执行:
nvidia-smi
但是从 Mac SSH 到 WSL 后,直接执行:
nvidia-smi
可能找不到命令。
但执行完整路径可以看到 GPU:
/usr/lib/wsl/lib/nvidia-smi
这说明:
GPU 本身正常 CUDA / WSL GPU 虚拟化正常 只是 SSH 登录后的 PATH 没有包含 /usr/lib/wsl/lib
1. 临时修复
SSH 登录 WSL 后执行:
export PATH=/usr/lib/wsl/lib:$PATH
然后:
nvidia-smi
应该就可以正常显示 GPU 信息。
2. 用户级永久修复
编辑当前用户的 .bashrc:
vim ~/.bashrc
加入:
export PATH=/usr/lib/wsl/lib:$PATH
然后执行:
source ~/.bashrc
重新测试:
nvidia-smi
3. 系统级永久修复,推荐
更推荐创建系统级 profile 文件:
sudo vim /etc/profile.d/wsl-nvidia.sh
写入:
export PATH=/usr/lib/wsl/lib:$PATH
保存后设置权限:
sudo chmod +x /etc/profile.d/wsl-nvidia.sh
然后重新从 Mac SSH 登录 WSL,再执行:
nvidia-smi
如果正常显示 GPU 信息,说明修复完成。
十一、PyTorch CUDA 验证
如果 WSL 中已经安装 PyTorch,可以测试:
python -c "import torch; print(torch.cuda.is_available())"
期望输出:
True
也可以查看当前 GPU:
python -c "import torch; print(torch.cuda.get_device_name(0))"
十二、Docker GPU 验证,可选
如果 WSL 中已经配置 Docker 和 NVIDIA Container Toolkit,可以测试:
docker run --gpus all nvidia/cuda:13.0.0-base-ubuntu22.04 nvidia-smi
如果容器中也能看到 GPU,说明 Docker GPU 环境也正常。
十三、最终验证清单
1. Windows 中检查 WSL 是否运行
wsl -l -v
期望看到:
Ubuntu-22.04 Running
2. WSL 中检查 sshd
systemctl status ssh
期望看到:
active (running)
3. WSL 中检查 mirrored networking IP
hostname -I
期望看到局域网地址,例如:
192.168.x.x
4. Mac 检查 SSH 端口
nc -zv 192.168.x.x 22
期望看到:
succeeded
5. Mac SSH 登录
ssh wsl
或者:
ssh pengchao@192.168.x.x
6. SSH 后检查 GPU
nvidia-smi
如果 nvidia-smi 找不到,就执行:
/usr/lib/wsl/lib/nvidia-smi
如果完整路径可用,说明只需要修复 PATH。
7. 检查 PATH
echo $PATH
应该包含:
/usr/lib/wsl/lib
8. 检查 PyTorch CUDA
python -c "import torch; print(torch.cuda.is_available())"
期望输出:
True
十四、常见问题总结
1. wsl -d Ubuntu 报错
错误:
不存在具有所提供名称的分发。 错误代码: Wsl/Service/WSL_E_DISTRO_NOT_FOUND
原因是发行版名字不是 Ubuntu。
解决:
wsl -l -v
确认真实名称,例如:
Ubuntu-22.04
然后使用:
wsl -d Ubuntu-22.04 --exec bash -c "sleep infinity"
2. SSH 服务正常,但 Mac 连不上
先在 WSL 中检查:
systemctl status ssh
再在 Mac 上检查端口:
nc -zv 192.168.x.x 22
如果端口不通,可以在 Windows 管理员 PowerShell 中放行防火墙:
New-NetFirewallRule ` -DisplayName "WSL SSH" ` -Direction Inbound ` -Protocol TCP ` -LocalPort 22 ` -Action Allow
3. Mac SSH 后找不到 nvidia-smi
先测试:
/usr/lib/wsl/lib/nvidia-smi
如果可以显示 GPU,说明只是 PATH 问题。
推荐修复:
sudo vim /etc/profile.d/wsl-nvidia.sh
写入:
export PATH=/usr/lib/wsl/lib:$PATH
然后:
sudo chmod +x /etc/profile.d/wsl-nvidia.sh
重新 SSH 登录后测试:
nvidia-smi
4. WSL 开启了 sshd,但 Windows 开机后 WSL 没运行
这是正常的。
systemctl enable ssh 只负责:
WSL 启动后自动启动 sshd
不负责:
Windows 开机后自动启动 WSL
需要通过 Windows 任务计划程序启动:
wsl.exe
参数:
-d Ubuntu-22.04 --exec bash -c "sleep infinity"
5. mirrored networking 后仍然不能 SSH
检查顺序:
1. WSL 中 sshd 是否 active 2. WSL 是否有 192.168.x.x 局域网 IP 3. Mac 是否能 ping 或 nc 到该 IP 4. Windows 防火墙是否放行 22 端口 5. Windows 自带 OpenSSH Server 是否占用了 22 端口
检查 Windows 22 端口:
netstat -ano | findstr :22
如果 Windows 自己的 sshd 不需要,可以关闭:
Stop-Service sshd Set-Service sshd -StartupType Disabled
十五、最终推荐状态
Windows
- WSL2
- Ubuntu-22.04
.wslconfig启用 mirrored networking- 任务计划程序登录时启动 WSL
- NVIDIA Windows 驱动正常
WSL
- systemd 已开启
- sshd 已安装
- sshd enabled
/usr/lib/wsl/lib已加入 PATH- CUDA / PyTorch / Docker 环境放在 WSL 中
Mac
- 使用 SSH Key 登录
~/.ssh/config配置Host wsl- Cursor / VSCode 通过 Remote SSH 连接 WSL
十六、最终工作流
日常使用时:
ssh wsl
进入后直接检查:
nvidia-smi
然后就可以正常进行:
- CUDA 开发
- PyTorch 训练
- Docker 容器运行
- Cursor / VSCode Remote SSH 远程开发
- AI / CV 项目训练与调试
这套配置基本就把 Windows + NVIDIA 显卡机器变成了一台可以从 Mac 远程使用的 Linux GPU 工作站。