Warning: file_exists(): open_basedir restriction in effect. File(/wp-cache-blog.topstalk.com16d347a318bbf5aafc3cb4ba3cb67efd.php) is not within the allowed path(s): (/www/wwwroot/Topstalk.com/:/tmp/:/RAMDisk/) in /www/wwwroot/Topstalk.com/wp-content/plugins/wp-super-cache/wp-cache-phase2.php on line 100
 零基础编译OpenWrt看这一篇就够了 – 沫延说
沫延说
沫延说

Warning: Trying to access array offset on value of type bool in /www/wwwroot/Topstalk.com/wp-content/themes/MDx/single.php on line 71
零基础编译OpenWrt看这一篇就够了
零基础编译OpenWrt看这一篇就够了

前言

在这个信息化产业遍地开花的时代,随着家庭宽带速率的不断提升,现有路由器厂商的解决方案逐渐不再能满足有进阶需求的用户,软路由解决方案应运而生,OpenWrt是其中比较有代表性的软件路由系统

OpenWrt官网提供了多种现成的解决方案供直接下载使用,这些现成的解决方案不仅包括精确到设备的OpenWrt系统固件,还包括了一些架构、平台的通用型OpenWrt系统固件。

我不希望你自行编译OpenWrt固件

你没看错,我写这篇文章的初衷并不是希望用户自行编译OpenWrt的固件,反而我希望用户使用官网现成提供的固件,原因如下:

其一,如果你没有特别需求,自行编译的固件与官方编译的固件没有差别,至于如何定义“特别需求”,你能从我的博客看这篇文章,大概率属于“没有特别需求”了,对于专业人士来说,官方文档讲的还算详细。

其二,编译一次OpenWrt固件需要花费1-3个小时,你没看错,这不仅对计算机配置有要求,比如说4GB内存,还需要你有足够的耐心,因为直到编译的最后阶段,你才会看到是否编译成功,并且,首次编译的成功率极低,这也是我写这篇文章的初衷,我希望你可以多省下几个小时的时间。

其三,中国大陆的网络受到管局监管,官方脚本访问和加载境外资源异常困难,大陆网络环境下编译失败率说99%绝对不夸张,而你同样会在编译的最后阶段才会知道这件事,好吧即便您是那1%既执着又幸运的用户,在这样的网络环境下建议您准备8个小时的时间,以等待极低的跨国光缆的民用网速。

其四,编译操作需要在Linux发行版本中进行,需要有Linux(Debian或Ubuntu或CentOS)操作经验否则寸步难行。

其五,你要懂英语,至少模模糊糊能看懂表述的大概意思。。

 

最后,如果你执意要自行编译OpenWrt,我还有几个好消息要告诉你

 

好消息

其一,你看到这篇文章,可以说大大增加了一次编译通过的成功率,如果完全按照本文走,通过是绝对的。

其二,你可以使用境外服务器或云主机编译,例如阿里云位于硅谷的竞价实例:2Core 4GB RAM运算型主机,带宽按流量计费,每小时才不到0.05元,折合用一天也就才一块多钱

其三,我正在设计一套云编译脚本,理论上可以利用不用花钱的万兆带宽高性能云主机,全自动化搭建+编译,根据Dev版本实测,整个编译流程大概在1h到1h30min之间。

其四,我正在独立开发一个分支,将更加适应中国的网络环境和使用习惯,也欢迎有兴趣的朋友加入这个项目。届时会编译好分发给大家。

 

自行编译教程

1.搭建编译环境

1.1搭建虚拟环境

首先你需要一台搭载Linux的Ubuntu发行版本系统的主机(电脑),使用Ubuntu是因为OpenWrt官方是基于这套系统操作的,虽然他们表面上指引搭建Debian系统,然而命令语法却都是使用Ubuntu系统的,话又说回来,Ubuntu大概率你没有,所以你可以用虚拟化技术来实现:搭建虚拟机或购买云主机解决,虚拟机方面我建议使用VMware的解决方案,云主机可以使用阿里云的解决方案,Ubuntu使用截止目前的最新版本:Ubuntu 20.04.1。

随后登录一个非Root但有sudo权限的账户,使用虚拟机安装的应该已经创建好了,使用云主机产品的如果在root账户下,可以通过adduser [用户名]命令创建,并通过编辑/etc/sudoers文件将新建的用户有资格使用sudo命令,最后使用su [用户名]命令登录,例如:

adduser apple
vi /etc/sudoers
su apple

当然了,别忘了使用:wq!保存sudoers文件

如果你觉得麻烦,当然也有使用root账户进行的方式,只是出错的概率会增加,如果你已经做好了,请直接快进至1.2

如果你执意使用root账户,首先你要去掉下面所有命令中的sudo,因为你本身就是root权限了,不再需要使用sudo,同时,在make命令前,也就是编译前,设置环境变量FORCE_UNSAFE_CONFIGURE的值为1,也就是执行命令:export FORCE_UNSAFE_CONFIGURE=1

1.2安装编译必需的依赖

这一步非常简单,依次执行指令:

sudo apt update
sudo apt-get install curl
sudo apt-get install $(curl -fsSL git.io/OpenWrtPrerequisites-Ubuntu_2004)

当然了,如果后续短链接失效了,您也可以使用下面这两条,与上面三条同等效力,就是有点乱

sudo apt update
sudo apt 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 rsync subversion swig time xsltproc zlib1g-dev

此时开始,网络不行的用户的耐心和信心开始受到攻击,成就感和期待感同脸上的笑容一起逐渐消失

当然了,也许你需要临时配置一下代理:

配置临时环境变量http_proxy和https_proxy以实现本次ssh登录的代理

export http_proxy=http://yourproxyaddress:proxyport
export https_proxy=http://yourproxyaddress:proxyport

 

1.3拉取项目源码

此时你应该使用cd ~命令回到用户目录下再进行操作,

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

此时你将拉取最新的源码,新到还没有正式发布,无论是OpenWrt官方还是我,都不建议你这样做,所以你需要使用-b参数,拉取正式版本源码,下两条指令将等同于上两条,只不过不仅加入-b参数选择文章发布时的最新版本19.07.5,还换为了官方在github上的镜像

至于如何获取到版本号,您可以在执行完第一条不带-b参数的拉取命令后,使用cd openwrt/命令进入源码目录,然后使用git tag命令来查看分支版本,也可以使用git branch命令查看当前拉取的版本,别怪我为何没早说,你必须要先拉取才能获取到这些信息,如果你愿意通过浏览器访问或者其他方式拿到正确的版本号或tab标签也行,如果您是用的我的办法,则需要在获取到版本号后执行rm -rf ~/openwrt/命令以删除拉取下来的数据,因为如果通过git checkout [版本号]命令仅仅是切换了版本号,但是并不会更新数据,简单说就是,他是个本地命令,并不会真的帮你重新拉取相应的版本号的源码

cd ~
git clone -b openwrt-19.07 https://github.com/openwrt/openwrt.git

随后使用cd命令进入刚刚拉取的源码目录

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

1.4编译前准备

依次执行两条指令

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

如果报错权限问题,请回退到上一级目录,输入chmod -Rf 777 openwrt

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

make menuconfig

终于来到了一个异常难用的“可视化”界面,

全英文,左右控制按钮光标,Enter选择按钮光标,

上下控制菜单光标,空格切换菜单光标中的选项,

选项有三:

空,即为空。。。。

M,即为仅编译,不安装项(可以在部署完成后手动安装)

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

最后一定不要忘记save保存,主菜单选择exit退出时也会提示保存,

此步为了保持成功率,以保持信心和建立成就感,建议全默认。

2.开始编译

到了这里没有出现错误,你就可以开始编译了,如果你对你的网络质量没什么信心,可以先执行一下make download,先将需要下载的数据准备好。

然后再执行以下两条命令,会自动筛选出刚刚下载的数据中,小于1kb的文件将他删除掉,因为小于1kb的文件都是下载出现问题的。然后再执行一遍make download会自动补全。

find dl -size -1024c -exec ls -l {} \;
find dl -size -1024c -exec rm -f {} \;
小经验
keyboard_arrow_down

执行过make download后在源码根目录会生成dl文件夹,该文件夹同版本和配置下可移植以降低下次make的等待时间

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

make

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

make -j 3

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

如果还是失败了,而你依然觉得只是运气问题,那就执行make -j1 V=s

毕竟要编译那么长时间,一直盯着他有些无聊,可以将三个命令整合一下:

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

只要第一条命令返回“非”就会继续执行第二条

 

3.再次编译

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

仅清理编译结果
make clean

清理所有编译文件
make dirclean

清理所有编译文件以及相关依赖
make distclean

恢复初始状态
git clean -xdf

其中[

仅清理编译结果等同于删除/bin和/build_dir目录,会影响下次编译,简单说就是没用。。

清理所有编译文件等同于仅清理编译结果加上各种编译产物目录,同架构下调整配置或小版本升级降级用它

清理所有编译文件以及相关依赖等同于回到./scripts/feeds install -a这条命令处,也就是说会删掉所有后加载的数据和信息,换架构或大版本切换用它

恢复初始状态是git级别的,等同于重新拉取(clone),自己把源码改坏了又不知道坏在哪,用它

]

 

清理完成后返回本文1.4节继续执行,如果仅做版本升级降级,不调整配置(不执行make menuconfig),需要执行make defconfig来自动调整配置文件

 

后附全文命令汇总,按执行顺序总结:

export http_proxy=http://xxx.xxx.xxx.xxx:1080
export https_proxy=http://xxx.xxx.xxx.xxx:1080
git clone -b openwrt-19.07 https://github.com/openwrt/openwrt.git
chmod -Rf 777 openwrt/
cd openwrt/
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig
make download
make -j$(nproc)

 

 

 

 

感谢您阅读零基础编译OpenWrt看这一篇就够了

及时获取更多文章,欢迎关注“Topstalk”微信订阅号

Thank you for reading the 零基础编译OpenWrt看这一篇就够了

Get more articles in time,Welcome to follow the "Topstalk" WeChat subscription account

没有标签
首页      运维      Linux系统      零基础编译OpenWrt看这一篇就够了

Morton.L

文章作者

发表评论

textsms
account_circle
email

Warning: Trying to access array offset on value of type bool in /www/wwwroot/Topstalk.com/wp-content/themes/MDx/single.php on line 200
style="background-image:linear-gradient(to bottom, rgba(0,0,0,0) 45%,rgba(0,0,0,0.7) 100%),url(https://blog.topstalk.com/wp-content/themes/MDx/img/dpic.jpg");>

沫延说

零基础编译OpenWrt看这一篇就够了
前言 在这个信息化产业遍地开花的时代,随着家庭宽带速率的不断提升,现有路由器厂商的解决方案逐渐不再能满足有进阶需求的用户,软路由解决方案应运而生,OpenWrt是其中比较有代表性的…
扫描二维码继续阅读
2021-01-17