wsl2 编译 Lean's Openwrt x86_64_kvm

  • 从源码编译 Lede x86_64_kvm 以及 wsl2 带来的坑.

  • 资料来源:

    https://openwrt.org/docs/guide-developer/build-system/install-buildsystem
    http://everun.top/helpcenter/others/pve-ow-2.html
    https://exlolicon.blogspot.com/2018/09/centosopenwrt.html
    https://github.com/coolsnowwolf/lede
    https://blog.x-wrt.com/docs/build/

  • 更新

    1
    2
    20.08.13 初始化
    22.10.11 重新编辑内容

导语

Lean’s Openwrt 可以算是原版的本土化版本,适合本地化使用.

之后的内容基本上是基于此版本来倒腾了.

准备

大致过程与编译原版相同.

环境

  • wsl2-ubuntu ,之前在虚拟机上 debin/centos 始终都有失败的时候.
  • 10~20G 空间,编译不同版本需要空间有不同.
  • cpu 此处是 AMD 3600 6C12T.(所以下面都是 12 线程)
  • 网络条件,不再提了.

系统

  • lib32gcc1 -> lib32gcc-s1
1
2
3
sudo apt-get update

sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3.5 python2.7 unzip zlib1g-dev lib32gcc-s1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler g++-multilib antlr3 gperf wget swig rsync

源码

拉取源码

1
git clone https://github.com/coolsnowwolf/lede

更新&&安装 feed

1
2
3
4
./scripts/feeds update -a

//有说法是安装不必要,但是没坏处.
./scripts/feeds install -a

配置

为 x86_64 添加完整 kvm 支持

这一节来自 在Proxmox VE上运行OpenWrt/LEDE虚拟机——2.PVE下运行的OW/LEDE固件编译要点

官方的 x86_64 对应配置在 openwrt\target\linux\x86\64 下,可惜没有完整支持 kvm,但是官方的 x86_generic 却完整支持了 kvm.可能是一点疏忽吧.

添加 kvm 完整支持可以新添加一个 subtarget 或者在 x86_64 上修改,这里直接在 x86_64 上修改了.

lede\target\linux\x86\generic\config-5.19 下的 kvm 内容搬到 openwrt\target\linux\x86\64\config-5.19

1
2
3
4
5
6
7
8
9
10
CONFIG_KVM=y
CONFIG_KVM_AMD=y
CONFIG_KVM_ASYNC_PF=y
CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y
CONFIG_KVM_GUEST=y
CONFIG_KVM_INTEL=y
CONFIG_KVM_MMIO=y
CONFIG_KVM_VFIO=y
# CONFIG_KVM_XEN is not set
CONFIG_KVM_XFER_TO_GUEST_WORK=y

内核配置

首次编译前要先 make menuconfig 指定 Linux 内核分支.这里是 x86_64.

1
2
3
4
5
make menuconfig

Target System -> x86
Subtarget -> x86_64
Target Images -> Generic

随后 save 到配置文件,再 exit.

其次 make kernel_menuconfig 这一步会下载内核源码,还会编译一些内容,开个多线程节省点时间.V=s 会输出编译 log,防止无聊.

1
2
3
4
5
6
7
make kernel_menuconfig -j$(($(nproc) + 1)) V=s

<*>64-bit kernel

<*>Virtualization -> <*>Kernel-based Virtual Machine (KVM) support
<*>KVM for Intel processors support
<*>KVM for AMD processors support

这一步时间可能稍长,需要耐心等待.

固件配置

一些定制化都在这里了,后面有两篇会涉及到固件配置,一篇是 qca9880,还有一篇是专门的定制化.这里仅仅提到一点.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
make menuconfig

# 虚拟化支持(全选)
kernel modules -> Virtualization->*

## 下面这些已经包含了.
# 启用 Web 管理界面 LuCI
# LuCI -> Collections → luci
# 中文支持
# LuCI -> Modules -> Translations -> Chinese(zh-cn)

# 添加UTF8编码
# Kernel modules —> Native Language Support —> <> kmod-nls-utf8

# hostapd 相关
Network -> WirelessAPD
[*] hostapd #wifi ap模式
[*] hostapd-common
[*] hostapd-utils
[*] wpa-supplicant

最后 save && exit

编译

绝对不能使用 root 用户编译 !!

wsl2 运行前需要解决路径问题

1
2
3
4

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# or
source /etc/environment

编译过程依旧会下载一些内容,需要保持网络通畅.

官方不推荐多线程编译,但是先试试总归比单线程快的多.

1
2
3
4
# 下载 dl 库
make -j8 download V=s
# 开始编译
make -j$(($(nproc) + 1)) V=s

12 线程编译大概只有不到 20 分钟.

编译完成后,固件在 openwrt\bin\targets 对应的架构文件夹内.

不能使用 root 用户编译,这是官方就提到了很多次的.

make[2]: *** [package/Makefile:71: package/install] Error 1

  • 首先排除网络问题.
  • 其次是对应的 package 错误,make menuconfig 检查一下对应的设置.
  • 如果还有错误,make clean 清理编译文件,换成 -j1 单线程编译,可以解决一部分问题.

结束

前后折腾了有一个星期,需要的功能大致齐全了,但是本身并不稳定,时常有掉驱动,重启的问题.暂时不清楚是驱动还是固件本身的问题.

或许倒腾点啥,开始都这样挫败,过一段时间就好了.