WSL 之 unix 模拟环境
前言
Windows Subsystem for Linux (WSL) 是微软开发的 Windows 系统组件,能让用户在 Windows 上直接运行完整的 Linux 发行版,无需虚拟机或双系统。(官方帮助文档:WSL 文档)
WSL 简介
1、核心特性
- 原生集成:与 Windows 系统深度融合,可直接访问 Windows 文件系统(如 C 盘、D 盘),也支持 Linux 与 Windows 程序相互调用。
- 轻量高效:无需单独分配硬件资源,启动速度快,资源占用远低于传统虚拟机。
- 完整 Linux 体验:支持主流 Linux 发行版(如 Ubuntu、Debian、Fedora),包含完整的 Linux 命令行工具、包管理器和软件生态。
- 双系统互通:可在 WSL 中使用 Windows 的环境变量,也能在 Windows 命令行(CMD/PowerShell)中调用 Linux 命令。
2、版本差异
- WSL 1 与 2 差异
版本 核心特点 适用场景 WSL 1 基于翻译层实现,启动更快 简单命令行操作、轻量开发 WSL 2 基于 Hyper-V 虚拟机技术,支持完整 Linux 内核 复杂开发环境、容器(Docker)、图形界面应用
3、适用场景
- 开发者在 Windows 上搭建 Linux 开发环境,无需切换系统。
- 运行 Linux 专属工具、脚本或服务(如 Shell 脚本、Node.js、Python 后端)。
- 学习 Linux 系统操作,无需单独安装 Linux 系统。
- 适配跨平台项目,确保开发环境与生产环境(Linux 服务器)一致。
4、注意事项
- 硬件要求:WSL 2 需开启 CPU 虚拟化功能(需在 BIOS 中设置),部分对硬件要求极高的 Linux 应用(如 3D 渲染)可能兼容性有限。
- 系统要求:WSL 2 要求 Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)。
WSL 安装
1、开启电脑虚拟化
1.1、重启电脑,进入 BIOS/UEFI。
1.2、开机时按特定键(通常是 F2、Del、F12 或 Esc,具体取决于主板型号)。
1.3、找到虚拟化设置(通常在 Advanced 或 CPU Configuration 中):
- Intel CPU:启用 Intel Virtualization Technology(VT-x);
- AMD CPU:启用 SVM Mode(等同于 AMD-V)。
1.4、保存设置并退出(通常按 F10)。
1.5、重启电脑进入系统确认,右键点击任务栏/任务管理器:
2、开启子系统功能
2.1、通过图形界面开启子系统功能:
- “开始/Windows 系统/控制面板/程序”

2.2、使用命令在线更新 WSL:
-
打开命令窗口 “开始/Windows PowerShell/Windows PowerShell” 右键点击选择 “以管理员身份运行” 运行:
1wsl --update #更新 WSL 内核
2.3、WSL 有 WSL1 和 WSL2,推荐使用 WSL2(性能更好)
-
以管理员身份运行 Windows PowerShell,设置使用 WSL2:
1wsl --set-default-version 2 #设置默认 WSL 版本为 2
2.4、其它操作方法
● 通过命令窗口开启子系统功能:
-
以管理员身份运行 Windows PowerShell,开启子系统功能:
1 2 3 4 5dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart #启用 WSL 功能(不指定版本,默认安装 WSL2) dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart #启用虚拟机平台(WSL2 必需) Restart-Computer #重启计算机(必须)
● 使用离线安装包更新 WSL:
- 直接打开 WSL 微软官方 GitHub 仓库下载最新版本,例如:wsl.2.6.1.0.x64.msi,下载完后直接点击文件安装即可。
3、在线安装子系统
3.1、通过在线方式安装子系统:
-
以管理员身份运行 Windows PowerShell,在线安装指定发行版:
1 2 3wsl --list --online #列出可安装的 Linux 发行版(例如:根据显示安装 Ubuntu-22.04) wsl --install -d Ubuntu-22.04 #在线安装指定发行版:Ubuntu-22.04(默认安装到C盘,不支持指定路径) #而 wsl --install 会默认安装 Ubuntu 版本PS:一般情况下 C 盘空间比较紧张,建议使用【离线导入】方法安装到 D 盘!譬如:先在线安装子系统,导出离线包;再卸载此子系统,导入离线包。
4、离线导入子系统
4.1、离线包来源:
-
从 微软文档 下载官方离线包(如 Ubuntu2204-221101.AppxBundle),但不要双击它,否则被强行安装到C盘。使用 7-Zip 或 WinRAR 将 Ubuntu2204-221101.AppxBundle/Ubuntu_2204.1.7.0_x64.appx/rootfs.tar.gz (tar 格式文件)提取出来(注:因为在第二级文件,所以需要手动进行两次解压)
-
从现有子系统中导出:
1 2 3 4 5 6 7 8 9 10 11#------【方式一】导出 .tar 镜像------ wsl --shutdown #强制关闭所有子系统(避免一些子系统干扰) wsl --list --verbose #查看已安装的发行版(例如:根据显示导出 Ubuntu-22.04) wsl --export Ubuntu-22.04 C:\temp\Ubuntu-22.04-1.tar #导出已安装的 Linux 发行版:Ubuntu-22.04 【备注:请事先创建 C:\temp 文件夹】 #------【方式二】导出.vhdx 文件------ wsl --shutdown #强制关闭所有子系统(避免一些子系统干扰) wsl --list --verbose #查看已安装的发行版(例如:根据显示导出 Ubuntu-22.04) wsl --export Ubuntu-22.04 D:\WSL\Ubuntu-22.04-2\Ubuntu-22.04-2.vhdx --vhd #导出已安装的 Linux 发行版:Ubuntu-22.04(备注:请事先创建 D:\WSL\Ubuntu-22.04-2 文件夹) #或直接复制虚拟磁盘文件,路径通常为 %USERPROFILE%\AppData\Local\Packages\<发行版Package>\LocalState\ext4.vhdx -
在已有 Docker 镜像导出:
1 2 3#------【方式三】导出 .tar 镜像------ docker ps -a #读出容器 ID,如:0301d8f4bc6e ocker export 0301d8f4bc6e > centos8.tar #导出 Docker 镜像
4.2、通过离线方式导入子系统:
-
从离线包导入子系统:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18#------【方式一】从 .tar 镜像导入------ wsl --shutdown #强制关闭所有子系统(避免一些子系统干扰) wsl --import Ubuntu-22.04-1 D:\WSL\Ubuntu-22.04-1 C:\temp\Ubuntu-22.04-1.tar --version 2 #【备注:请事先创建 D:\WSL\Ubuntu-22.04-1 文件夹】 #从离线包导入 Linux 发行版:Ubuntu-22.04(实际命名为 Ubuntu-22.04-1)(--version 2:指定使用 WSL2(推荐)如果只有 WSL2 可省略)(会在目标目录生成一个单一的 .vhdx 虚拟磁盘文件) wsl --list --verbose #查看已安装的发行版(此时可看到导入的 Ubuntu-22.04-1) wsl --shutdown #强制关闭所有子系统(避免一些子系统干扰) wsl -d Ubuntu-22.04-1 #启动子系统:Ubuntu-22.04(实际命名为 Ubuntu-22.04-1) # 为 Ubuntu-22.04 创建用户 adduser myname #创建一个新用户(用户名为 myname)(如果用户不存在,则执行时会提示设置密码(输入时不显示,输完按回车),还会询问用户的全名、房间号等信息(可直接按回车跳过)) usermod -aG sudo myname #将新用户添加到 sudo 用户组(用户名为 myname)(-a:表示 “追加”,-G:指定加入 sudo 组) echo -e "[user]\ndefault=myname" | sudo tee -a /etc/wsl.conf #设置默认登录用户(默认登录 myname 用户,而非默认的 root 用户)(/etc/wsl.conf 是 WSL 核心配置文件)(-a表示追加内容,| 表示通过管道写入,tee 表将内容输出到文件并同时显示在终端) vi /etc/wsl.conf #使用 vi 查看配置文件是否正确(按 Esc 再输入 :q! 退出) exit #退出子系统(关闭子系统) wsl --shutdown #强制关闭所有子系统(避免一些子系统干扰) wsl -d Ubuntu-22.04-1 #启动子系统:Ubuntu-22.04(实际命名为 Ubuntu-22.04-1)1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18#------【方式二】从.vhdx 文件导入------ wsl --shutdown #强制关闭所有子系统(避免一些子系统干扰) wsl --import-in-place Ubuntu-22.04-2 D:\WSL\Ubuntu-22.04-2\Ubuntu-22.04-2.vhdx ###注意:命令是 --import-in-place #从离线包导入 Linux 发行版:Ubuntu-22.04(实际命名为 Ubuntu-22.04-2)(一旦导入成功,该子系统会被 WSL 永久记录(除非手动卸载))(.vhdx 是虚拟磁盘文件,是完整的 WSL 根文件系统镜像) wsl --list --verbose #查看已安装的发行版(此时可看到导入的 Ubuntu-22.04-2) wsl --shutdown #强制关闭所有子系统(避免一些子系统干扰) wsl -d Ubuntu-22.04-2 #启动子系统:Ubuntu-22.04(实际命名为 Ubuntu-22.04-2) # 为 Ubuntu-22.04 创建用户 adduser myname #创建一个新用户(用户名为 myname)(如果用户不存在,则执行时会提示设置密码(输入时不显示,输完按回车),还会询问用户的全名、房间号等信息(可直接按回车跳过)) usermod -aG sudo myname #将新用户添加到 sudo 用户组(用户名为 myname)(-a:表示 “追加”,-G:指定加入 sudo 组) echo -e "[user]\ndefault=myname" | sudo tee -a /etc/wsl.conf #设置默认登录用户(默认登录 myname 用户,而非默认的 root 用户)(/etc/wsl.conf 是 WSL 核心配置文件)(-a表示追加内容,| 表示通过管道写入,tee 表将内容输出到文件并同时显示在终端) vi /etc/wsl.conf #使用 vi 查看配置文件是否正确(按 Esc 再输入 :q! 退出) exit #退出子系统(关闭子系统) wsl --shutdown #强制关闭所有子系统(避免一些子系统干扰) wsl -d Ubuntu-22.04-2 #启动子系统:Ubuntu-22.04(实际命名为 Ubuntu-22.04-2)
5、完全卸载子系统
5.1、直接(完全)卸载子系统:
-
以管理员身份运行 Windows PowerShell,直接卸载指定发行版:
1 2 3 4wsl --shutdown #强制关闭所有子系统(避免一些子系统干扰)(wsl --terminate <发行版名称> 命令可关闭指定子系统) wsl --list --verbose #查看已安装的发行版(此时看到将要卸载的 Ubuntu-22.04-1) wsl --unregister Ubuntu-22.04-1 #卸载子系统(无论子系统安装在何盘,子系统及其所有数据将被完全删除,必须谨慎操作!!!!!!) wsl --list --verbose #查看已安装的发行版(此时就看不到子系统 Ubuntu-22.04-1)PS:关于卸载子系统操作,无论子系统安装在何盘,子系统及其所有数据将被完全删除,必须谨慎操作!!!!!!
WSL 使用
1、子系统启动
1.1、子系统启动、设置及问题处理:
- 命令窗口运行子系统(以管理员身份运行 Windows PowerShell)

问题:提示拒绝访问,而无法启动子系统

解决:运行wsl --shutdown(注意:本指令会关闭所有子系统)后再马上执行〖启动子系统〗命令! - 直接在开始菜单打开子系统

问题:打开子系统窗口闪退
解决:在 Windows PowerShell 命令窗口执行wsl -d Ubuntu-22.04命令运行该子系统后,再在开始菜单打开子系统! - 设置子系统复制粘贴快捷键

复制内容后,直接右键点击窗口输入区即可粘贴。
2、子系统应用
2.1、在子系统里跨文件系统编译一个工程:
-
应用案例:在子系统上编译【D盘】的 ESP32 工程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19sudo apt-get update #准备安装软件工具(更新包管理器) sudo apt-get install git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0 #先安装编译ESP32所需软件工具(具体过程这里不细述) cd /mnt/d/esp32_xxx/projs/hello_world #进入【用户工程】目录 export IDF_GITHUB_ASSETS="dl.espressif.cn/github_assets" #设置临时环境变量(注意事项:如下↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓) ../../esp-idf-v5.1/install.sh esp32,esp32c2 #安装目标芯片工具(之前已安装,★这里不用重复操作★,否则可能要删除 $HOME/.espressif/ 和用户工程 build/,再执行上面两行命令) . ../../esp-idf-v5.1/export.sh #通过脚本设置当前环境变量 idf.py fullclean #清除之前编译所有文件 idf.py build #编译工程并且输出固件 #-------------------------------------------------- #---如果用到 USB 烧录固件,先要进行连接 USB 操作--- #---具体操作方法请看下一节【子系统 USB】内容介绍--- #------------------------------------------------------------------------------------------------------------------- # #sudo usermod -a -G dialout $USER #将用户添加到[dialout]组(配置串口写操作权限,★只需操作一次即可★) # #reboot #修改后要重启电脑 (配置串口写操作权限,★只需操作一次即可★) # idf.py -p /dev/ttyUSB0 flash #通过串口下载固件(比如 Windows 下的 COM3 串口,Linux 下的 /dev/ttyUSB0 串口) # idf.py -p /dev/ttyUSB0 monitor #通过串口监控调试(Ctrl+] 组合键退出监视) #-------------------------------------------------------------------------------------------------------------------PS:个人更建议将工程放置于子系统中进行编译构建,代码编辑工作则在 Windows 环境下完成,兼顾编译稳定性与编辑便捷性。
PS:对比 VMware 虚拟机与 WSL 的跨文件系统操作,VMware 相关系统或工具极易出现因文件所有权问题无法正常运行!
3、子系统 USB
3.1、在子系统里使用 USB 设备:
-
在 WSL2 中连接 USB 设备,需要安装【USB/IP】服务端和客户端。
-
首先打开两个命令窗口:以管理员身份打开 PowerShell,在另外窗口启动子系统(Ubuntu)。
-
安装 USB/IP 服务端:在 Windows 上安装(如 usbipd-win_5.3.0_x64.msi)。
-
安装 USB/IP 客户端:在 Ubuntu 上安装(如 usbip-utils 2.0),命令如下:
1 2 3 4 5sudo apt update #准备安装软件工具(更新包管理器) sudo apt install linux-tools-generic hwdata #安装 USB/IP 客户端(用于连接 Windows 的 USB 设备) sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*-generic/usbip 20 #设置`usbip`命令的执行工具(创建工具链软链接) #usbip version #查看 usbip 版本(如 usbip-utils 2.0) -
USB/IP 服务端上连接:在 Windows PowerShell 上操作
1 2 3 4 5 6usbipd list #列出 Win 的 USB 设备(找到的目标设备 BUSID,如 1-3)(如果没启动则 Start-Service usbipd 启动服务,命令 Get-Service usbipd 可查看服务运行状态) usbipd bind --busid 1-3 #将目标设备【绑定】到【WSL】(加载的目标设备 BUSID,如 1-3)(绑定后状态:1-3 10c4:ea60 Silicon Labs CP210x USB to UART Bridge (COM4) Shared) usbipd attach --wsl --busid 1-3 #将目标设备【附加】到【子系统客户端】 (附加后状态:1-3 10c4:ea60 Silicon Labs CP210x USB to UART Bridge (COM4) Attached) #usbipd detach --busid 1-3 #将目标设备【分离】自【子系统客户端】 (分离后状态:1-3 10c4:ea60 Silicon Labs CP210x USB to UART Bridge (COM4) Shared) #usbipd unbind --busid 1-3 #将目标设备【解绑】自【WSL】(移除的目标设备 BUSID,如 1-3)(解绑后状态:1-3 10c4:ea60 Silicon Labs CP210x USB to UART Bridge (COM4) Not shared) -
USB/IP 客户端上查看:在子系统(Ubuntu)上操作
1 2 3lsusb #查看已连接的 USB 设备(可查看到 USB 一些信息) ls -l /dev/tty* #查看串口设备(若为开发板/传感器)(如串口设备通常显示为 /dev/ttyUSB0 或 /dev/ttyACM0) #例如看到:crw-rw---- 1 root dialout 188, 0 Nov 14 20:42 /dev/ttyUSB0
4、Ubuntu 与 Windows 互访
4.1、Ubuntu 与 Windows 互访及问题处理:
- Ubuntu 访问 Windows 文件(夹),例如访问 C 盘,在 WSL 命令窗口直接运行
cd /mnt/c/即可访问。 - Windows 访问 Ubuntu 文件(夹),在 Windows 系统文件浏览器地址栏输入
\\wsl$,即可看到已安装的 Linux 发行版,双击进入其文件系统(如\\wsl$\Ubuntu-22.04\home\你的用户名)。在 Windows PowerShell 命令窗口也是这样访问,例如:cd \\wsl$\Ubuntu-22.04进入目录访问即可。
问题:提示无权限访问,并弹出提示窗口

解决:在 Windows PowerShell 命令窗口中执行wsl -d Ubuntu-22.04命令启动该子系统后,Windows 即可恢复对 Ubuntu 文件(夹)的正常访问!
PS:有一个开源工具 WSLHostPatcher 可用于解决 Windows 访问 Ubuntu 文件(夹)问题,具体方法请自行测试!
5、安装运行 Linux 图形应用
5.1、安装运行 Linux 图形应用:
6、WSL 常用命令速查表
6.1、WSL 常用命令速查表:
-
常用命令及功能
命令 功能 示例 wsl --update更新 WSL 内核 略 wsl --status查看 WSL 状态信息 略 wsl --set-default-version 2设置默认 WSL 版本为 2 略 wsl --list --verbose查看已安装的[发行版][运行状态][WSL版本] wsl -l -v(简写)wsl --set-version <发行版名称> 2将指定发行版切换为 WSL 2 wsl --set-version Ubuntu-22.04 2wsl --set-default <发行版名称>修改默认 WSL 实例 wsl --set-default Ubuntu-22.04wsl --shutdown关闭所有 WSL 实例 wsl --shutdownwsl --terminate <发行版名称>终止指定发行版 wsl -t Ubuntu-22.04(简写)wsl --distribution <发行版名称>启动指定发行版 wsl -d Ubuntu-22.04(简写)wsl --user <用户名>以指定用户运行默认 WSL 实例 wsl --user rootwsl --list --online列出可安装的 Linux 发行版(需要保持网络畅通) wsl -l -o(简写)wsl --install -d <发行版名称>安装指定发行版(需要保持网络畅通) wsl --install -d Ubuntu-22.04wsl --unregister <发行版名称>卸载指定发行版【谨慎操作!】 略 PS:“WSL 实例”、“发行版”、“子系统” 都是指某个子系统(linux)!
WSL 比较
点击展开内容
Cygwin、UnxUtils 和 WSL(Windows Subsystem for Linux)都是为 Windows 提供类 Unix 工具或环境的方案,但三者的设计目标、技术原理和适用场景差异显著。以下从核心定位、功能特性、适用场景等维度进行对比:
一、核心定位与技术原理
| 工具 | 核心定位 | 技术原理 |
|---|---|---|
| UnxUtils | 轻量的 Unix 命令移植工具集,仅提供常用 Unix 命令的 Windows 可执行文件。 | 将单个 Unix 命令(如 grep、sed)直接编译为 Windows 原生 .exe,无需依赖层,直接在 CMD/PowerShell 中运行。 |
| Cygwin | 提供 类 Unix 工具链与开发环境,支持编译和运行 Unix 程序。 | 通过 cygwin1.dll 模拟 Linux 系统调用,将 Unix 程序的系统调用翻译为 Windows 调用,需通过 Cygwin 工具链重新编译程序。 |
| WSL | 提供 完整的 Linux 发行版环境,支持原生 Linux 二进制程序和生态。 | WSL 1 基于翻译层,WSL 2 基于轻量虚拟机和完整 Linux 内核,直接运行原生 Linux 程序(无需重新编译)。 |
二、核心功能对比
| 功能维度 | UnxUtils | Cygwin | WSL(以 WSL 2 为主) |
|---|---|---|---|
| 工具覆盖范围 | 仅包含基础命令(约 100+,如 ls、awk),无包管理。 |
包含完整工具链(gcc、bash、ssh 等),支持通过 apt-cyg 扩展。 |
支持所有 Linux 发行版工具(通过 apt/yum 安装),覆盖开发、服务、容器等全场景。 |
| 兼容性 | 仅支持命令的基础功能,部分参数与原生 Unix 有差异(如路径处理)。 | 需通过 Cygwin 编译的程序才能运行,部分复杂 Unix 程序可能不兼容。 | 直接运行原生 Linux 二进制文件(.deb/.rpm),兼容性接近真实 Linux 系统。 |
| 性能 | 极轻量,单命令启动快,无额外开销。 | 系统调用翻译有开销,IO 密集型任务(如文件操作)较慢。 | 本地文件系统性能接近原生 Linux,访问 Windows 文件稍慢,整体性能远高于前两者。 |
| 文件系统互通 | 直接使用 Windows 路径(如 C:\),无权限模拟。 |
映射 Windows 磁盘为 /cygdrive/c,模拟 Linux 权限(有限)。 |
挂载 Windows 磁盘到 /mnt/c,Windows 可通过 \\wsl$ 访问 WSL 文件,权限管理完整。 |
| 生态与扩展性 | 无扩展性,仅固定命令集。 | 支持编译 Unix 程序,可搭建简单开发环境(如 C 语言)。 | 支持完整 Linux 生态:服务(nginx、MySQL)、容器(Docker)、图形应用(WSLg)等。 |
| 系统要求 | 无特殊要求,支持所有 Windows 版本。 | 支持 Windows 7+,无需虚拟化功能。 | 需 Windows 10 2004+ 或 11,WSL 2 需开启 CPU 虚拟化。 |
| 资源占用 | 极低(仅单个 .exe 文件)。 |
中等(依赖 cygwin1.dll 和工具集)。 |
较高(包含 Linux 内核),但远低于传统虚拟机。 |
三、适用场景
选择 UnxUtils 的情况
- 临时轻量需求:仅需少数 Unix 命令(如
grep文本搜索、tar解压),无需复杂环境。 - 快速集成:在 CMD/PowerShell 脚本中直接调用 Unix 命令,无需额外配置环境。
- 旧系统或资源受限:适用于 Windows XP 等老旧系统,或对资源占用有严格限制的场景。
选择 Cygwin 的情况
- 跨平台开发:需要在 Windows 上编译针对 Unix/Linux 的程序(依赖 Cygwin 工具链)。
- 中等复杂度工具链:需要
bash脚本、make编译、ssh远程等功能,但无需完整 Linux 生态。 - 不支持 WSL 的系统:如 Windows 7,或无法开启虚拟化的设备。
选择 WSL 的情况
- 深度开发环境:需要完整 Linux 工具链(如 Python/Node.js 后端、
systemd服务)。 - 容器与云原生:使用 Docker、Kubernetes 等工具,或开发云原生应用(与生产环境一致)。
- 复杂脚本与服务:运行依赖 Linux 特有库的程序(如
ffmpeg高级功能、科研软件)。 - 图形应用:需要运行 Linux GUI 程序(如 VS Code 远程、GIMP 等)。
四、总结
| 工具 | 优势 | 劣势 | 一句话定位 |
|---|---|---|---|
| UnxUtils | 极轻量、零配置、兼容性广 | 功能有限、无扩展性、命令兼容性一般 | “Unix 命令的 Windows 便携版” |
| Cygwin | 支持开发工具链、可编译 Unix 程序 | 性能一般、兼容性依赖编译、配置较繁琐 | “类 Unix 开发模拟器” |
| WSL | 原生 Linux 体验、完整生态、高性能 | 系统版本要求高、需虚拟化、资源占用较高 | “Windows 中的 Linux 子系统” |
选择建议:
- 简单命令需求 → UnxUtils;
- 跨平台编译或老旧系统 → Cygwin;
- 开发、容器、完整 Linux 环境 → WSL(首选 WSL 2)。







