Please enable Javascript to view the contents

WSL-基础配置

 ·  ☕ 5 分钟

版本说明

本博客适用于:

  • 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

  • Ubuntu-22.04 Running 2

重启WSL

1
wsl --shutdown ; 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

基础配置

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

  1. 压缩磁盘文件

    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子系统内服务暴露给宿主机网络其他

  1. wsl网络走默认设置

  2. 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
分享

Hex
作者
Hex
CloudNative Developer

目录