WSL2的安装与使用
# WSL2的安装与使用
# 什么是 WSL?
WSL(Windows Subsystem for Linux,适用于 Linux 的 Windows 子系统)是微软在 Windows 10/11 中内置的 Linux 兼容层,让你无需虚拟机或双系统,直接在 Windows 上运行 Linux 环境。
目前有两个版本:
| 版本 | 架构 | Linux 内核 | Docker 支持 | 文件系统性能 | 兼容性 |
|---|---|---|---|---|---|
| WSL1 | 系统调用翻译层 | 无(转译为 Windows 调用) | ❌ 不支持 | Windows 文件快 | 部分软件不兼容 |
| WSL2 | 轻量级虚拟机 | ✅ 完整 Linux 内核 | ✅ 原生支持 | Linux 文件快 | 接近 100% |
# WSL2 vs WSL1:为什么选 WSL2?
WSL2 全面优于 WSL1,日常使用务必选 WSL2:
- 完整 Linux 内核:WSL2 运行真正的 Linux 内核(微软维护),几乎所有 Linux 软件都能跑
- 原生 Docker 支持:WSL1 跑不了 Docker,WSL2 可以直接安装 Linux 版 Docker
- systemd 支持:Win11 上的 WSL2 支持 systemd,可以用
systemctl管理服务 - 性能更好:在 Linux 文件系统(
/home/)下 I/O 性能远超 WSL1
⚠️ 唯一例外:如果你的项目文件放在 Windows 盘(
/mnt/c/)下且需要频繁读写,WSL1 的跨文件系统性能反而更好。但一般建议把项目放在 WSL 内部(~/projects/),用 WSL2。
# WSL1 和 WSL2 的关系
WSL1 和 WSL2 共用同一套安装机制,不需要分别安装。区别只在于版本切换:
wsl --install在新系统上默认安装 WSL2- WSL1 通过
wsl --set-version命令切换即可,无需单独安装
# 把某个发行版降级为 WSL1
wsl --set-version Ubuntu-22.04 1
# 升回 WSL2
wsl --set-version Ubuntu-22.04 2
# 设置以后新安装的发行版默认用哪个版本
wsl --set-default-version 1 # 默认 WSL1
wsl --set-default-version 2 # 默认 WSL2(推荐)
2
3
4
5
6
7
8
9
⚠️ 老版本 Windows 10(内部版本 19041 之前)只支持 WSL1,没有 WSL2。这种系统上
wsl --install装的就是 WSL1。建议升级 Windows 到较新版本以使用 WSL2。
# 安装 WSL2
# 前置要求
- Windows 10 版本 2004+(内部版本 19041+)或 Windows 11
- BIOS 中已开启虚拟化(Intel VT-x / AMD-V),一般默认开启
- 查看系统版本:
Win + R→winver
# 方式一:一键安装(推荐,Win11 / 较新 Win10)
以管理员身份打开 PowerShell(右键开始菜单 → "终端(管理员)"),执行:
wsl --install
这条命令会自动完成:
- 启用
Virtual Machine Platform和WSL功能 - 下载并安装 WSL2 Linux 内核
- 设置 WSL2 为默认版本
- 安装默认发行版(Ubuntu)
安装完成后重启电脑。
⚠️ 注意:在某些 Windows 版本上,
wsl --install只会启用功能并安装内核,不会自动安装发行版。重启后执行wsl -l -v如果提示"没有已安装的分发",需手动安装发行版:# 查看可用发行版 wsl --list --online # 安装 Ubuntu 22.04 wsl --install -d Ubuntu-22.041
2
3
4
5也可以打开 Microsoft Store 搜索 "Ubuntu 22.04 LTS" 安装(通常比命令行下载快)。
# 方式二:手动安装(老版本 Win10 或一键安装失败)
步骤 1:启用 WSL 和虚拟机平台功能
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
2
重启电脑。
步骤 2:下载并安装 WSL2 Linux 内核更新包
- 下载地址:https://aka.ms/wsl2kernel
- 下载
wsl_update_x64.msi,双击安装
步骤 3:设置 WSL2 为默认版本
wsl --set-default-version 2
步骤 4:安装 Linux 发行版
- 打开 Microsoft Store,搜索 "Ubuntu 22.04 LTS",点击安装
- 或命令行安装:
wsl --install -d Ubuntu-22.04
# 初始化 Ubuntu
首次启动 Ubuntu(开始菜单 → Ubuntu),会要求设置:
Installing, this may take a few minutes...
Please create a default UNIX user account.
The username only needs to match the name of a Linux user, not your Windows user.
Enter new UNIX username: cmty ← 输入用户名(小写字母)
New password: 123456 ← 输入密码(不显示字符,正常现象)
Retype new password: 123456 ← 再次输入确认
2
3
4
5
6
7
设置完成后进入 shell,安装成功。
# 验证安装
PowerShell 执行:
wsl -l -v
正常输出:
NAME STATE VERSION
* Ubuntu-22.04 Running 2
2
⚠️ VERSION 列必须是
2。如果是1,手动转换:wsl --set-version Ubuntu-22.04 21
# 安装其他发行版
查看可用发行版:
wsl --list --online
安装指定发行版:
wsl --install -d Debian
wsl --install -d openSUSE-Tumbleweed
2
# 基础配置
# 1. 换国内软件源(加速 apt)
Ubuntu 默认使用国外源,下载慢。进入 Ubuntu shell 执行:
# Ubuntu 22.04 及更早版本
sudo sed -i 's|http://archive.ubuntu.com|http://mirrors.aliyun.com|g' /etc/apt/sources.list
sudo sed -i 's|http://security.ubuntu.com|http://mirrors.aliyun.com|g' /etc/apt/sources.list
sudo apt update && sudo apt upgrade -y
2
3
4
ℹ️ Ubuntu 24.04 源文件路径改为
/etc/apt/sources.list.d/ubuntu.sources,需手动编辑该文件替换 URL。
# 2. 启用 systemd(Win11 推荐)
systemd 是 Linux 的初始化系统和服务管理器。启用后可以用 systemctl 管理 Docker、MySQL 等服务,和真实 Linux 体验一致。
sudo tee /etc/wsl.conf <<EOF
[boot]
systemd=true
EOF
2
3
4
PowerShell 执行 wsl --shutdown,重新进入 Ubuntu,验证:
systemctl status
# 3. 限制 WSL2 内存占用
可选,WSL2 自带 WSL Settings 可以进行图形化配置
WSL2 默认最多占用一半物理内存,且不主动释放。在 Windows 用户目录创建 C:\Users\你的用户名\.wslconfig:
[wsl2]
memory=8GB
processors=4
swap=2GB
2
3
4
按你电脑配置调整。修改后 PowerShell 执行 wsl --shutdown 重启生效。
# 4. 配置默认用户
如果安装时设置了用户名,但想切换默认登录用户为 root 或其他用户:
# 在 /etc/wsl.conf 中添加
sudo tee -a /etc/wsl.conf <<EOF
[user]
default=cmty
EOF
# 检查一下
cat /etc/wsl.conf
2
3
4
5
6
7
8
9
PowerShell 执行 wsl --shutdown 后重新进入生效。
# 日常使用
# 进入 WSL
| 方式 | 操作 |
|---|---|
| 开始菜单 | 搜索 "Ubuntu" → 点击打开 |
| 命令行 | PowerShell / CMD 输入 wsl |
| Windows Terminal | 推荐,支持多标签页(Win11 自带,Win10 从 Store 安装) |
| VS Code | 安装 WSL 扩展,在 WSL shell 中执行 code . 打开项目 |
# 常用 WSL 命令(在 PowerShell / CMD 中执行)
wsl # 进入默认 WSL 实例
wsl -d Ubuntu-22.04 # 进入指定发行版
wsl -l -v # 查看所有发行版及版本
wsl --shutdown # 关闭所有 WSL 实例(释放内存)
wsl --update # 更新 WSL 内核
wsl --unregister Ubuntu-22.04 # 卸载指定发行版(⚠️ 会删除所有数据)
wsl --export Ubuntu-22.04 D:\ubuntu-backup.tar # 导出备份
wsl --import Ubuntu-22.04 D:\wsl\ubuntu D:\ubuntu-backup.tar # 导入恢复
2
3
4
5
6
7
8
# 文件互访
| 方向 | 路径 |
|---|---|
| Windows 访问 WSL 文件 | 资源管理器输入 \\wsl$\Ubuntu-22.04\home\cmty |
| WSL 访问 Windows 文件 | /mnt/c/Users/你的用户名/(C 盘)、/mnt/d/(D 盘) |
💡 性能建议:项目文件放在 WSL 内部(如
~/projects/),I/O 性能比放在 Windows 盘(/mnt/c/)好 10 倍以上。用 VS Code WSL 模式编辑即可。
# VS Code 集成(推荐开发方式)
- Windows 安装 VS Code
- 安装扩展 WSL(微软官方)
- 在 WSL shell 中进入项目目录:
cd ~/projects/my-app code .1
2 - VS Code 会以 WSL 环境打开,左下角显示
WSL: Ubuntu-22.04,此时所有终端、调试、扩展都在 Linux 环境运行
# 在 WSL2 中安装 Docker
⚠️ 强烈建议:不要装 Docker Desktop(占内存大、启动慢、商用收费),直接在 WSL2 里装 Linux 版 Docker。
# 安装 Docker
# 一键安装(使用阿里云镜像加速)
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 将当前用户加入 docker 组(免 sudo 运行 docker)
sudo usermod -aG docker $USER
# 启动 docker
# 未启用 systemd 时:
sudo service docker start
# 启用 systemd 后:
sudo systemctl enable docker
sudo systemctl start docker
# 验证安装
docker run hello-world
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ℹ️ 加入 docker 组后需要重新登录或执行
newgrp docker才能免 sudo。
# 配置 Docker 镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.com"
]
}
EOF
# 启用 systemd 时(设置自动启动):
sudo systemctl daemon-reload
sudo systemctl restart docker
# 未启用 systemd 时:
sudo service docker restart
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Docker Compose
Docker 20.10+ 已内置 docker compose 子命令(V2 版本),无需单独安装 docker-compose。
docker compose version # 验证
# 网络与端口
# WSL2 访问 Windows 服务
WSL2 中可以直接用 localhost 访问 Windows 上运行的服务:
# Windows 上跑了一个服务在 8080 端口
curl http://localhost:8080
2
# Windows 访问 WSL2 服务
WSL2 的端口会自动转发到 Windows,直接用 localhost 即可:
# WSL 中启动一个服务
python3 -m http.server 8000
2
Windows 浏览器访问 http://localhost:8000 即可。
# 获取 WSL2 的 IP 地址
WSL2 每次重启 IP 可能变化(172.x.x.x 网段):
# 在 WSL 中执行
hostname -I
# 输出示例(可能返回多个 IP,用空格分隔):
# 172.20.123.45 172.17.0.1
# 或查看指定网卡
ip addr show eth0
2
3
4
5
6
7
💡 为什么会有多个 IP?
hostname -I会返回所有网卡的 IP,常见的两个来源:
IP 来源 说明 172.20.123.45WSL2 虚拟网卡(eth0) WSL2 实例本身的 IP,Windows 通过它和 WSL2 通信 172.17.0.1Docker 的 docker0 网桥 安装 Docker 后自动创建,所有容器默认走这个网段( 172.17.0.x)日常开发基本不用关心这些 IP,因为 Windows 访问 WSL2/Docker 服务都可以直接用
localhost(自动端口转发)。只有在需要从局域网其他设备访问、或某些工具不支持localhost时才需要用真实 IP。
# 固定 WSL2 IP(可选)
如果需要固定 IP,可以在 Windows 的 hosts 文件中添加:
# C:\Windows\System32\drivers\etc\hosts
172.20.123.45 wsl.local
2
IP 用 wsl hostname -I 获取(取 eth0 对应的那个,即第一个 IP)。但更推荐用 localhost 或 Docker 端口映射,不需要固定 IP。
# 常见问题
# Q1: WSL2 占用内存越来越大?
WSL2 不用时不主动释放内存。解决方法:
# 方法 1:手动关闭释放
wsl --shutdown
# 方法 2:配置内存上限(C:\Users\你的用户名\.wslconfig)
[wsl2]
memory=8GB
swap=2GB
2
3
4
5
6
7
# Q2: Windows 重启后 WSL 里的 Docker 没启动?
- 启用 systemd 时:执行过
sudo systemctl enable docker会自动启动 - 未启用 systemd 时:需手动执行
sudo service docker start
# Q3: wsl --install 下载很慢?
- 使用手机热点临时加速
- 等网络空闲时段重试
- 改用手动安装方式,从 Microsoft Store 安装 Ubuntu(通常更快)
# Q4: 报错 WslRegisterDistribution failed with error: 0x800701bc?
WSL2 内核未更新。解决:
- 下载 https://aka.ms/wsl2kernel 的
wsl_update_x64.msi并安装 - 或 PowerShell 执行
wsl --update
# Q5: 报错 0x80370102(虚拟机无法启动)?
BIOS 虚拟化未开启。解决:
- 重启电脑进入 BIOS
- 找到 Intel VT-x / AMD-V / Virtualization Technology 选项,设为
Enabled - 保存重启
# Q6: 如何迁移 WSL2 到其他磁盘?
# 1. 关闭 WSL
wsl --shutdown
# 2. 导出
wsl --export Ubuntu-22.04 D:\ubuntu-backup.tar
# 3. 注销原实例
wsl --unregister Ubuntu-22.04
# 4. 导入到新位置
wsl --import Ubuntu-22.04 D:\wsl\ubuntu D:\ubuntu-backup.tar
# 5. 设置默认用户(导入后默认是 root)
ubuntu2204.exe config --default-user cmty
2
3
4
5
6
7
8
9
10
11
12
13
14
# Q7: 如何在多个 WSL 发行版之间切换?
wsl -d Ubuntu-22.04 # 进入指定发行版
wsl --setdefault Ubuntu-22.04 # 设置默认发行版
2
# 实用配置示例:Docker Compose 部署开发环境
在 WSL2 中创建 ~/docker-compose.yml,一键部署 MySQL + Redis + MinIO:
# 创建文件
touch docker-compose.yml
# 或使用 nano 编辑器
nano ~/docker-compose.yml
2
3
4
💡 端口加前缀避免冲突:Windows 本地可能已装了 MySQL(3306)、Redis(6379)等服务。建议把容器映射到 Windows 的端口加个前缀(如
1),即13306:3306,避免和本地服务冲突。容器内部端口保持不变(3306/6379),只是映射到 Windows 的端口变了。
services:
mysql:
image: mysql:8.0
ports: ["13306:3306"] # Windows 用 13306 连接,容器内仍是 3306
environment:
MYSQL_ROOT_PASSWORD: "123456"
MYSQL_DATABASE: "mydb"
volumes: ["mysql_data:/var/lib/mysql"]
restart: unless-stopped
redis:
image: redis:7
ports: ["16379:6379"] # Windows 用 16379 连接,容器内仍是 6379
command: redis-server --requirepass 123321
volumes: ["redis_data:/data"]
restart: unless-stopped
minio:
image: minio/minio
ports: ["19000:9000", "19001:9001"] # API 用 19000,控制台用 19001
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
command: server /data --console-address ":9001"
volumes: ["minio_data:/data"]
restart: unless-stopped
volumes:
mysql_data:
redis_data:
minio_data:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
启动:
docker compose up -d # 后台启动所有服务
docker compose ps # 查看运行状态
docker compose down # 停止并移除容器
2
3
Windows 连接地址(WSL2 端口自动转发):
| 服务 | 连接地址 | 说明 |
|---|---|---|
| MySQL | localhost:13306 | 用 Navicat/DataGrip 等客户端连接 |
| Redis | localhost:16379 | 用 RedisInsight/RDM 等客户端连接 |
| MinIO API | http://localhost:19000 | 项目代码里配置的 endpoint |
| MinIO 控制台 | http://localhost:19001 | 浏览器访问,账号 minioadmin/minioadmin |
# restart 重启策略说明
restart 字段决定容器退出后是否自动重启,常用取值:
| 策略 | 含义 | 适用场景 |
|---|---|---|
no | 默认值,容器退出后不重启 | 一次性任务 |
always | 总是重启(手动 docker stop 后,重启 Docker 也会拉起) | 生产环境关键服务 |
unless-stopped | 除非手动停止,否则自动重启(手动 stop 后,重启 Docker 不会拉起) | 推荐,日常开发/生产 |
on-failure | 仅在非零退出码时重启,可加最大次数 on-failure:3 | 可能异常退出的服务 |
💡 推荐用
unless-stopped:日常崩溃/重启电脑会自动恢复,但你手动 stop 后不会偷偷拉起来,方便维护。
# 部署项目:复用组件还是新建?
推荐复用,把项目服务加到同一个 docker-compose.yml 里。原因:
- 网络互通:同一 compose 文件的服务自动在一个网络里,项目容器可以用服务名直接连
mysql:3306、redis:6379,不用配 IP - 统一管理:一条
docker compose up -d全部启动,docker compose down全部停止 - 依赖顺序:
depends_on保证 MySQL 先启动,项目后启动
# 示例:若依项目部署
services:
# ===== 基础组件 =====
mysql:
image: mysql:8.0
ports: ["13306:3306"] # Windows 用 13306 连接,容器内仍是 3306
environment:
MYSQL_ROOT_PASSWORD: "123456"
MYSQL_DATABASE: "ry-vue" # 若依默认库名
volumes:
- mysql_data:/var/lib/mysql
- ./sql/ry_20240629.sql:/docker-entrypoint-initdb.d/ry_20240629.sql # 初始化 SQL
- ./sql/ry_config_20240629.sql:/docker-entrypoint-initdb.d/ry_config_20240629.sql
restart: unless-stopped
redis:
image: redis:7
ports: ["16379:6379"] # Windows 用 16379 连接,容器内仍是 6379
command: redis-server --requirepass 123321
volumes: ["redis_data:/data"]
restart: unless-stopped
# ===== 若依后端(Spring Boot)=====
ruoyi-admin:
build: ./ruoyi-admin # 后端 Dockerfile 所在目录
ports: ["18080:8080"] # Windows 用 18080 访问,容器内仍是 8080
# environment 是可选的:如果 application.yml 里的配置和 compose 服务名/端口/密码一致,就不用写
# 这里用 environment 覆盖,是因为若依默认 yml 里写的是 localhost,容器内连不到
environment:
# MySQL:容器间用服务名 + 容器内端口
SPRING_DATASOURCE_DRUID_MASTER_URL: jdbc:mysql://mysql:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
SPRING_DATASOURCE_DRUID_MASTER_USERNAME: root
SPRING_DATASOURCE_DRUID_MASTER_PASSWORD: "123456"
# Redis:容器间用服务名 + 容器内端口
SPRING_DATA_REDIS_HOST: redis
SPRING_DATA_REDIS_PORT: "6379"
SPRING_DATA_REDIS_PASSWORD: "123321"
depends_on:
- mysql
- redis
restart: unless-stopped
# ===== 若依前端(Vue3 + Nginx)=====
ruoyi-ui:
build: ./ruoyi-ui # 前端 Dockerfile 所在目录
ports: ["180:80"] # Windows 用 180 访问,容器内仍是 80
depends_on:
- ruoyi-admin
restart: unless-stopped
volumes:
mysql_data:
redis_data:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
💡 说明:
- 后端:若依
ruoyi-admin模块打包成 jar,用 Dockerfile 构建。环境变量覆盖application.yml中的数据库/Redis 配置(Spring Boot 自动绑定)- 前端:
ruoyi-ui构建后用 Nginx 托管静态文件,并反向代理/prod-api到后端ruoyi-admin:8080(容器间通信用服务名)- MySQL 初始化:把若依的 SQL 文件挂载到
/docker-entrypoint-initdb.d/,MySQL 首次启动会自动执行- MinIO:若依默认配置已支持 OSS,如需本地文件存储再加 minio 服务
# environment 是可选的
environment 字段不是必须的,取决于 application.yml 的配置情况:
| 情况 | 是否需要 environment | 说明 |
|---|---|---|
application.yml 里写的是 localhost:3306 | ✅ 需要 | 容器内 localhost 是容器自己,连不到 MySQL,必须用 environment 覆盖成服务名 mysql |
application.yml 里已改成 mysql:3306(服务名) | ❌ 不需要 | yml 配置和 compose 服务名一致,直接用 yml 即可 |
用 Spring Profile 区分环境(application-docker.yml) | ❌ 不需要 | 打包时指定 --spring.profiles.active=docker,用专门的 docker 配置文件 |
两种配置方式对比:
# 方式 1:用 environment 覆盖(不改 yml,推荐)
# 优点:yml 保持默认值,方便本地 IDE 调试;docker 部署时用环境变量覆盖
ruoyi-admin:
environment:
SPRING_DATASOURCE_DRUID_MASTER_URL: jdbc:mysql://mysql:3306/ry-vue
# 方式 2:直接改 application.yml(不用 environment)
# 优点:compose 文件更简洁
# 缺点:yml 改成服务名后,本地 IDE 跑项目就连不上 docker 里的 MySQL 了,需要再改回来
# application-druid.yml:
# url: jdbc:mysql://mysql:3306/ry-vue ← 改成服务名
2
3
4
5
6
7
8
9
10
11
💡 推荐方式 1:保持
application.yml用localhost(方便本地 IDE 调试连 Windows 上的 MySQL),docker 部署时用environment覆盖成服务名。这样一套代码既能本地跑,也能 docker 部署,不用改来改去。
# 什么时候分开?
| 场景 | 建议 | 原因 |
|---|---|---|
| 开发环境 | 基础组件单独一个 compose 常驻,项目用 IDE 跑 | 方便调试,不用每次重启数据库 |
| 生产/演示环境 | 全部合并到一个 compose,一键部署 | 统一管理,依赖有序 |
# 项目容器内如何连接 MySQL/Redis?
⚠️ 关键:用服务名作为主机名,不要写
localhost!
# ❌ 错误:容器内的 localhost 是容器自己,连不到 MySQL
SPRING_DATASOURCE_DRUID_MASTER_URL: jdbc:mysql://localhost:3306/ry-vue
# ✅ 正确:用 compose 里的服务名
SPRING_DATASOURCE_DRUID_MASTER_URL: jdbc:mysql://mysql:3306/ry-vue
2
3
4
5
Docker Compose 会自动为同一网络内的服务做 DNS 解析,mysql、redis、minio 这些服务名可以直接当主机名用。
# 端口映射易错点:容器内端口 vs Windows 访问端口
⚠️ 关键区分:
ports: ["13306:3306"]中,左边13306是 Windows 访问端口,右边3306是容器内端口。两者不要搞混!
| 场景 | 用哪个端口 | 示例 |
|---|---|---|
| 容器之间互相连接(ruoyi-admin 连 mysql) | 用容器内端口(右边) | jdbc:mysql://mysql:3306/ry-vue |
| Windows 客户端连接(Navicat 连 MySQL) | 用映射端口(左边) | localhost:13306 |
| 项目代码跑在 Windows 本地(IDE 调试若依) | 用映射端口(左边) | jdbc:mysql://localhost:13306/ry-vue |
# ❌ 错误:容器间通信用了 Windows 映射端口
SPRING_DATASOURCE_DRUID_MASTER_URL: jdbc:mysql://mysql:13306/ry-vue # 容器内没有 13306 端口
# ✅ 正确:容器间通信用容器内端口
SPRING_DATASOURCE_DRUID_MASTER_URL: jdbc:mysql://mysql:3306/ry-vue
2
3
4
5
# WSL2 架构简述
┌─────────────────────────────────────────┐
│ Windows 主机 │
│ ┌─────────────┐ ┌─────────────────┐ │
│ │ Windows 应用 │ │ WSL 管理服务 │ │
│ │ (浏览器等) │ │ (wslservice) │ │
│ └─────────────┘ └────────┬────────┘ │
│ │ │
│ ┌──────────────────────────▼─────────┐ │
│ │ 轻量级 Hyper-V 虚拟机 │ │
│ │ ┌───────────────────────────────┐ │ │
│ │ │ 完整 Linux 内核 (微软维护) │ │ │
│ │ │ ┌──────┐ ┌──────┐ ┌──────┐ │ │ │
│ │ │ │Ubuntu│ │Debian│ │ ... │ │ │ │
│ │ │ └──────┘ └──────┘ └──────┘ │ │ │
│ │ │ ext4 文件系统 (vhdx) │ │ │
│ │ └───────────────────────────────┘ │ │
│ └────────────────────────────────────┘ │
└─────────────────────────────────────────┘
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- WSL 管理服务:负责启动/停止虚拟机,管理发行版
- 轻量级虚拟机:启动极快(约 1-2 秒),资源按需分配
- Linux 内核:微软维护的开源内核(https://github.com/microsoft/WSL2-Linux-Kernel),完整支持 Linux 系统调用
- vhdx 虚拟磁盘:每个发行版的文件系统存储在一个
.vhdx文件中,动态扩展