学习编译openwrt固件

/ 5评 / 8

最近断断续续在学习编译 OpenWrt 的固件,下面是一些有用的命令,记录下来以备复习:
判断路由器 CPU 的架构

opkg print-architecture | awk '{print $2}' | grep -v all | grep -v noarch

编译前更改固件默认 IP 地址和登陆密码

vi lede/package/lean/default-settings/files/zzz-default-settings //搜索**$1$V4UetPzk$CYXluq4wUazHjmCDBCqXF.**(password)并替换为你需要的加密后的密码,例如**$1$OUfh5APi$ytd/UlrMS8ntHjG5bKW1A1**(admin)

我家的一台 B2 版的 K2P 买的是硬改版本,卖家改好了双 USB(2.0+3.0)、32MB Flash 和 512 MB RAM。网上几乎很难找到适配于硬改版本的 K2P 固件,也正是因为这台硬改的机器,逼得我不得不学习自己编译固件。
K2P 默认的硬件配置是 16MB Flash,必须要修改两个地方才能让生成的固件不受限于 16MB:

vi lede/target/linux/ramips/image/mt7621.mk //修改K2P固件大小为 IMAGE_SIZE := 32448k (新版本)
vi lede/target/linux/ramips/dts/mt7621_phicomm_k2p.dts //修改分区大小
将
partition@a0000 {
                compatible = "denx,uimage";
                label = "firmware";
                reg = <0xa0000 0xf60000>; //需修改的位置
            };
改为
partition@a0000 {
                compatible = "denx,uimage";
                label = "firmware";
                reg = <0xa0000 0x1fb0000>; //修改此处数值
            };

在编译的过程中,经常容易遇到的问题就是中途编译失败,为了排错,Lean 建议大家用单核进行初次编译,可是即使你的机器性能很高,用单核编译的时间也确实太长了。实际上编译失败主要有几个方面的原因造成的:
1. 网络不好,下载需求包的过程中连接被墙阻断了
2. 系统中有上一次失败编译产生的临时文件未清理干净

经过多次摸索我的心得是首先保证你的网络能正常访问全球互联网,并在编译前就将需求包下载好,避免进行到一半了才因为网络原因导致编译失败。
所以可以在配置好 config 文件后执行下面的命令。

make dirclean //清除上一次编译产生的垃圾
make download -j10 V=s //-j10表示用10个线程同时多点下载

等命令执行完后无错误输出再进行

make -j8 V=s //我的台式机有8个线程

这样编译的过程非常快,像 MiWiFi 这样的 16MB 固件,我差不多十多分钟就能编译成功。X86-Legary这样我会塞很多功能进去的固件也不到半小时就能编译成功。

感谢互联网为开源做贡献的和分享经验的网友们!

参考资料:
https://www.zhukun.net/archives/8351
https://www.right.com.cn/forum/forum.php?mod=redirect&goto=findpost&ptid=389986&pid=3382109
https://www.right.com.cn/forum/forum.php?mod=redirect&goto=findpost&ptid=389986&pid=3389125

5 responses to “学习编译openwrt固件”

  1. terry says:

    你好,最近也在学习openwrt的编译。我的硬路由是网件的R7800,
    想加几个自己想要的插件,所以选择自己编译。
    现在遇到的问题是编译出来的固件体积往往有80-100M,
    虽然能刷进去,但是可能因为固件过大,导致在里面的设置无法保存。
    我主要是想挂在硬盘和U盘,还有就是adguardhome和网易云解锁等一些插件。
    请问有什么好的建议吗?
    先谢谢了。

    • weeper says:

      @terry 根据我的切身体验,你想挂载硬盘和U盘的话,在 extra packages 里勾选 autosamba 和 automount 之后,挂载的依赖问题就解决了(特指 Lean 固件)。
      adguardhome和云解锁这两个包都并不大,你为什么会编译出来那么大的包?
      你是不是增加了 lxc、docker、synsc、rclone 这些软件?我的 K3 增加了这些软件后编译出来的固件体积也是 80-100MB 之巨,我建议不要贪多,如果用不上的功能最好暂时别添加。
      另外关于 ssr plus ,也不建议把所有的都勾选,根据你自己的情况选择一到两个模块就可以了,毕竟只要稳定,你是不可能把所有模块都尝试的,而且折腾模块并不是目的,折腾模块是为了更好地访问网络。

  2. feng says:

    改了32m闪存,软重启或者恢复出厂亮红灯,无法重启,只能把电源启动,你的会这样吗?

    • weeper says:

      @feng 不会,不过我在刷固件的时候发现一个规律,部分机器不能直接在web刷入squashfs固件,最好的方案是在breed里刷入initramfs(之前是非lean固件),重启后再在web页面里刷入squashfs固件。而且GHL的固件我也觉得奇怪,要直接在breed里刷squashfs固件。

      因此,刷固件有三种方式(前提是已经刷入了breed):
      1.直接在web页面升级。
      2.在breed里先刷initramfs固件,重启后再在web里刷squashfs固件。
      3.直接在breed里刷squashfs固件。

      刷完都建议恢复出厂设置避免奇怪的问题。如果恢复出厂后无法启动,也建议用上述三种方法里的另外的方案重刷。

      当然还有一种可能是我编译的固件不完美,并不能在你的设备上很好地工作。请换别的固件。

    • weeper says:

      @feng lean 近期更新了代码之后,增加了 K2P 32M 固件选项,而就是他做的这个改动导致我现在编译出来的 K2P 32M 固件也出现了软重启亮红灯、无法恢复出厂设置的故障。

Leave a Reply

Your email address will not be published. Required fields are marked *