Openwrt-自定义编译固件教程

编译环境准备

系统镜像:建议ubuntu系统

网络环境:自备梯子,最好使用全局,防止下载失败

配置:越高越好,影响编译速度

进入系统后更新本地环境

sudo apt-get upgrade
sudo apt-get update

安装依赖

ubuntu 22.04 ,安装依赖

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

ubuntu 20.04 ,安装依赖

sudo apt-get 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 -y
ubuntu 18.04 ,安装依赖
sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs gcc-multilib g++-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler antlr3 gperf wget swig rsync

lede源码依赖安装

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-pyelftools libpython3-dev qemu-utils rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev

选择并下载源码

下载openwrt官方源码

git clone https://git.openwrt.org/openwrt/openwrt.git

如果要使用lede源码则使用

git clone https://github.com/coolsnowwolf/lede

此时你将拉取最新的源码,新到还没有正式发布,OpenWrt官方不建议你这样做,所以你在下载的源码目录中需要使用checkout检出指定版本,示例切换到23.05版本

git checkout v23.05

至于如何获取到版本号:

您可以通过访问OpenWrt的github官网,查看其tab标签或在执行完git clone https://git.openwrt.org/openwrt/openwrt.git命令后,使用cd openwrt/命令进入源码目录,然后使用git tag命令来查看标签版本或者使用git branch -a命令来查看远程分支信息。

如果你已经拉取过了,可以在项目根目录使用git pull重新拉取

编译前准备

执行以下两条命令

./scripts/feeds update -a
./scripts/feeds install -a

最好翻上去看看有无报错的出现,如果有,请再次执行
如果报错权限问题

请回退到上一级目录,输入chmod -Rf 777 openwrt

更新go语言

由于软件包的更新,有时会对依赖的go语言版本为更高的版本,所以要先更新一下依赖的go语言,避免编译错误

rm -rf feeds/packages/lang/golang
git clone https://github.com/sbwml/packages_lang_golang -b 22.x feeds/packages/lang/golang

添加自定义软件

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
git pull
./scripts/feeds update -a
./scripts/feeds install -a

这里添加的是kenzok8的常用软件库,可加可不加,只需要将要编译的软件下载到openwrt源码目录的packages目录下即可

编译配置(自定义软件)

随后你已经做好了所有的编译前准备工作,使用下面一条指令定制OpenWrt

make menuconfig

来到了一个“可视化”界面,

左右控制按钮光标,Enter选择按钮光标,上下控制菜单光标,

通过空格或y/n切换菜单光标中的选项,

选项有三:

空,即为空。。。。

M,即为仅编译,不安装项(可以在部署完成后手动安装以降低固件大小)

*(星号),即为编译并安装

最后一定不要忘记save保存。

建议选好架构后获取默认配置,先进行一次编译,编译成功后再添加其他软件。获取默认配置命令如下

make defconfig

开始编译

现在可以开始进行编译,但是建议先下载好编译的所需dl库,防止编译时下载失败,导致编译失败

make download -j 1 V=s

执行过make download后在源码根目录会生成dl文件夹,该文件夹可备份以节省下次编译的下载时间

执行命令make即可开始交叉编译了(交叉编译的意思就是在一种系统编译另一种系统的可执行程序的行为)

make

如果你想提高一些速度,并且不担心出现问题(根据官方描述,多线程编译有可能会出现问题),可以使用-j [n]参数进行多线程编译,其中“n”替换为处理器线程数+1的值,例如云主机为2核心,则:

make -j 3

根据官方文档给出的命令,传递-j参数时有时候有空格有时候又没有空格,即make -j4和make -j 4的区别

您也可以使用官方给出的“一步到位”命令:

make -j $(($(nproc)+1))

如果直接执行make失败了,且报错信息均已排查没有问题,你通样可以使用-j参数强制将线程设为1,即:

make -j 1

也可通过使用传递参数V=s打印更详细的编译日志,
V=99 输出详细的 de­bug 信息

make -j $(($(nproc)+1)) V=s

整合命令

make -j $(($(nproc)+1)) || make -j1 || make -j1 V=s

这里是先用系统的线程数+1编译一次,如果编译失败则使用线程数1进行编译,如果依然失败,则使用线程数1进行编译并输出日志,理论上不输出日志时编译的速度会快很多

编译成功后,固件位于项目根目录下的bin文件夹内

再次编译

如果我们对OpenWrt进行了调整,需要再次编译固件,此时我们就需要清理首次编译时的一系列产物防止对下一次编译造成影响,具体清理命令如下:

仅清理编译结果(bin目录)
make clean

清理所有编译文件(除了.config、dl文件夹和feeds以外都清理)
make dirclean

清理所有编译文件以及相关依赖(完全清理干净,一键回到刚git clone下来的时候)
make distclean

如果您手动或使用make menuconfig对配置文件.config进行了调整,则需要执行make defconfig来自动调整配置文件

自定义系统的设置(可选)

LEDE 添加 IPV6支持:

勾选以下软件包即可:

extra packages ---> ipv6helper

然后将ip6tables的两个扩展都选上

Network ---> Firewall ---> ip6tables
---> ---> ---> ---> ---> ---> ---> ---> ---> ip6tables-extra
---> ---> ---> ---> ---> ---> ---> ---> ---> ip6tables-mod-nat

设置路由器默认的 LAN IP

设置默认IP为 192.168.199.1

sed -i 's/192.168.1.1/192.168.199.1/g' package/base-files/files/bin/config_generate

官方openwrt项目设置默认agron主题:

git clone https://github.com/jerrykuku/luci-theme-argon.git openwrt/package/luci-theme-argon

替换默认主题为 luci-theme-argon

sed -i 's/luci-theme-bootstrap/luci-theme-argon/' feeds/luci/collections/luci/Makefile

LEDE 项目设置默认agron主题:

git clone -b 18.06 https://github.com/jerrykuku/luci-theme-argon.git package/lean/luci-theme-argon-18.06

替换默认主题为 luci-theme-argon

sed -i 's/luci-theme-bootstrap/luci-theme-argon-18.06/' feeds/luci/collections/luci/Makefile

LEDE 添加无线支持:

将以下软件包选择即可:(小米路由R3G,R3P测试正常)

LuCI ---> Applications ---> luci-app-mtwifi #MWAN负载均衡

如果不支持自行寻找其他方法

LEDE修改默认软件源:

修改package/lean/default-settings/files/zzz-default-settings文件

将39行的 mirrors.tencent.com/lede 修改为新的域名

下面的 sed -i '/openwrt_luci/ { s/snapshots/releases\/18.06.9/g; }' /etc/opkg/distfeeds.conf 会把/snapshots/openwert_luci的字符修改snapshots/releases.18.06.9

自己按照自己的路径进行修改或注释

常用插件列表

## 插件类
LuCI ---> Applications ---> luci-app-accesscontrol #上网时间控制
LuCI ---> Applications ---> luci-app-adbyby-plus   #去广告
LuCI ---> Applications ---> luci-app-arpbind  #IP/MAC绑定
LuCI ---> Applications ---> luci-app-autoreboot  #高级重启
LuCI ---> Applications ---> luci-app-aliddns   #阿里DDNS客户端
LuCI ---> Applications ---> luci-app-ddns   #动态域名 DNS
LuCI ---> Applications ---> luci-app-filetransfer  #文件传输
LuCI ---> Applications ---> luci-app-firewall   #添加防火墙
LuCI ---> Applications ---> luci-app-frpc   #内网穿透 Frp
LuCI ---> Applications ---> luci-app-mwan3   #MWAN负载均衡
LuCI ---> Applications ---> luci-app-nlbwmon   #网络带宽监视器
LuCI ---> Applications ---> luci-app-ramfree  #释放内存
LuCI ---> Applications ---> luci-app-samba   #网络共享(Samba)
LuCI ---> Applications ---> luci-app-sqm  #流量智能队列管理(QOS)
LuCI ---> Applications ---> luci-app-openclash #你懂的那只猫
LuCI ---> Applications ---> luci-app-dnsfilter #广告过滤
LuCI ---> Applications ---> luci-app-passwall #不敢解释
LuCI ---> Applications ---> luci-app-mtwifi #闭源Wi-Fi驱动
LuCI ---> Applications ---> luci-app-eqos #根据IP控制网速
LuCI ---> Applications ---> luci-app-syncdial #薛定谔的多拨应用
LuCI ---> Applications ---> luci-app-zerotier #虚拟局域网
LuCI ---> Applications ---> luci-app-oaf #应用过滤神器
LuCI ---> Applications ---> luci-app-watchcat #断网检测功能与定时重启
LuCI ---> Applications ---> luci-app-wol   #WOL网络唤醒
LuCI ---> Applications ---> luci-app-wrtbwmon  #实时流量监测
LuCI ---> Applications ---> luci-app-upnp   #通用即插即用UPnP(端口自动转发)
LuCI ---> Applications ---> luci-app-argon-config #Argon主题设置

# 常用主题类
LuCI ---> Themes ---> luci-theme-argon

# 网络相关 (普通用户用不上)
Network ---> IP Addresses and Names ---> ddns-scripts_cloudflare.com-v4
Network ---> IP Addresses and Names --->  bind-dig
Network ---> Routing and Rediction ---> ip-full
Network ---> File Transfer ---> curl
Network ---> File Transfer ---> wget-ssl
Network ---> iperf3
Network ---> ipset
Network ---> socat #多功能的网络工具
Base system --> dnsmasq-full #DNS缓存和DHCP服务(dnsmasq-full和dnsmasq二者不可共存)

# 工具类 (普通用户用不上)
Utilities --> acpid  #电源管理接口(适用于x86平台)
Utilities --> Editors --> nano #Nano 编辑器
Utilities --> Shells --> bash #命令解释程序
Utilities --> disc --> eject #弹出可移动介质
Utilities --> disc --> fdisk #MBR分区工具
Utilities --> disc --> gdisk #GBT分区工具
Utilities --> disc --> lsblk #列出磁盘设备及分区查看工具
Utilities --> Filesystem --> resize2fs #调整文件系统大小
Utilities --> Filesystem --> e2fsprogs #Ext2(及Ext3/4)文件系统工具

# IPv6(未来运营商可能不再提供 IPv4 公网地址,有远程访问需求的建议加入)
Extra packages ---> ipv6helper (勾选此项即可,下面几项自动勾选)
Network ---> odhcp6c
Network ---> odhcpd-ipv6only
LuCI ---> Protocols ---> luci-proto-ipv6
LuCI ---> Protocols ---> luci-proto-ppp
© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容