学习编译openwrt固件

/ 2评 / 7

最近断断续续在学习编译 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

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

  1. 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固件。

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

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

Leave a Reply

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