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自动启用,但如果之前手动关过,需要重新勾上。
安装
先看微软仓库里列出的可装发行版:
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,敲多了自然就用简写。
挑一个装下去:
# 通过 -d 指定发行版 Linux 名称
# wsl --install -d <NAME>
wsl --install -d Debian
# 不指定则默认安装 Ubuntu
wsl --install第一次跑 wsl --install 不带任何参数的话,会顺带把 WSL 本体和默认 Ubuntu 一起搞定,装完一般需要重启。
如果以后想把 WSL 内核本身升一下(注意是内核,不是发行版里的包),用:
## 升级 WSL 内核(不影响已装的发行版)
wsl --update
## 顺手看看当前版本
wsl --version查看
看一眼本机装了哪些:
## 列出已安装的 Linux
wsl --list
## 输出示例:
# Ubuntu (默认值)
## 列出已安装的 Linux 以及运行状态
wsl --list --verbose
## 输出示例:
# NAME STATE VERSION
# * Ubuntu Running 2--verbose(即 -v)会多打印运行状态和 WSL 版本号,排查问题时几乎只用这个形式。
想知道当前默认发行版、默认版本是几,看 status:
wsl --status
## 输入示例:
# 默认分发: Ubuntu
# 默认版本: 2启动
直接进默认发行版:
wsl刚进去落点是 Windows 当前所在路径(通常是 /mnt/c/...),跨文件系统访问会慢,做实验我习惯让它一进去就跳到家目录:
wsl ~机器上同时装了好几个发行版时,指定一个进:
wsl --distribution <NAME>--distribution 简写 -d。
需要换个身份(比如以 root 进去调网络,或者用某个非默认账号):
wsl --user <USER>--user 简写 -u。
如果嫌每次都要带 -d,干脆把常用的那个设成默认:
## 把某个发行版设为 wsl 命令的默认目标
wsl --set-default <NAME>
## -s 是简写
wsl -s Debian在 WSL 1 / 2 之间切换
老发行版偶尔会停留在 WSL 1,做 P4/Mininet 时建议切到 2:
## 将某个发行版切换到 WSL 2
wsl --set-version <NAME> 2
## 让以后新装的发行版都默认走 WSL 2
wsl --set-default-version 2转换过程会重新打包根文件系统,体积大的话要等几分钟,期间别强制关窗口。
备份与迁移
C 盘吃紧或者想把环境搬到另一台机器,用 export / import 这一对:
## 把整个发行版打包成 tar,方便备份或换机器
wsl --export Ubuntu D:\backup\ubuntu.tar
## 导入到新位置(第二个参数是落盘目录,自己起名)
wsl --import Ubuntu-dev D:\wsl\ubuntu-dev D:\backup\ubuntu.tar --version 2导出来就是一个普通 tar 包,拷走、放云盘、再导入都可以。导入时第二个参数是新发行版在硬盘上的落盘目录,自己挑个空目录即可。
关机
平时直接关终端窗口并不会真正停掉发行版,后台还挂着。需要彻底放掉资源时:
## 关机
wsl --shutdown
## 检查
wsl -l -v
# NAME STATE VERSION
# * Ubuntu Stopped 2这一条会把所有发行版一起停掉,包括 WSL 2 的虚拟机进程,比较干净。
只想停其中一个:
wsl --terminate <NAME>卸载
环境玩坏了想从头再来,可以直接注销,对应的 ext4 vhdx 文件也会一并删除,没有回收站,操作前确认有备份:
wsl --unregister <NAME>