WSL工作站配置01:网络SSH和GPU

Table of Contents

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 工作站。

发表评论