1. OpenWRT简介
下面来看一下百度百科对OpenWRT
的解释:
OpenWrt 可以被描述为一个嵌入式的 Linux 发行版,(主流路由器固件有
dd-wrt,tomato,openwrt三类)而不是试图建立一个单一的、静态的系统。OpenWrt的包管理提供了一个完全可写的文件系统,从应用程序供应商提供的选择和配置,并允许您自定义的设备,以适应任何应用程序。
对于开发人员,OpenWrt
是使用框架来构建应用程序,而无需建立一个完整的固件来支持;对于用户来说,这意味着其拥有完全定制的能力,可以用前所未有的方式使用该设备。------
OpenWrt百度百科
2. 编译环境搭建
wiki上官方步骤:点击进入
本文用的编译环境是Ubuntu18.04 LTS
版的(注意:2020年以后,现在较新的openwrt
版本需要Ubuntu 18.04
以上的版本才可以编译成功,但是搭建流程是一样的)。
下面是为大家整理的编译依赖环境的安装命令:
# Ubuntu18.04LTS 2023/06/25
sudo apt install build-essential ccache ecj fastjar file g++ gawk gettext git git-core 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 gcc-multilib gcc-8 g++-8 python3.7 flex quilt libxml-parser-perl mercurial bzr ecj cvs
用上面的命令即可完成编译环境的搭建,注意:从GitHub
上下载的最新版本代码可能无法从Ubuntu18.04
或者WSL Ubuntu18.04
上面编译通过,请参照 9.注意事项篇。
3. 源码下载
我们这里的源码一律采用主干最新代码,下载地址:
大家可以去GitHub
上下载源码:点击下载
GitHub
下载速度慢可以去Gitee
上下载,这个速度比较快:Gitee
也可以通过git将源码下载到本地(在这儿推荐这种方法),这样的话方便更新。
# 新建一个文件夹
$ mkdir openwrt
# 进入这个文件夹
$ cd openwrt
# 下载主干源码
$ git clone git://github.com/openwrt/openwrt.git
# 若GitHub下载慢,可以用Gitee的资源
# git clone https://codechina.csdn.net/mirrors/openwrt/openwrt.git
# 等待一段时间 最新源码下载完成
# 进入到源码下载目录
$ cd openwrt
这时候,源码下载完毕。
4. 编译之前的准备
-
更新资源
./scripts/feeds update -a ./scripts/feeds install -a
若更新资源失败,则进入第2步:替换修改,若更新成功则跳过第2步,直接进入第3步:执行make menuconfig。
-
替换修改
熟悉编译流程的同学们知道,下载完成源码后,就应该更执行和更新和安装命令。但是这个时候往往更新会失败,为什么呢?— 原因就是一些更新源已经更换为git地址了,但是feeds.conf.default
文件采用的还是https/http
的地址。我们将这个文件里面的地址修改一下即可。
注意:feeds.conf.default
文件就在下载的源码目录下,可以尝试先更新和安装,如果失败则执行这一步修改。# 修改feeds.conf.default文件 $ vi feeds.conf.default # 通过命令将https更换为git :%s/https/git/g # 保存文件 :wq!
下图为修改完成后的效果:
注意:如上图所示,有些git地址被注释掉了,我们一般情况下不用去修改。
修改完后则执行:./scripts/feeds update -a ./scripts/feeds install -a
-
执行make menuconfig
终端下执行make menuconfig
5. make menuconfig配置
执行make menuconfig
后,弹出如下界面:
通过文本对话框进行选项配置,最主要的配置项有:
Target system (目标系统类型,即路由器CPU架构)
Subtarget (子目标,即路由器芯片型号)
Target Profile (目标文件, 即路由器型号)
LuCI (LuCI界面设置)
基本配置:
我采用的是斐讯K2
路由器,网上百度CPU
型号为MT7620
,芯片架构为MIPS
,路由器型号为PSG1208
,那么我的基本配置就为:
Target system -> MediaTek Ralink MIPS
Subtarget -> MT7620 based boards
Target Profile -> Phicomm PSG1208
LuCI
配置:
LuCI
是一个界面,即刷完路由器后,我们需要登陆“192.168.1.1”
来设置路由器参数的界面。
LuCI->
1. Collections->
<*> luci-ssl-openssl
2. Modules->
Translations->
<*>English (en)
<*>Chinese (zh-cn)
配置完以上信息后,OpenWrt
最基本的一些配置已经完成。
6. 开始编译
执行make V=s
进行编译。
或者执行 make -j2 V=s
进行编译。(-j2
为两个线程,-j4
为四个线程,具体看自己的电脑是几线程的,当然线程越多,编译越快。)
注意:第一次编译过程中会下载工具包,所下载的包在dl文件夹下,因此比较慢,耐心等待即可。
7. 编译完成
所生成的文件在openwrt/bin/targets/ramips/mt7620
目录下,其中openwrt-ramips-mt7620-psg1208-squashfs-sysupgrade.bin
为编译出来的固件。通过breed
刷入K2
路由器即可。
8. 其它
假如编译成功,我们可以尝试通过修改make menuconfig
将其它软件包编译到固件中。
9.注意事项
从GitHub
上下载的最新版本代码可能无法从Ubuntu18.04
或者WSL Ubuntu18.04
上面编译通过,以下为编译过程中的记录:
1. 编译时报错:
patchelf.cc:2102:37: error: use of 'auto span<T>::size() const [with T = long unsigned int]' before deduction of 'auto'
size_t idx = (h / ElfClass) % ght.m_bloomFilters.size();
OpenWrt 编译所需的 GCC 最低版本要求是 7.x,建议升级 GCC 到 7.x 或以上版本。可以使用以下命令进行升级:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update
sudo apt install gcc-8 g++-8
安装完成后,将 GCC 和 G++ 更改为新版本:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 50
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 50
或者将将报错文件patchelf.cc
对应的Makefile
文件里面的CC/CXX
变量修改为gcc-8/g++-8
版本:
# vim build_dir/host/patchelf-0.18.0/src/Makefile (不同版本路径不同,请根据实际情况变通)
# 将 CC = gcc / CXX = g++ -std=c++17 改为:
CC = /usr/bin/gcc-8
CXX = /usr/bin/g++-8 -std=c++17
2. 编译时报错:
find: The relative path 'Files' is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove that entry from $PATH
package/Makefile:66: recipe for target 'package/install' failed
这个错误的意思是因为你在系统环境变量 PATH 中包括了一个相对路径 Files,在使用 find 命令时可能会被误用。如果你想要使用 find 命令进行递归查找并执行某些操作,应该使用 -exec,而不是 -execdir。
为了解决这个问题,你可以重构你的环境变量 PATH,并使用绝对路径。在你的 shell 配置文件(例如 .bashrc or .zshrc)中,将 PATH 更改为绝对路径,例如:
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/path/to/Files
3. Python版本需要升级到3.7以上
sudo apt-get install python3.7