版本说明
本博客适用于:
- Windows 11
- Windows 10 2004+(内部版本 19041 及更高版本)
更老版本系统,请参考官方手动安装
Win10 2004+ 默认已启用适用于 Linux 的 Windows 子系统
功能,执行命令获取wsl版本信息
1
2
3
4
5
6
7
8
| > wsl -v
WSL 版本: 2.1.0.0
内核版本: 5.15.137.3-1
WSLg 版本: 1.0.59
MSRDC 版本: 1.2.4677
Direct3D 版本: 1.611.1-81528511
DXCore 版本: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows 版本: 10.0.22631.3296
|
wsl更新
Windows 11 23H2 ++
1
| wsl --update --pre-release
|
wsl安装Ubuntu
通过 wsl --list --online
列出可用的发行版名称,然后执行wsl --install <Distribution Name>
安装。
1
| wsl --install ubuntu20.04
|
查看已安装的发行版
wsl -l -v
NAME STATE VERSION
重启WSL
配置.wslconfig
hostAddressLoopback
是实验性功能。
默认情况下,在wsl2中开启的网络端口,会通过localhost映射到win11上,在win11宿主机通过localhost访问,但是无法通过宿主机的局域网、公网IP访问。
当这个选项设置为true之后,就会允许wsl与宿主机通过局域网、公网IP(仅支持分配给主机的 IPv4 地址)访问两者之间的服务,且保留了localhost访问的能力。
打开配置文件
执行下面命令,用于创建或打开配置文件%USERPROFILE%\.wslconfig
1
2
| if (-not (Test-Path -Path "~/.wslconfig")) { New-Item -ItemType File ~/.wslconfig }
pushd ~ ; code .wslconfig
|
GUI修改配置
还可以在window的搜索中,搜索"WSL Settings",通过界面进行配置
![wsl_setting](/images/post-image/2020-05-25-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83-WSL%E9%85%8D%E7%BD%AE-%E5%9F%BA%E7%A1%80%E9%85%8D%E7%BD%AE.png)
基础配置
1
2
3
| [wsl2]
processors=8 # 分配给linux的cpu
memory=4096MB # 分配给linux的内存
|
其他配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # 推荐的一些配置项如下
[wsl2] # 核心配置
autoProxy=false # 是否强制WSL使用 Windows 代理设置(按需启用)
dnsTunneling=true # WSL DNS 代理隧道,以便由 Windows 代理转发 DNS 请求(按需启用)
firewall=true # WSL的 Windows 防火墙集成,以便 Hyper-V 或者 WPF 能过滤子系统流量(按需启用)
guiApplications=true # 启用 WSLg GUI 图形化程序支持
ipv6=true # 启用 IPv6 网络支持
localhostForwarding=true # 启用 localhost 网络转发支持
memory=4GB # 限制WSL的最大内存占用
nestedVirtualization=true # 启用WSL嵌套虚拟化功能支持
networkingMode=mirrored # 启用镜像网络特性支持
#pageReporting=true # 启用WSL页面文件通报,以便 Windows 回收已分配但未使用的内存
processors=8 # 设置WSL的逻辑 CPU 核心数为 8(最大肯定没法超过硬件的物理逻辑核心数)
[experimental] # 实验性功能
autoMemoryReclaim=gradual # 启用空闲内存自动缓慢回收
hostAddressLoopback=true # 启用WSL和 Windows 宿主之间的本地回环互通支持
sparseVhd=true # 启用WSL虚拟硬盘空间自动回收
useWindowsDnsCache=false # 和 dnsTunneling 配合使用,决定是否使用 Windows DNS 缓存池
|
配置/etc/wsl.conf
在每个Linux子系统中,用来记录系统端配置加载项
基础配置
1
2
3
4
5
6
7
8
9
| [boot]
systemd=true # 开启 systemd
[network]
hostname=ubuntu-22 # 主机名
generateResolvConf=false # 是否开启自动生成resolv配置文件,用于生成dns
[user]
default=root # 系统登录默认用户
|
其他配置
1
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
| # 此配置文件不能通过 cd /etc && ln -Ps /mnt/d/Devs/WSL/wsl.conf wsl.conf 来配置,只能通过拷贝副本
# https://docs.microsoft.com/en-us/windows/wsl/wsl-config
[automount]
enabled=true
mountFsTab=true
options="metadata,dmask=0022,fmask=0077,umask=0022"
root=/mnt/
[filesystem]
umask=0022
[interop]
enabled=true
appendWindowsPath=false # 不添加 Windows 环境变量 Path, 防止路径变量污染带来的干扰
# 其它网络配置
[network]
generateHosts=true
generateResolvConf=true
# boot command 暂不支持 nohup 后台启动
# command=nohup service cron start >/dev/null 2>&1 &
[boot]
# command=/root/.start.sh
systemd=true
|
常见问题
卸载wsl
1
| wsl --unregister <distroName>
|
导出wsl至文件
1
| wsl --export <Distro> <FileName>
|
从文件导入wsl
1
| wsl --import <Distro> <InstallLocation> <FileName>
|
常见设置
指定子系统、用户、工作目录
1
| wsl -d Ubuntu-22.04 -u root --cd /mnt/d/workspace
|
更改WSL的安装目录
方法一:manage命令
WSL 2.3.11
开始,增加一个内置的命令行选项--manage
,可以将发行版移动到一个新的位置。
wsl –manage <distro_name> –move <new_location>
1
| wsl --manage Ubuntu-20.04 --move D:\SoftData\wsl\ubuntu20.04
|
方法二:export、import命令
WSL老版本,可以通过export导出至文件,再通过import时,通过install directory
参数指定到新的目录下。
1
2
3
4
5
6
7
8
9
10
11
12
| mkdir D:\SoftData\wsl\images
mkdir D:\SoftData\wsl\instances\ubuntu20.04
cd D:\WSL
wsl -l -v
wsl --terminate ubuntu20.04
wsl --export ubuntu20.04 .\images\ubuntu2004.tar
wsl --unregister ubuntu20.04
wsl --import ubuntu20.04 .\instances\ubuntu20.04 .\images\ubuntu2004.tar
wsl --set-default ubuntu20.04
|
wsl中删除docker镜像,磁盘不释放问题
wsl2本质是虚拟机, Linux子系统实际运行在虚拟磁盘文件(*.vhdx)上。虚拟磁盘默认可自动扩容,但不会自动缩容,因此删除子系统中文件后,虚拟磁盘文件不会自动缩小,需要手动压缩才能释放磁盘空间。
虚拟磁盘默认路径%USERPROFILE%\AppData\Local\Packages\CanonicalGroupLimited.*\LocalState\ext4.vhdx
- 压缩磁盘文件
powershell中,利用diskpart进行磁盘压缩
1
2
3
4
5
6
7
8
| // 进入 diskpart
diskpart
// 选择虚拟磁盘, 例如:select vdisk file="%USERPROFILE%\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx"
select vdisk file="虚拟磁盘文件的路径"
// 压缩
compact vdisk
// 卸载虚拟磁盘
detach vdisk
|
NAT网络,Linux子系统内服务暴露给宿主机网络其他
wsl网络走默认设置
window设置转发
在Linux子系统内执行命令,获取Linux子系统IP地址
1
2
3
| hostname -I
# 或者执行 ip addr 命令 ifconfig 命令查看
|
通过执行netsh interface portproxy add v4tov4
命令, 设置转发
转发策略设置后,重启仍生效
- listenport: windows宿主机监听端口
- connectport: Linux子系统中服务监听端口
- connectaddress: Linux子系统的IP地址(hostname -I| awk ‘{print $1}’)
举例: 宿主机上监听0.0.0.0:18000
, 转发给目标Linux子系统172.30.234.121:8000
的服务。同局域网机器可通过宿主机IP:18000
访问wsl子系统内监听8000
的服务。
1
| netsh interface portproxy add v4tov4 listenport=8000 listenaddress=0.0.0.0 connectport=8000 connectaddress=172.30.234.121
|
可执行命令,查看策略
1
2
3
4
| netsh interface portproxy show all
// 或者执行
netsh interface portproxy show v4tov4
|
删除策略
1
| netsh interface portproxy delete v4tov4 listenport=8000 listenaddress=0.0.0.0
|