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

  • 更新

    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 lib32gcc1 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

源码

拉取源码

1
git clone https://github.com/openwrt/openwrt.git

更新&&安装 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 上修改了.

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

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
 # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y
+CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y
+CONFIG_HAVE_KVM_EVENTFD=y
+CONFIG_HAVE_KVM_IRQCHIP=y
+CONFIG_HAVE_KVM_IRQFD=y
+CONFIG_HAVE_KVM_IRQ_BYPASS=y
+CONFIG_HAVE_KVM_IRQ_ROUTING=y
+CONFIG_HAVE_KVM_MSI=y
CONFIG_HAVE_LIVEPATCH=y
CONFIG_HAVE_MEMORY_PRESENT=y
CONFIG_HAVE_STACK_VALIDATION=y
@@ -203,8 +210,15 @@
# CONFIG_ITCO_VENDOR_SUPPORT is not set
# CONFIG_ITCO_WDT is not set
CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y
+CONFIG_KVM=y
+CONFIG_KVM_AMD=y
+CONFIG_KVM_ASYNC_PF=y
# CONFIG_KVM_DEBUG_FS is not set
+CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y
CONFIG_KVM_GUEST=y
+CONFIG_KVM_INTEL=y
+CONFIG_KVM_MMIO=y
+CONFIG_KVM_VFIO=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 -j12 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
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 用户编译 !!

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

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

1
make -j12 V=s

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

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

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

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

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

wsl2 独有的..(坑的莫名其妙)

错误提示

1
2
3
find /home/tmp/openwrt/build_dir/target-x86_64_musl/root-x86/ -mindepth 1 -execdir touch -hcd "@1596662855" "{}" +
find: The relative path 'Files/NVIDIA' is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove that entry from $PATH
make[2]: *** [package/Makefile:71: package/install] Error 1

字面上意思是系统的 PATH 包含了 Files/NVIDIA 导致的,就去找对应的 package 了,还真有一个 kmod-forcedeth 但是没起作用.

一直翻资料,知道突然意识到是不是 wsl2 的 PATH 问题..wsl2 会导入宿主机 win10 的 PATH,而我恰好安装了 cuda.破案..这莫名其妙..

1
source /etc/environment

结束

wsl2 是个好东西,但是有点无福消受..

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