WSL2安装

Windows安装WSL2 Ubuntu

WLS2
Abstract
本文主要是介绍界面版的操作,如果你的公司网络策略或管理员不允许在你的环境内下使用Microsoft Store,本身可以用WSL,但是需要本地下载。
Tip

本文详细介绍了如何在Windows10中使用WSL2,包括启动子系统和虚拟机平台的设置,WSL2版本切换,以及WSL的初始化,openSSh-server启动等操作。

WSL2 安装步骤

WSL2(Winodws Subsystem for Linux)是微软公司开发的一项创新性技术,它在Windows操作系统上提供了一个完整的Linux内核,并允许用户在Windows环境中运行Linux发行版。很早之前在Windows上使用Linux系统必须先安装VitualBox或VMWare,然后再安装Linux发行版,现在可以先安装WSL再安装Linux发行版,更少的内存占用,文件操作也更方便。

1. 启动子系统和开发者选项

启动计算机的开发者模式和Linux的Windows子系统

  • 开发者模式开启:Windows开始键盘—-更新和安全—-开发者选项—-开发人员模式(开启)

  • 搜索栏搜(控制面板)—-程序—-程序和功能—-侧边启用或关闭Windows功能—-适用于Linux的Windows子系统

开发者模式

Linux子系统
Figure 1

2. 安装Linux

本步骤使用图形界面进行安装,没有使用命令行模式进行安装

在Windows中搜索Microsoft Store, 点击进入界面,可以搜索Ubuntu或者Linux,会出来不同版本的Ubuntu Figure 2, 这里选择的是Ubuntu20.04 LTS版本,点击下载等待即可。

Caution

如果网络被限制,此处可能会无法正常下载,就需要自行下载安装

Linux

Ubuntu 20.04
Figure 2
LTS版本和普通版本区别
项目 LTS 版本(如 20.04) 非 LTS 版本(如 20.10)
发布频率 每两年 每六个月
支持时间 5年(可扩展到10年) 9个月
稳定性
软件更新 稳定但较慢 快速、可能不稳定
适用场景 企业、服务器、长期使用 桌面测试、新技术体验

3. Ubuntu设置

在Ubuntu点击下载安装之后,会自动启动进入安装界面 经过几分钟的等待之后,Ubuntu就可以安装好,进入设置流程

  • UNIX username
  • New Password
  • Retype new password
Tip

Linux安全模式,输入密码是不显示位数的

Linux设置

Linux设置

在Windows系统文件夹中查看Ubuntu系统文件

如图 Figure 4 显示的,在文件查找栏中输入 \\wsl$ 即可跳转到WSL2的Ubuntu子系统,点击即可查看Ubuntu系统文件,默认进入的是根目录

Figure 3: WSL2

4. 开启OpenSSH-server

  1. 系统升级是必须做的

Ubuntu初级安装之后很多lib是没有的,需要进行系统补丁的维护和lib的安装。

Important

如果没有科学上网,就需要更换比较快的镜像源,国内很多镜像源可以更换,在/etc/apt/source.list 更换即可,记得要先进行备份

在Ubuntu中输入下面的命令

sudo apt-get update
sudo apt-get upgrade

新启动的可能需要加载更新较久

  1. 重新安装openssh-server

先将原始的卸载掉,再安装新的openssh-server,sudo 使用到超级权限,一开始设置就是自己为自己的root

sudo apt-get remove openssh-server
sudo apt-get install openssh-server
  1. 配置ssh_config.d文件

重新安装好openssh-server后,进行设置文件的修改,主要是开通权限

sudo vim /etc/ssh/sshd_config
Tip

vim是Ubuntu的文本编辑器,相当于windows中的文本记事本一样,进入config文件后,找到下图 Figure 4 中所标的位置,键盘按 i,进入编辑模式,修改即可;修改好之后按 Esc,再按:, 输入wq}(意味着保存文件修改并退出当前文档)

openssh-No

openssh-yes
Figure 4
  1. 生成密钥

SSH密钥对安全强度远高于常规用户密码,且从公钥逆向推出私钥的难度极高,可以杜绝暴力破解威胁。 通过使用SSH密钥对,可以实现免密登录,直接使用私钥通过SSH命令或相关工具登录目标实例。 支持登录多台Linux实例,更加方便地管理.

ssh-keygen -t rsa
  • ssh-keygen:生成 SSH 密钥对的命令
  • -t rsa:指定密钥类型为 RSA(默认 3072 或 4096 位)

默认生成两份文件

文件 说明
~/.ssh/id_rsa 私钥,必须保密
~/.ssh/id_rsa.pub 公钥,可以放在远程主机的 ~/.ssh/authorized_keys

输入后一直按Enter 键即可完成创建

启动openSSH-server

sudo service ssh start

5. 远程连接WSL

终端启用了Ubuntu,有很多的不方便,文件也不易传输,下载过久之后会出现卡断的现象,这个时候就需要远程连接Linux,使用各种方式都可以完成远程连接。

  • 能够随时随地访问计算机(只要计算机不关)
  • 安全性高,SSH公钥认证避免密码泄露风险
  • 支持远程控制
  • 稳定运行,长期在线,易于管理,易于传输文件等

常见的工具组合

工具/协议 用途
SSH/Xshell 远程终端连接
SFTP/WinSCP/Xftp 文件传输
VS Code + Remote SSH 插件 远程开发
Git 代码版本管理
Docker 应用容器化部署
systemd/crontab 服务与任务自动管理

远程连接Linux服务器主要是通过 SSH(Secure Shell) 协议,这里使用的是Windows下面无需安装的MobaXterm平台,选择下载不安装免费版本即可,下载之后解压,点击进入文件夹,双击MobaXterm即可进入界面。

按照下图选择Session—-SSH—-Remote host输入(127.0.0.1)—-Specify username输入自己之前设置的Unix name—-点击OK,就提示输入密码即可进入终端

6. WSL开源

微软最近几年态度非常的open,开源了很多大的项目,看来开源是推动进步的主要因素,当然也有卷的缘故,但是无论怎么样,开源是好事情。

有感兴趣的各位可以去GitHub上自行了解学习,github链接 https://github.com/microsoft/WSL?tab=readme-ov-file

WSL1和WSL2 转换

当WSL1 对于一些软件不支持的时候,需要将WSL1转换到WSL2,比如WSL1不支持Node.js v24,无法执行现代 x86_64 ELF 二进制,在powershell中快速转换,5min即可搞定

  1. Windows中打开PowerShell(管理员)
wsl --set-default-version 2
  1. 查看当前的WSL发行版名称
wsl -l -v

示例输出:

  NAME            STATE           VERSION
* Ubuntu-20.04    Running         1
  1. 把当前发行版本升级到WSL2
wsl --set-version Ubuntu-20.04 2

耐心等到几分钟后即可完成转换

在Linux系统中,输入uname -a 即可查看


Linux RD 5.10.16.3-microsoft-standard-WSL2 #1 SMP Fri Apr 2 22:23:49 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

WSL2 本地连接和外部连接

MobaXterm中连接WSL2(Ubuntu)时,本地连接(Localhost)和通过WSL直接连接是完全两种不同的访问方式

wsl2 local

wsl2-local
对比维度 通过 127.0.0.1 连接 WSL2 通过 wsl 方式连接 WSL2
连接本质 TCP/IP 网络栈 直接进入 WSL2 Linux 实例
使用方式 ssh user@127.0.0.1 -p <port> MobaXterm → WSL Session / wsl -d Ubuntu
是否经过 SSH ✅ 是 ❌ 否
是否需要 sshd ✅ 必须运行 ❌ 不需要
网络隔离 有(虚拟网卡 / NAT) 无(进程级直连)
IP 概念 明确存在(127.0.0.1 / NAT) 无 IP 概念
端口映射 需要配置端口 不需要
延迟与开销 略高(TCP + SSH) 最低(本地进程)
认证方式 SSH key / password Windows 用户上下文
连接稳定性 依赖网络与端口 非常稳定
支持端口转发 ✅ 支持 ❌ 不支持
适合远程工具 是(看起来像远程 Linux) 否(仅限本机)
可被其他设备访问 ❌ 默认不行 ❌ 不行
典型用途 模拟“远程服务器” 本地 Linux 开发

1. WSL 127.0.0.1

通过WSL直接连接的好处就是方便,自动识别,快速连接,延迟也最低

wsl link

wsl link
MobaXterm
   |
   |  ssh user@127.0.0.1:22
   |
Windows TCP/IP (loopback)
   |
   |  NAT / port forward
   |
WSL2 Ubuntu (sshd)
  1. 在WSL Ubuntu 中安装并启动SSH
sudo apt update
sudo apt install -y openssh-server
  1. 启动sshd

sudo service ssh start

然后在mobaXterm中使用ssh进行连接,输入127.0.0.1,用户名,然后密码即可进行连接

2. 局域网连接

WSL2 默认是不支持通过局域网(LAN)连接 MobaXterm,可以通过 Windows 做端口转发(Port Proxy)实现。在局域网环境下,通过 MobaXterm 连接另一台机器上的 WSL2,最大的挑战在于 WSL2 的网络架构本质上是一个 NAT(网络地址转换)模式。这意味着 WSL2 的 IP 地址通常是内部私有的,局域网内的其他机器无法直接访问它。

由于外部机器只能看到“宿主机”的局域网 IP,我们需要在宿主机上做一个“路标”,把发往宿主机的 SSH 请求转发给内部的 WSL2

  1. 准备WSL2环境
  • 在 WSL2 中执行:sudo apt update && sudo apt install openssh-server
  • 编辑配置文件:sudo nano /etc/ssh/sshd_config
    • 确保 PasswordAuthentication yes
    • 建议将端口改为 2222(避免与 Windows 自带的 SSH 服务冲突)。
  • 启动服务:sudo service ssh restart
  • 获取 WSL2 的内部 IP:执行 hostname -I(假设为 172.20.10.5)
  1. 在宿主机(Windows)设置端口转发 以管理员权限打开PowerShell,运行下面的命令
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=2222 connectaddress=172.0.0.1 connectport=2222
  1. 放行防火墙

继续在管理员模式的PowerShell中运行,允许222端口通过Windows防火墙

netsh advfirewall firewall add rule name="WSL2_SSH" dir=in action=allow protocol=TCP localport=2222

New-NetFirewallRule -DisplayName "Allow WSL2 SSH from LAN" -Direction Inbound -Protocol TCP -LocalPort 2222 -Action Allow
  1. 搜索windows本地的IP

在powershell中输入ipconfig搜索主机windowsIP

windows wsl2

把本地IP输入到Remote name,端口改成2222

然后就可以通过MobaXterm进行连接了,按照正常的模式

WSL迁移到非系统盘

  1. 安装相关组件

打开控制面板—-> 程序 —-> 启用或关闭Windows功能 —-> 适用于Linux的Windows子系统 和 虚拟机平台 (勾选)—-> 确定

wsl2 vitrual

wsl2 vitrual
  1. 打包wsl

由于wsl会默认安装在C盘,会占用1GB的空间,会随着wsl的安装使用,占用空间越来越大,所以建议迁移到非系统盘,比如D盘或者E盘

  1. 查看安装的wsl子系统
wsl -l
  1. 将子系统导出到tar文件
wsl --export Ubuntu-22.04 D:\WSL-Ubuntu\Ubuntu-22.04.tar
  1. 注销原来的子系统
wsl --unregister Ubuntu-22.04
  1. 在新的位置导入子系统
wsl --import 路径名 放置tar的文件路径
wsl --import Ubuntu-22.04 D:\WSL-Ubuntu D:\WSL-Ubuntu\Ubuntu-22.04.tar
Tip

wsl2系统会放在一个ext4.vhdx文件中,所以的文件都写在此文件下

  1. 切换默认账户 在上述步骤完成后,启动wsl,会进入root账户,需要切换到自己设置的用户账户,需要修改WSL的默认登陆用户
echo -e "[user]\ndefault=erwin" >> /etc/wsl.conf

更改之后,需要重启wsl,才能生效

wsl --shutdown wsl