OpenWrt固件编译

基于lean的OpenWrt源码编译路由固件

基于lean的OpenWrt源码编译路由器固件

一、OpenWrt

1.1 OpenWrt简介

OpenWrt是一个嵌入式设备上的Linux发行版。目前主流路由器固件有OpenWrtPadavan华硕梅林等。

二、环境说明

注意

由于国内网络环境问题,openwrt在编译过程中很多依赖网络获取的包会下载失败,进而导致编译失败。

故openwrt源码编译过程中,最好要保持全局代理

若使用Linux系统进行源码编译,一定不能在root用户下进行!

2.1 华为云ECS实例

购买一台公网在海外的CPU计算型服务器,这里以墨西哥实例为例。

/ledetrial/images/ping.webp
Ping Google

可以极低延迟访问Google。

实测Github源码下载速率30+MB/s:

images/github.wepb
Github Clone

2.2 环境依赖

  • 添加32位架构支持:
1
2
3
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libgcc1:i386 libstdc++5:i386 libstdc++6:i386
  • 安装依赖库
1
2
3
4
5
6
7
8
sudo apt update -y
sudo apt full-upgrade -y
sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \
bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib \
git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev \
libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz \
mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pip qemu-utils \
rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev

三、固件编译

3.1 克隆lean的OpenWrt源码

1
2
./script/feeds updata -a
./script/feeds install -a

3.2 OpenWrt Configuration

  • 编译菜单配置:
1
make menuconfig

如下图所示:

/ledetrial/images/menuconfig.png
OpenWrt Config

以下为必配置项

  • Target System
  • Subtarget
  • Target Profile
  • Target Images

如何操作选择项可参照Configuration标题栏提示

手头的这个路由处理器是MTK的MIPS架构,故Target System选择的是MediaTek Ralink MIPS。不清楚路由器CPU架构可以先上网搜索路由器型号的配置参数,然后搜索其处理器架构,便能悉知。

SubTarget选择CPU型号

Target Profile选择Openwrt预设的对应路由器型号的编译参数

Target Images选择输出镜像的格式

剩余的选项中,基本上除了LuCI以外的都无需改动。其中Build the OpenWrt SDK为仅编译出openwrt开发工具包,当后续想要编译单个ipk包的时候,就可以仅选择此项,而不配置LuCI

3.3LuCI 定制

LuCI配置如下图所示:

/ledetrial/images/LuCI.webp
LuCI

其中,以下几项是编译固件过程中常需修改的:

  • Applications
  • Themes

3.3.1 Application应用包

Application中按需选择固件中预置的APP包,需结合Flash容量限制,选择过多包会导致性能下降或者编译故障(编译输出中会打印xxx.bin is to big !,即编译出的.bin超过路由器flash的大小)。

3.3.2 Themes主题

默认主题修改

编辑feeds/luci/collections/luci/Makefile

1
vi feeds/luci/collections/luci/Makefile

其内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
include $(TOPDIR)/rules.mk

LUCI_TYPE:=col
LUCI_BASENAME:=luci

LUCI_TITLE:=Standard OpenWrt set including full admin with ppp support and the default Bootstrap theme
LUCI_DEPENDS:= \
        +uhttpd +uhttpd-mod-ubus +luci-mod-admin-full +luci-theme-bootstrap \
        +luci-app-firewall +luci-proto-ppp +libiwinfo-lua \
        +rpcd-mod-rrdns

PKG_LICENSE:=Apache-2.0

include ../../luci.mk

将其中的luci-theme-bootstrap改为目标主题,例如luci-theme-argon

注意
在配置完Configuration的所有选项后,务必记得进行Save保存操作!

3.4 编译

3.4.1 dl依赖包获取

执行此步骤是为了在加快编译速度,即在正式编译开始前,提前准备好当前配置下的编译依赖文件,即此步骤可理解为预编译步骤。

1
make download -j16

其中,-j 选项为线程数,即以16线程下载预编译的dl依赖文件。

3.4.2 编译固件

1
make V=99 -j32

其中,V=选项为打印日志级别,V=99代表打印所有输出日志。

网上诸多论坛均表示(包括作者lean),“第一次编译建议-j=1,即以单线程编译”。个人认为并不需要这么操作,因为多线程编译时主要是很多日志不会打印出来,因此若编译出错就不好根据日志调错。但是不得不说lean的这套代码还是很强大,除了编译环境flash容量限制这两个问题外,一般不会出错,故首次编译鄙人认为无需强制单线程,先多线程编译,若编译出错再换单线程编译,因为单线程真的编译非常慢。

3.4.3 二次编译(扩展)

上述步骤为正常编译OpenWrt的一般步骤,以下内容为补充说明部分。

重复编译前最好删除临时缓存文件及配置信息,因为在编译过一次后,再取消选择Configuration中的选项,之后的编译过程并不会取消编译某个选项。倘若配置信息过于复杂,且只需取消少量选项,那么可以通过手动编辑.config文件,注释掉选择行即可。(可以先通过catgrep管道的组合,打印某个选项的所在行及行号,以便快速确认该选项在.config文件中的位置,.config文件有几千行。然后通过vim编辑文件,:set number开启行号显示)。

删除./tmp.config

1
rm -rf ./tmp && rm -rf .config

3.5 添加其他LuCI包依赖

kenzok8整理的openwrt-packages为例:

1
2
3
4
5
cd lede
sed -i '$a src-git kenzo https://github.com/kenzok8/openwrt-packages' feeds.conf.default
sed -i '$a src-git small https://github.com/kenzok8/small' feeds.conf.default
./script/feeds updata -a
./script/feeds install -a

4 歌华链Ghl-001固件预览

/ledetrial/images/login.webp
Login界面
/ledetrial/images/socks.webp
VPN-passwall
给作者倒杯卡布奇诺 ~
Albresky 支付宝支付宝
Albresky 微信微信