从QSDK源码编译RAX3000Q所需的软件包

2022-02-10 (更新于2022-07-19) / Router / #路由器 #OpenWrt

NOTE: 作者已弃坑,本文目前仅作为编译QSDK的参考

原先的计划是将QSDK中携带的软件包编译成.ipk文件供大家使用,但QSDK本身带的编译脚本、软件包版本过于老旧,编译过程中容易出现各种奇怪问题。对出错的软件包进行修复(包括从OpenWRT的源码中迁移、集成国内的一些feed)已耗费较多精力,但仍有许多依赖的软件包未处理。鉴于这些工作和该设备本身无任何关联,纯粹的patch+rebuild体力活动,且旧的软件包因缺少功能、兼容性问题、存在漏洞隐患等无太大的使用意义。不建议继续做这种徒劳的事情。感兴趣的玩家可以考虑在现有的OpenWRT分支上迁移增加ipq5018支持。

前一篇文章中讲到了如何开启RAX3000Q的ssh,并且发现其固件正是QSDK,但是并没有妥善解决软件包的问题,这一次我们尝试基于QSDK源码编译我们想要的软件包的ipk文件。

实践过程也是参考了很多网上的关于QSDK的文章。

准备环境

我是在docker容器中构建的,环境是Ubuntu 20.04 (dockerhub上的ubuntu:latest),对于其他发行版如ArchLinux,在编译时可能需要解决宿主机上openssl头文件版本的问题,且本文中提到的patch可能不再适用。

开始之前,还需要安装构建所需的工具,可以参考OpenWrt - Build system setup

对于ubuntu:

sudo apt install build-essential ccache ecj fastjar file g++ gawk \
gettext git java-propose-classpath libelf-dev libncurses5-dev \
libncursesw5-dev libssl-dev python python2.7-dev python3 unzip wget \
python3-distutils python3-setuptools python3-dev rsync subversion \
swig time xsltproc zlib1g-dev 

获取源码

QSDK的源码管理类似于Android和ChromeOS,也基于repo工具,在开始之前需要先安装好repo

QSDK的manifest文件存放在这个仓库中,只有一个名为release的branch。在之前的分析中知道该路由器Openwrt版本为15.05和kernel版本为4.4,结合QSDK的wiki,我选择了主版本号为11的QSDK的最新的manifest文件:caf_AU_LINUX_QSDK_NHSS.QSDK.11.5.0.6_TARGET_ALL.11.5.0.6.055.xml

使用如下语句获取源码并初始化

repo init -u git://source.codeaurora.org/quic/cc-qrdk/releases/manifest/qstak -b release -m caf_AU_LINUX_QSDK_NHSS.QSDK.11.5.0.6_TARGET_ALL.11.5.0.6.055.xml
repo sync

请勿选择caf_AU_LINUX_QSDK_NHSS.QSDK.12.0.R9_TARGET_ALL.12.0.09.841.011.xml,测试发现其中的linux版本为5.4,且musl-libc版本与当前固件中的不符。

因为编译环境的问题,编译过程中(尤其是构建toolchain时)会导致很多error产生,在开始之前需要对源码进行一些修改,这些修改多数是增加一些.patch文件,或者是对Makefile的一些改动。

其中大部分改动参考了这篇文章,十分感谢这位作者。

所有的修改共涉及qsdk/qsdk/qca/feeds/packages/这两个目录,对应的diff如下

编译

编译前的准备

首先进入qsdk源码目录,其中的目录布局和openwrt非常接近

cd qsdk

在配置之前将feeds中的软件包添加进来:

./scripts/feeds update -a
./scripts/feeds install -a
make package/symlinks

实际上是根据feeds.conf更新feeds,然后在./packages/feeds/目录里面创建到./feeds/*中的feeds包的软链接,在这一步之后才能看见更多的软件包

配置QSDK

使用默认的配置作为.config

cp qca/configs/qsdk/ipq_open.config .config

接着使用菜单配置:

make menuconfig

RAX3000Q自带的固件是32bit的,因此我们这里targetIPQsubtargetIPQ50xx(32bit),在Boot Loaders里面把ipq50xx之外的其它其它芯片组的全部取消选中。

接着直接保存为.config

在现有的.config中添加默认配置:

make defconfig

接着可以进行一些个性化配置,或者备份对.config文件所作的修改,我直接跳过了:

make kernel_menuconfig # 配置内核,可选
make menuconfig # 再次配置,可选
scripts/diffconfig.sh > mydiffconfig # 备份修改到文件mydiffconfig,可选

编译


编译失败的排错

这篇文章里已经涵盖了很多在ubuntu20.04环境中编译时可能遇到的问题,但我在编译这一版本的QSDK时还遇到了额外的问题。所有对QSDK所需的修改已经在文章开头的diff文件中涵盖了,这里只是列出信息有助于排错:

引用