Skip to content

WSL

做 SDN 实验时绕不开 Linux,但又不想动 Windows 上现有的工具链——这种时候 WSL 基本就是性价比最高的选择。它的全名是 Windows Subsystem for Linux,可以理解成一层让 Linux 二进制直接跑在 Windows 之上的兼容层。Mininet、Scapy、P4 编译器我大多都是丢进 WSL 里跑的,本机几乎零污染。

目前用得最多的是 WSL 2,底层换成了真正的 Linux 内核(跑在轻量 Hyper-V 里),文件系统、网络栈都比 WSL 1 完整。除非有需要直接访问 Windows 路径性能的特殊场景,新装基本就直奔 2 了。

装之前先确认几件事

  • Windows 10 21H2 / Windows 11 以上版本,老系统的 WSL 体验差很多。
  • 管理员身份打开 PowerShell,否则后面 --install 会卡在权限上。
  • BIOS 里把虚拟化(Intel VT-x / AMD-V)打开,不然 WSL 2 起不来。
  • "虚拟机平台"功能默认会被 wsl --install 自动启用,但如果之前手动关过,需要重新勾上。

安装

先看微软仓库里列出的可装发行版:

ps1
wsl --list --online

## 输出示例:
# NAME                            FRIENDLY NAME
# Ubuntu                          Ubuntu
# Ubuntu-24.04                    Ubuntu 24.04 LTS
# openSUSE-Tumbleweed             openSUSE Tumbleweed
# openSUSE-Leap-16.0              openSUSE Leap 16.0
# SUSE-Linux-Enterprise-15-SP7    SUSE Linux Enterprise 15 SP7
# SUSE-Linux-Enterprise-16.0      SUSE Linux Enterprise 16.0
# kali-linux                      Kali Linux Rolling
# Debian                          Debian GNU/Linux
# AlmaLinux-8                     AlmaLinux OS 8
# AlmaLinux-9                     AlmaLinux OS 9
# AlmaLinux-Kitten-10             AlmaLinux OS Kitten 10
# AlmaLinux-10                    AlmaLinux OS 10
# archlinux                       Arch Linux
# FedoraLinux-43                  Fedora Linux 43
# FedoraLinux-42                  Fedora Linux 42
# eLxr                            eLxr 12.12.0.0 GNU/Linux
# Ubuntu-20.04                    Ubuntu 20.04 LTS
# Ubuntu-22.04                    Ubuntu 22.04 LTS
# OracleLinux_7_9                 Oracle Linux 7.9
# OracleLinux_8_10                Oracle Linux 8.10
# OracleLinux_9_5                 Oracle Linux 9.5
# openSUSE-Leap-15.6              openSUSE Leap 15.6
# SUSE-Linux-Enterprise-15-SP6    SUSE Linux Enterprise 15 SP6

--list 等价于 -l--online 等价于 -o,敲多了自然就用简写。

挑一个装下去:

ps1
# 通过 -d 指定发行版 Linux 名称
# wsl --install -d <NAME>
wsl --install -d Debian

# 不指定则默认安装 Ubuntu
wsl --install

第一次跑 wsl --install 不带任何参数的话,会顺带把 WSL 本体和默认 Ubuntu 一起搞定,装完一般需要重启。

如果以后想把 WSL 内核本身升一下(注意是内核,不是发行版里的包),用:

ps1
## 升级 WSL 内核(不影响已装的发行版)
wsl --update

## 顺手看看当前版本
wsl --version

查看

看一眼本机装了哪些:

ps1
## 列出已安装的 Linux
wsl --list
## 输出示例:
# Ubuntu (默认值)

## 列出已安装的 Linux 以及运行状态
wsl --list --verbose
## 输出示例:
#   NAME      STATE           VERSION
# * Ubuntu    Running         2

--verbose(即 -v)会多打印运行状态和 WSL 版本号,排查问题时几乎只用这个形式。

想知道当前默认发行版、默认版本是几,看 status:

ps1
wsl --status

## 输入示例:
# 默认分发: Ubuntu
# 默认版本: 2

启动

直接进默认发行版:

ps1
wsl

刚进去落点是 Windows 当前所在路径(通常是 /mnt/c/...),跨文件系统访问会慢,做实验我习惯让它一进去就跳到家目录:

ps1
wsl ~

机器上同时装了好几个发行版时,指定一个进:

ps1
wsl --distribution <NAME>

--distribution 简写 -d

需要换个身份(比如以 root 进去调网络,或者用某个非默认账号):

ps1
wsl --user <USER>

--user 简写 -u

如果嫌每次都要带 -d,干脆把常用的那个设成默认:

ps1
## 把某个发行版设为 wsl 命令的默认目标
wsl --set-default <NAME>

## -s 是简写
wsl -s Debian

在 WSL 1 / 2 之间切换

老发行版偶尔会停留在 WSL 1,做 P4/Mininet 时建议切到 2:

ps1
## 将某个发行版切换到 WSL 2
wsl --set-version <NAME> 2

## 让以后新装的发行版都默认走 WSL 2
wsl --set-default-version 2

转换过程会重新打包根文件系统,体积大的话要等几分钟,期间别强制关窗口。

备份与迁移

C 盘吃紧或者想把环境搬到另一台机器,用 export / import 这一对:

ps1
## 把整个发行版打包成 tar,方便备份或换机器
wsl --export Ubuntu D:\backup\ubuntu.tar

## 导入到新位置(第二个参数是落盘目录,自己起名)
wsl --import Ubuntu-dev D:\wsl\ubuntu-dev D:\backup\ubuntu.tar --version 2

导出来就是一个普通 tar 包,拷走、放云盘、再导入都可以。导入时第二个参数是新发行版在硬盘上的落盘目录,自己挑个空目录即可。

关机

平时直接关终端窗口并不会真正停掉发行版,后台还挂着。需要彻底放掉资源时:

ps1
## 关机
wsl --shutdown

## 检查
wsl -l -v
#   NAME      STATE           VERSION
# * Ubuntu    Stopped         2

这一条会把所有发行版一起停掉,包括 WSL 2 的虚拟机进程,比较干净。

只想停其中一个:

ps1
wsl --terminate <NAME>

卸载

环境玩坏了想从头再来,可以直接注销,对应的 ext4 vhdx 文件也会一并删除,没有回收站,操作前确认有备份:

ps1
wsl --unregister <NAME>