openwrt源码编译复盘

本文介绍了如何为小米4A千兆路由器编译OpenWrt源码,以安装插件luci-app-syncdial,涉及环境准备、工具集合、目录结构、编译流程、错误解决策略,以及如何处理configure文件版本和补丁应用问题。
摘要由CSDN通过智能技术生成

目录

 

介绍

环境准备

目录结构

工具集合

包集合

包结构

编译选择

编译

错误解决

.configure文件版本不匹配

补丁应用失败

总结

刷入

留一手


 

介绍

    openwrt是一款路由器linux发行版本,拥有许多个性化的定制功能,本次源码编译的目的是为了使用插件luci-app-syncdial,中文名多线多拨,可以实现单线多播功能。

   题外话,为什么要编译,原因是官版软件仓库不提供自定义插件支持,多拨插件比较小众,需要自行编译。同时,由于路由器之间区别很大,主要是不同的路由器拥有不同的cpu架构,所以很多插件只能针对性编译。

环境准备

   工具安装

sudo apt update
sudo apt install build-essential clang flex bison g++ gawk \
gcc-multilib g++-multilib gettext git libncurses-dev libssl-dev \
python3-distutils rsync unzip zlib1g-dev file wget

   首先在linux系统桌面或其他位置建立一个工作空间,克隆官方master主线,当然,也可以直接下载压缩包解压就行。

命令:

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

当然,也可以直接下载zip

注意:本次编译采用了主线分支,目标主机是小米4a千兆路由器v1版本(.28),内核版本是6.1.81,openwrt版本是OpenWrt SNAPSHOT r25540-7b89388674,编译平台是双系统kali主机。

(吐槽,内核版本比我kali都高)

对于该分支,openwrt官方在22.03.3版本就合并了该款路由器的支持,所以可以直接使用官方源码,除此之外,还有一份lede大佬的源码也挺受欢迎,可以参考第二篇教程。

目录结构

工具集合

首先,简单了解一下openwrt目录结构,这有助于编译出现bug时如何解决。这是官方开发者文档地址https://openwrt.org/docs/guide-developer/start。没有中文的,看不懂可以自行用插件翻译,我这四级勉强的水平也就读懂了一讷讷。再贴一些参考文档吧,助力一下和我一样的小渣渣。

3. 源码拉取 — [野火]OpenWrt用户手册—基于LubanCat-RK系列板卡 文档

小米4A千兆版V2刷自己编译的OpenWRT以及IPV6设置(包括中继与NAT6) - 哔哩哔哩

 对于目录结构,可以去官方文档或其他资料看看,我没保留链接。openwrt的目录结构很清晰,

其中包括tools还有toolchain。tools是编译所需要的一些工具,toolchains是交叉编译链工具,这个编译过linux内核的想必不会陌生。

根据openwrt文档介绍(overflow那里),为了解决工具版本问题和环境配置问题,openwrt将所需的环境工具打包到了源码仓库,也就是说,你不需要去解决那些麻烦的环境配置问题,这个对小白还是很友好的,想我当初编译linux内核配置交叉编译环境时一堆问号。

工具链可以手动编译,命令是

make tools/install

make toolschain/install

据官方文档介绍,如果你只想编译某个包,可以先编译工具链,然后直接编译包就可以了。

重点:注意,虽然官方说了可以只编译对应包,但显然不是所有包,许多自定义插件有自己对应的依赖,而很多依赖又需要内核模块提供支持,如果你使用不同人提供的系统镜像,那么插件也会出现无法安装或不适配的问题,也就是说如果要用,就用同一个提供者,并且还要是对该插件提供支持的系统镜像。这也是我从主线编译的原因,当然,我也存在问题,目前官方镜像仅仅发布了23.05版本,我使用的主线源码版本已经高了,所以官方插件仓库,我也用不了。。。

所以吃饭还不是不能太急,如果有想要官方支持的童鞋,可以手动切换到稳定分支,使用命令

git clone -b xxx.xx https://github.com/openwrt/openwrt

如果不想敲命令,直接下载压缩包也可以,操作是点击master分支那里,然后切换到对于版本就可以了,也可以去release找到对应版本下载source.zip。

工具链和工具编译后,会将目标文件放在/staging_dir下面注意编译openwrt的包和系统镜像则会在/bin下面。

包集合

openwrt将额外的包打包到package目录下面,如果是第三方插件,就可以将其项目作为一个文件夹粘贴到package下面,openwrt编译脚本会识别对应的插件以供make menuconfig选择。

在上面第二个文档里中就提到了small-package整理的一些常用插件集合,可以全部添加,虽然我不太建议,因为一些插件存在依赖也在文件中,有些依赖和官方提供的依赖存在版本或其他冲突,建议用到什么加什么,再往里面补充官方未提供的依赖文件。

有些插件很冷门,比如我的多拨插件,这就需要自己去找,还不一定保证能用,就比如我这次的插件就感觉是不是插件的问题。找插件先找到对应的源码,下面是一些插件的名字

OpenWrt 编译 LuCI-> Applications 添加插件应用说明-L大【2022.11.28】-OPENWRT专版-恩山无线论坛

可以在github上搜一下,当然,不保证有用。比如我的插件

具体怎么选择看自己,找资源这种体力活真的比较烦人。

找到包后把项目打包的zip下载解压后粘贴成package下的一个文件夹就可以了。如果你想用命令可以这样,cd 到openwrt根目录,然后

git clone xxxx  package/xxxx

更新:

可以尝试在feeds源里面添加地址哈,虽然我没有试过,不过应该能用,参考下面文章

OpenWrt介绍及编译基础教程_openwrt编译-CSDN博客

包结构

仅解析部分

对于libs的一个包,可能由一个patchs文件夹和其他文件组成,者pathchs里面的补丁文件会在源码下载解压后自动使用,相关过程参考官方包开发文档,makefile定义了如何编译该包,如果是luci包,还有对应的界面和翻译文件,其makefile会指明依赖等。

包结构请参考PKG_FIXUP介绍下两篇的开发包指导

编译选择

先更新包仓库

./scripts/feeds update -a

./scripts/feeds install -a 

这两个命令可以将官方支持提供的包更新到选择列表,同时也会扫描package目录下文件,并将对应插件添加到选择列表里面

然后使用make menuconfig进行选择,具体选择可以参考以下资料

OpenWRT无线路由的make menuconfig配置-CSDN博客

5. menuconfig 功能简述 — [野火]OpenWrt用户手册—基于LubanCat-RK系列板卡 文档

本次主要是选择luci插件,其他的一般不需要动,默认编译成为sysupdate镜像,有其他需求,参考上述文章。选定插件后,如果存在相关依赖,选择脚本会自定选定相应依赖,如何相关依赖不存在,会在编译前给出警告和错误,也可以在menuconfig菜单对应插件前输入?,可以在dependences栏目看见对应的依赖,可以根据此区寻找对于的依赖文件名,然后重新粘贴,更新仓库列表,继续选择就可以了,选定后提出前保存到.config文件,就可以开始愉快的编译环节了。

编译

编译选项和大部分项目构建是类似的,包括

make clean:清理编译文件以及记录

make distclean:清理目标文件

make -j number :开启多线程编译,number是开启线程数,和cpu核心数一样就可以了

make -j1 V=s:输出详细编译信息

与其他不同的是,openwrt项目官方提供一些编译具体包的命令

make package/xxxx/compile:编译具体包文件目录下的文件,加上/compile

这个命令支持多级路径,它会使用对应目录下makefile文件以及主目录定义的规则进行编译,具体规则包括rules.mk等。

tip:编译容易出错,但是单线程编译又太慢,报错又容易刷屏,怎么办?直接多线程编译,不使用V=s输出具体信息,等到错误出现时,根据提示给出的错误包路径,使用

make V=s package/xxx/compile

重新尝试编译具体包,查看详细报错信息再解决。

make -j number download:编译前预下载包源码,number 线程数,openwrt项目并不直接提供所有包的源码,只有有需要的时候才会去下载对应的包,为了加快编译速度以及防止网络中断引起的编译中断,建议提前预下载。

其他支持的命令可以在根目录的makefile找到,这只是提供命令名字,通过分析脚本去了解命令信息太烧脑,不如用名字去问度娘或者谷鸽,当然官方文档提供了具体的命令信息,不过比较杂而且全英文。

错误解决

.configure文件版本不匹配

configure.ac:10: error: version mismatch.  This is Automake 1.16.5,
configure.ac:10: but the definition used by this AM_INIT_AUTOMAKE
configure.ac:10: comes from Automake 1.16.3.  You should recreate
configure.ac:10: aclocal.m4 with aclocal and run automake again.
WARNING: 'automake-1.16' is probably too old.
         You should only need it if you modified 'Makefile.am' or
         'configure.ac' or m4 files included by 'configure.ac'.
         The 'automake' program is part of the GNU Automake package:
         
         It also requires GNU Autoconf, GNU m4 and Perl in order to run:
         
         
         
make[5]: *** [Makefile:479: Makefile.in] Error 63

首先在github openwrt的issues里寻找问题

这哥们提了一下但是没有给出解决方案具体位置,无奈自行摸索。

根据报错,发现是automake的问题,相应的解决方法是aclocal命令后再使用automake,问题是openwrt的tools并不直接安装到主机,而是安装到了前面提到的/staging_dir下面,尝试使用其打包的autotools工具修复,结果命令需要对应编译运行环境的环境变量宏的值。本地安装automake版本高达2.6,另寻他法。

其实编译时能找到解决方法还好,找不到就挺绝望的,几此分析和实践,在一片文章中找到了

PKG_FIXUP介绍

L&Z|Iceway's Sharing and Recording.

[OpenWrt Wiki] Creating packages

猜测可以在编译前规范autotools文件添加相应宏测试,在package/libs/libnftnl/makefile添加宏,编译包通过,撒花!!!

补丁应用失败

继续编译。。。报错,补丁应用失败

Applying /home/kali/openwrt/openwrt/package/network/utils/nftables/patches/0001-fix-nft.patch using plaintext:
patching file src/evaluate.c
Hunk #1 FAILED at 1520.
1 out of 1 hunk FAILED -- saving rejects to file src/evaluate.c.rej
Patch failed!  Please fix /home/kali/openwrt/openwrt/package/network/utils/nftables/patches/0001-fix-nft.patch!
make[2]: *** [Makefile:91: /home/kali/openwrt/openwrt/build_dir/target-mipsel_24kc_musl

/nftables-json/nftables-1.0.9/.prepared_d7dfca8a9e0f614e03e6316368e8fb31_6664517399ebbbc92a37c5bb081b5c53] Error 1
make[2]: Leaving directory '/home/kali/openwrt/openwrt/package/network/utils/nftables'
time: package/network/utils/nftables/json/compile#0.27#0.17#0.53
    ERROR: package/network/utils/nftables failed to build (build variant: json).
make[1]: *** [package/Makefile:129: package/network/utils/nftables/compile] Error 1
make[1]: Leaving directory '/home/kali/openwrt/openwrt'
make: *** [/home/kali/openwrt/openwrt/include/toplevel.mk:233:package/network/utils/nftables/compile] 错误 2

 搜素一圈,依旧无果,几经要放弃。

打开目标项目补丁

打开补丁目标文件检索对于字符串

发现补丁要求修改的地方与源码别无二至,猜测项目维护者已经修改源码,但是openwrt官方维护者并未修改构建过程,果断删除补丁。

编译,通过,撒花完结!

总结

如果要修bug,请尽量修补package目录下相应的控制编译流程的文件,目的文件build_dir中只是项目源码,对其修改并不能保证编译流程的正确进行,即便是要修改源码,也应该是通过补丁方式去修改源码。

刷入

参考教程

小米路由器4A千兆版刷Openwrt固件与设置 - 路由网

更新,多波带宽叠加已解决,原因是水流小,人少了才测出来,插件没问题,插件是GitHub - GuoBaoqi/luci-app-syncdial

具体操作可以在csdn里找到,关键字是openwrt+多线多拨+mwan,这里不在水文

留一手

最后,可能有些小伙伴动手能力没那么强,那么可以去下面网站看看

恩山无线论坛

不保证无毒无后门,也不保证能用,有可能还会花钱,各位童鞋请自行甄别

官方软件仓库可以直接在各大镜像站点找到,比如常见清华源,科大源等

第三方软件仓库

OpenWrt Downloads

  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值