WSL,Windows Subsystem for Linux,是微软开发的轻量级虚拟机环境,允许用户在 Windows上运行完整的Linux内核和用户空间,适用于Windows的Linux子系统。能实现:
- 运行原生的Linux命令和程序(如apt,gcc,make等);
- 拥有独立的文件系统;
- 支持网络、进程等Linux功能。
另有一说,可在WSL上模拟出有限的Linux环境,而不是Linux发行版。
安装
安装WSL需要有一些前置操作。
前置操作
打开控制面板,找到【程序和功能】,点击左侧的【启用或关闭Windows功能】,勾选【适用于Linux的Windows子系统】,需要同时勾选【虚拟机平台】(下面截图未勾选):
需要重启Windows电脑生效。
Docker Desktop
安装WSL有两种方式:
- 通过Docker Desktop:实际上还是通过下面的命令行;
- 通过命令行:执行任意wsl命令行可触发WSL安装。
下载并安装Docker Desktop时会出现如下提示:
或者:
正常情况下,用管理员身份启动Docker Desktop时会触发WSL的安装或升级:
也可手动输入命令行:
安装WSL系统需要有较好的网络环境(代理),否则下载速度会非常慢。
安装成功后,输入命令wsl -v
查看WSL版本号
输入命令wsl --list
或wsl --list --verbose
查看子系统列表:
注意到在NAME前面有个*
,VERSION为2。
下面会继续论述。
WSL和Docker Desktop
Docker Desktop是Docker官方为Windows和macOS提供的一个桌面应用程序,集成:
- Docker Engine:引擎
- Docker CLI:命令行工具
- Kubernetes:可选
- 资源管理器集成
- 与WSL2的深度集成
新版Docker Desktop(v2.3+)在Windows上强烈依赖WSL2,官方推荐并默认使用WSL2作为后端运行环境。
功能 | 使用WSL2的优势 |
---|---|
完整的Linux内核支持 | Docker 需要Linux特性(如cgroups、namespaces) |
更好的性能 | 相比Hyper-V虚拟机更轻量、更快 |
文件系统互通 | 可无缝访问Windows文件系统 |
与Ubuntu等发行版共存 | 可在多个终端中使用Docker CLI |
脱离WSL2,能否在Windows上安装Docker Desktop?
从2020年以后发布的Docker Desktop版本来看,已经无法完全绕过WSL2来运行完整功能的Docker Desktop。
旧版本,如Windows 10企业版/专业版,可使用Hyper-V + Windows Containers来运行Docker Desktop,但:
- 不支持Linux容器(除非切换容器类型)
- 不适合开发者日常使用
- 很多功能受限(如挂载本地目录、构建镜像等)
参考:Windows10系统Docker for Windows与VMWare关于Hyper-V问题。
Ubuntu
上面通过Docker Desktop方式安装WSL,并启动一个docker-desktop
Linux子系统。
相信很多接触Linux的同学都是从Ubuntu开始的。WSL能不能安装Ubuntu系统呢?
当然可以,输入命令wsl --install Ubuntu
安装Ubuntu系统:
报错原因是因为开了代理,就比如此时无法打开Microsoft Store一样。
关掉代理:
解决方法:手动下载离线安装包,地址,
安装成功,输入命令wsl --list --verbose
:
在CMD下新增窗口的效果:
WSL1和WSL2
Windows1903版本以及以后还支持WSL2。WSL2基于Windows Hyper-V虚拟化技术,启用更全面的虚拟化功能。两者比较:WSL2和WSL1,两者不兼容。WSL2与大多数其他虚拟机产品在开启虚拟化加速技术诸如 Intel TV-x
/ AMD-V
时是冲突的。
特性 | WSL1 | WSL2 |
---|---|---|
内核支持 | 模拟Linux系统调用(翻译) | 完整的Linux内核(基于轻量级虚拟机) |
文件系统互通 | 支持Windows与Linux文件系统互相访问 | 访问Windows文件慢,Linux文件快 |
网络 | 与Windows共享IP地址 | 有自己的独立IP地址 |
GUI应用支持 | 默认不支持(需额外配置) | 可通过设置支持GUI应用 |
启动速度 | 快 | 稍慢(需要启动虚拟机) |
硬件支持 | 不支持USB、GPU直接访问 | 更好地支持GPU、USB(需配合驱动) |
优点 | 文件系统可以无缝互操作;性能高,启动快 | 支持完整的Linux内核功能,如docker,firewalld;更接近真实Linux环境;支持GUI、网络服务等高级功能 |
缺点 | 不支持Linux内核特性(如systemd,iptables,mount等);不适合运行需要完整Linux内核的服务或容器,如Docker | 与Windows文件系统交互较慢;有自己的IP地址,需注意防火墙设置;启动稍慢 |
适合场景 | 开发工具、脚本运行等 | 需要完整Linux环境(如Docker、内核功能) |
WSL1,模拟方式运行Linux用户态程序,不使用真正的Linux内核,将Linux系统调用翻译成Windows能理解的NT API。
WSL2,使用Hyper-V技术运行一个完整的Linux内核(轻量级虚拟机),对用户透明,所有Linux系统调用都直接运行在Linux内核中。
切换WSL版本
可为每个发行版单独设置使用的WSL版本:
wsl --set-version <DistributionName> 2
wsl --set-version <DistributionName> 1
wsl --set-version Ubuntu 2
wsl --set-version Debian 1
比如
遇到的问题,也就是上面看到的,设置为WSL1之后,Docker Desktop自动停止:
因此,对于Docker Desktop,不能使用WSL 1版本。
切换回去:
还是Stopped状态:
直接执行wsl
命令即可启动Docker Desktop(启动默认发行版):
使用
WSL安装或升级成功后的效果:
有很多概要性介绍知识。
跨文件系统工作
包括:
- 从Linux访问Windows文件
- 使用Windows文件资源管理器访问Linux文件
- 从WSL启动Windows文件和程序(TODO);
GUI应用
可通过本机Windows交互操作(例如Alt-Tab、开始菜单启动、任务栏固定以及剪切和粘贴支持)使用基于图形的Linux应用程序。
可通过sudo apt install <TheApp Narme>
在Ubuntu中尝试安装的部分应用列表:
- gedit:基本文本编辑器
- audacity:录制和编辑音频文件
- blender:制作3D动画和可视化效果
- gimp:编辑照片
- nautilus:Linux文件资源管理器
- vlc:视频播放器
GPU加速
在WSL中运行的Linux二进制文件可自动使用Windows中的GPL来加快性能。
网络集成
可以跨Windows和Linux操作系统轻松访问网络应用。
- 从Windows访问Linux网络应用
如果要在Linux分发版中生成网络应用,则可使用localhost从Windows应用(如Chrome浏览器)访问它。 - 镜像模式网络
WSL还包括一种称为镜像模式的新网络模式,添加IPv6支持等高级功能,并且能够访问局域网中的网络应用程序。
发行版管理
WSL是试用不同Linux发行版的好方法。
列出可安装的WSL发行版命令:wsl.exe -l -o
安装命名的WSL发行版命令:wsl.exe --install <DistroName>
列出可用的WSL发行版命令:wsl.exe -I
Docker Desktop集成
上面多次提及。
VS Code集成
可直接从VSCode使用WSL作为全时开发环境。
安装VSCode后,可从Windows终端安装远程WSL扩展:code -install-extension_ms-vscode-remote.remote-wsl
实战
读写文件
分两种场景:
- 在WSL中访问本地Windows;
- 在本地Windows下访问WSL系统。
在WSL2中,Windows的文件系统会自动挂载到/mnt
目录下,比如Windows下的C盘,对应路径为/mnt/c
。
在Windows中访问Ubuntu文件,打开(文件)资源管理器,输入\\wsl$
回车:
双击操作,和在Windows下一样:
设置永久挂载或软链接
如果你经常需要访问某个 Windows 文件夹,可以创建一个符号链接(软链接)到你的 home 目录:
ln -s /mnt/c/Users/YourName/Documents ~/win_docs
之后就可以用~/win_docs
来快速访问 Windows 中的文档目录。
在 Docker 中挂载 Windows 本地目录(与 WSL2 配合)
当你使用 Docker Desktop 时,它会自动处理 WSL2 和 Windows 之间的文件系统桥接。
比如你在 Docker 命令中这样写:docker run -v /mnt/c/Users/YourName/mycode:/app myimage
等价于把 Windows 的 C:\Users\YourName\mycode 挂载到了容器的 /app 目录。
注意事项:
- 不要在
/mnt
路径下运行git、npm、或编译工具(如make),因为性能差且可能导致数据损坏; - 避免在Windows资源管理器中直接编辑WSL2的Linux文件系统中的文件(如
/home/xxx
),这可能导致权限问题或文件损坏; - 推荐将项目放在Linux文件系统中(如
/home/me
),仅通过/mnt
挂载做临时拷贝或共享。
告警
wsl: 检测到 localhost 代理配置,但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理。
Docker
根据上面的提示,让我去Docker Desktop设置下,但是找了一圈还是没有找到配置入口。还是得看文档,执行命令wsl --set-default Ubuntu
再次在WSL里的Ubuntu系统执行docker,可正常使用。
参考
- 官方文档
- GPT