wsl2 编译 Openwrt x86_64_kvm

  • 从源码编译 Openwrt 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://p3terx.com/archives/openwrt-compilation-steps-and-commands.html

  • 更新

    1
    20.08.19 初始化

导语

最近学理论学的疲了,来点一直在清单上积灰的计划,大概要更新路由器了,干脆重新编译 Openwrt x86_64.

下面是在 Win10 wsl2 下编译 Openwrt x86_64_kvm 的坑,特别是 wsl2 带来的新坑.

因为官方的 x86_64 下没有 kvm 的完整支持,这里需要动一点文件.

准备

环境

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

系统

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/openwrt/openwrt.git

切换到 22.03 分支,默认 master 分支更新频繁可能会存在 bug.

1
git checkout -b openwrt-22.03 origin/openwrt-22.03

更新&&安装 feed

  • 需要添加自定义源 -> 编辑 feeds.conf.default
1
2
./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 上修改了.

最新版本对应的内核是 5.10,所以我们要修改的文件就是 openwrt\target\linux\x86\64\config-5.10.下面是修改后的新增项,这些都可以在 x86_generic 上找到.

1
2
3
4
5
6
7
8
9
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_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

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

固件配置

基本中文定制.

1
2
3
4
5
6
7
8
9
10
11
12
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

最后 save && exit

编译

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

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

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

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

1
2
# 下载 dl 库
make -j8 download V=s

如果遇到网路问题,下载文件可能存在异常,需要重新 make down

1
2
# 找到小于 1k 文件 删除
find dl -size -1024c -exec ls -l {} \;

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

1
2
# 开始编译
make -j$(($(nproc) + 1)) V=s

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

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

清理

  • make clean 源码有大更新,内核更新.删除 /bin/build_dir
  • make dirclean 更换架构前执行.删除/bin /build_dir /staging_dir /toolchain /tmp /logs
  • make distclean 只剩源码 feed dl 等也全清.
  • make targetclean
  • git clean -xdf 干脆回到初始状态

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

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

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

结束

计划重新升级一遍个人的工作环境,硬件到位了,该软件了.