0%

WSL2 自编译内核使用 tc qdisc

WSL2 极大的提升了在Windows上的Linux的使用体验,tc 是Linux自带的流量控制器,能控制延迟、丢包、带宽等网络配置。但在当前 5.15 内核版本的WSL中缺少所需模块,需要手动编译内核开启tc。

编译内核

  • 下载内核源码
1
git clone https://github.com/microsoft/WSL2-Linux-Kernel.git --depth=1 -b linux-msft-wsl-6.1.y
  • 安装编译所需依赖
1
sudo apt update &&  sudo apt install build-essential flex bison dwarves libssl-dev libelf-dev
  • 修改 Microsoft/config-wsl 配置文件,添加tc支持
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
28
29
30
# vim Microsoft/config-wsl

# 5.1.Kernel requirements https://tldp.org/HOWTO/html_single/Traffic-Control-HOWTO/
# QoS and/or fair queueing
CONFIG_NET_SCHED=y
CONFIG_NET_SCH_CBQ=m
CONFIG_NET_SCH_HTB=m
CONFIG_NET_SCH_CSZ=m
CONFIG_NET_SCH_PRIO=m
CONFIG_NET_SCH_RED=m
CONFIG_NET_SCH_SFQ=m
CONFIG_NET_SCH_TEQL=m
CONFIG_NET_SCH_TBF=m
CONFIG_NET_SCH_GRED=m
CONFIG_NET_SCH_DSMARK=m
CONFIG_NET_SCH_INGRESS=m
CONFIG_NET_QOS=y
CONFIG_NET_ESTIMATOR=y
CONFIG_NET_CLS=y
CONFIG_NET_CLS_TCINDEX=m
CONFIG_NET_CLS_ROUTE4=m
CONFIG_NET_CLS_ROUTE=y
CONFIG_NET_CLS_FW=m
CONFIG_NET_CLS_U32=m
CONFIG_NET_CLS_RSVP=m
CONFIG_NET_CLS_RSVP6=m
CONFIG_NET_CLS_POLICE=y

# Network emulator (NETEM)
CONFIG_NET_SCH_NETEM=y
  • 构建内核
1
make -j$(nproc) KCONFIG_CONFIG=Microsoft/config-wsl
  • 安装内核模块和头文件
1
sudo make modules_install headers_installs
  • 复制编译好的内核到Windows C盘
1
sudo cp arch/x86/boot/bzImage /mnt/c/

启用内核

  • 用户目录下创建或编辑WSL配置文件 %USERPROFILE%\.wslconfig
1
2
[wsl2]
kernel = C:\\bzImage
  • 管理员运行PowerShell 终端窗口, 停止WSL
1
wsl --shutdown
  • 重启验证内核版本
1
2
3
4
uname -r 

# 类似输出
6.1.21.2-microsoft-standard-WSL2+

tc 使用

  • 模拟100ms延迟
1
sudo tc qdisc add dev eth0 root delay 100ms
  • 显示配置
1
sudo tc qdisc show dev eth0
  • 删除配置
1
sudo tc qdisc del dev eth0 root
  • 模拟10%丢包
1
sudo tc qdisc add dev eth0 root netem loss 10%
  • 控制网速为100kbps
1
sudo tc qdisc add dev eth0 root tbf rate 100kbps burst 10kb limit 10kb

其他问题

  • make 报错 Killed …

  • tc 报错: Error: Specified qdisc not found

    • 所需依赖模块没有加载:
      • tbf :sudo modprobe sch_tbf
      • prio:sudo modprobe sch_prio
  • Docker Desktop 无法启动

    • 最新的 WSL 6.6版本 内核移除了一些默认启动的docker所需的依赖, 目前建议使用 6.1版本

参考

欢迎关注我的其它发布渠道