2021-07-08 17:05:31

软路由 OpenWRT(LEDE)自己编译教程记录


软路由 OpenWRT(LEDE)自己编译教程记录

最近博主买了一个小工控机,开始玩软路由,顺便将我的经历记录下来,分享给后人避免我走过的坑,本篇文章主要写自己编译OpenWRT(LEDE),后面我还会写一个 利用 Github 的 Actions Workflows 进行自动化的编译教程和 x86 软路由系统安装的教程。

先展示一下我的硬件,是从咸鱼上收的一台工控机,并没有任何品牌,J1900 的 CPU,板载 4G 内存,硬盘是个 32G 的 msata 硬盘,双网口,就是下面的小家伙:

IMG_2992 copy.jpg

软路由系统

说到为什么要玩软路由,除了硬件性能以外,必须得是丰富的插件,让路由器有丰富的功能,软件才是软路由的灵魂!现在软路由系统主流的分为两大派:爱快和OpenWRT,爱快网络速度更快限流比较好,OpenWRT插件多功能多,有的人两个都装了,我只装了一个OpenWRT,因为我不用限流也没有多 WAN 口多加运营商接入。

OpenWRT和LEDE

在2016年,从 OpenWRT 中分离出一个分支子项目 LEDE,2018年又合并回 OpenWRT,现在基本没啥区别,所以不用纠结 LEDE 不是纯正的 OpenWRT。

我选用了 Lean 的 LEDE,也就是网上常说的 L大 的项目,里面加入了很多功能和插件,更适合中国人使用,Lean 的 LEDE 仓库地址:https://github.com/coolsnowwolf/lede

修改源码与订阅

既然选择了自己编译,肯定要进行 DIY 定制,在里面加入自己想要的功能,所以我 Fork 了 Lean 的仓库到我自己的:https://github.com/renfei/lede,然后添加自己想要的插件源代码,因为有一些插件是无法在国内公开的,所以需要自己找然后自己加进去再编译,有两种方式:

  • 使用 feeds.conf.default 文件订阅别人的仓库,这个最方便,每次编译时就会去拉取订阅的仓库最新的代码进行编译。

  • 在文件夹 package 中加入源代码,例如 package/lean 里面就是各种插件的源代码。

根据自己的需要添加和修改一些插件,就形成了属于你的软路由系统。

编译环境准备

首先,在编译过程中会下载境外的代码仓库,所以你懂得,我选择了新加坡的服务器,因为编译时间非常长,需要几个小时,所以我选择购买新加坡的服务器进行编译,这样会快一些,并且不会因为网络问题导致依赖下载失败编译出错。服务器我选择了4核心8G内存,硬盘选择了50G容量,内存过小或硬盘过小也会导致编译失败,下面就是我购买的服务器:

WX20210706-222652.png

其次,操作系统要选择 Linux,推荐 Ubuntu 20.04 LTS x64,我也是用这个操作系统演示的。

开始编译

注意事项:要使用普通用户执行,不要使用 root 账户!否则会出现异常和失败。

首先我们需要更新和安装依赖的环境,使用如下命令:

sudo apt-get update
sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 python2.7 unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler g++-multilib antlr3 gperf wget curl swig rsync

Screen Shot 2021-07-06 at 22.04.05.png

Screen Shot 2021-07-06 at 22.04.20.png

然后克隆我们的项目,使用如下命令:

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

克隆以后,我们进入项目:

cd lede

然后执行订阅的更新与安装,使用如下命令:

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

Screen Shot 2021-07-06 at 22.06.07.png

使用下面的命令生成默认的配置文件:

make defconfig

Screen Shot 2021-07-06 at 22.09.30.png

使用下面的命令进入图形化配置:

make menuconfig
  • Target System:编译目标的架构,我这里编译的是 x86 架构的,你需要选择你自己的。

  • Subtarget:编译目标架构的子级,因为同一个架构还对应很多子级,比如我这里是 x86/64 ,x86架构64位的。

最主要的是 LuCI,我们进这里面选择要编译的插件

Screen Shot 2021-07-06 at 22.11.21.png

然后进入 Application,这里面就是插件了

Screen Shot 2021-07-06 at 22.11.28.png

我们看到插件前面有个尖括号,里面是星号<*>的就是直接编译进系统,如果是大写字母<M>的就是只编译成ipk包而不直接编译进系统,这个根据自己的想法选择。如果想直接编译进系统就按字母 y 选择成星号<*>,如果只编译成ipk包就按字母 m 选择成大写字母<M>,再按一遍就是取消选择。

Screen Shot 2021-07-06 at 22.11.39.png

这里有个大坑,最好不要无脑全选,因为有的插件相互依赖,有的相互排斥,全选必定编译失败,直选你需要的就好,不要贪心哦。

然后使用左右键选择<Save>,再回车,保存 .config 配置文件,再选择 <Exit> 一路退出到黑屏界面。

Screen Shot 2021-07-06 at 22.15.57.png

执行下面的命令开始下载依赖:

make -j8 download V=s

Screen Shot 2021-07-06 at 22.16.12.png

这里就体现出境外服务器的好处了,下载又快又不会失败,这步需要一些时间,不要退出或关闭命令行界面,否则就会停止,如果担心中途会断开,我们可以使用下面的命令让他后台运行:

nohup make -j8 download V=s > make.log & tail -f make.log

等日志不再滚动,我们就可以执行编译了,编译这一步需要好几个小时,所以必须得后台运行,并且建议单线程编译,所以是 -j1,命令如下:

nohup make -j1 V=s > make.log & tail -f make.log

Screen Shot 2021-07-06 at 22.45.07.png

经过N个小时的等待,日志不再滚动,我们就编译完成了,编译结果在 bin/targets 下面,我编译的是 x86_64 的所以编译好的系统文件路径是 bin/targets/x86/64,里面有多种格式。

编译好的插件包在 bin/packages 下面,我编译的是 x86_64 的所以编译好的系统文件路径是 bin/packages/x86_64,里面就是我们订阅的插件库,编译好的 ipk 包了。

Screen Shot 2021-07-07 at 13.31.21.png


商业用途请联系作者获得授权。
版权声明:本文为博主「任霏」原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://www.renfei.net/posts/1003503
评论与留言
以下内容均由网友提交发布,版权与真实性无法查证,请自行辨别。

本站有缓存策略,时间约2小时后能看到您的评论。本站使用自动审核机制,如果您的内容包含广告/谩骂/恐怖/暴力/涉政等不和谐内容将无法展示!


本站有缓存策略,时间约2小时后能看到您的评论。本站使用自动审核机制,如果您的内容包含广告/谩骂/恐怖/暴力/涉政等不和谐内容将无法展示!

关注任霏博客
扫码关注「任霏博客」微信订阅号
微博:任霏博客网
Twitter:@renfeii
Facebook:任霏
最新留言 优先级低的并不代表一定要等到优先级高的运行完才能运行,只是cpu分配的资源少了而已。 /lib64/ld-linux-x86-64.so.2: No such file or directory 报了这个错误,怎么解决呢 对于一个布道 DevOps 多年的选手来讲,看到这个报告,还是想继续布道布道。虽然是各种对比哈,但是我感觉与 DevOps 太像了(可能是职业病犯了哈)。首先声明本人不是GitLab 用户(因为不免费,没法薅羊毛啊),本人是 GitHub 忠实用户。 首先,你这是田忌赛马的对比,中文对比一事,着实有点可笑 1 土生土长和外来户能立马拉到同一个起跑线上吗? 2 一个真正的开发者应该去提升自己的英语能力,而不是拿全部是中文文档说事。大家都知道现在开源非常热,开发者是开源的主力军,如果要贡献优秀的开源项目(诸如Linux 内核,Kubernetes),英语就是个硬门槛。如果我是你,我倒希望公司内部的系统是英文的,最起码能让我锻炼英语,在看开源项目文档的时候不至于看不懂,提 PR 的时候不至于提交代码的内容描述不清楚而没法被 Merge。 其次,阿里云效、Coding 大家都知道背后站的是谁,很容易造成厂商绑定,现在很多企业都希望不要被厂商绑定。 再者,有一个点需要明白,GitLab 是一个 DevOps 平台,什么叫做 DevOps 平台(DevOps 走到现在,确切的说应该叫做 DevSecOps)?就是覆盖了软件开发生命周期全阶段的,从项目管理到代码托管到安全再到日志监控、甚至包含现在的云原生能力。不仅仅是说一个 CI/CD 就能概括的了的。这一点是 DevOps 布道的真正误区,我见过太多了,我在这儿再布道一哈,CI/CD 不等于 DevOps,他只是 DevOps 落地实践的核心能力。仅凭借一个 CI/CD 能有现成模版就判断出哪个好坏,过于牵强了吧。相信大家真正到项目用的时候,模版是满足不了要求的吧,毕竟大家都很特性化。 最后,还是一个很热的话题,开源,open source。GitLab 是开源的,Coding 和 云效这方面我没看到相关的开源内容(可能是我孤陋寡闻)。大家可以看看国内有多少用 GitLb 的,GitLab 的 CE 版,然后私有化部署,就是很多公司的代码托管 + DevOps 解决方案。 个人愚见,做一些对比报告的时候,还是先需要明白这个产品的定位,去深入挖掘一些真正有意义的对比,这样的对比报告才能有意义。作为一个常年写博客、文章的人来说。你写的每个字、每篇文章,你要想到你的思想会影响到别人。有可能因为你的片面之词,让别人错失一些学习的好机会。 docker run 那一长串后,出来一个字符串,然后去 docker containers 下面看 显示 exited(1);logs 下就一行错误 initdb failed 感谢🙏,第一个问题是空格的问题应该,我逐字敲完后可以构建了.第二个问题是我docker环境的问题,docker更新为最新版后需要重置配置文件.现已经正常使用,再次感谢您的分享和您的细心解答,期待下次相遇😄 还有一个问题可以请教下吗?就是我在容器里建文件夹没有权限,su root后密码不知道是多少,sudo mkdir xxx 提示我,没有sudo命令,请问有好的解决方法吗?谢谢解答 -v 后面可以指定文件吗 我的也是报错,还有。我执行了这个:@localhost kingbase-es-v8-r3-docker % docker run -d --name kingbase -p 54321:54321 -e SYSTEM_PWD=SYSTEM -v /opt/kingbase/data:/opt/kingbase/data -v /opt/kingbase:/opt/kingbase/Server/bin kingbase:v8r3 docker: 'run -d --name kingbase -p 54321:54321 -e SYSTEM_PWD=SYSTEM -v /opt/kingbase/data:/opt/kingbase/data -v /opt/kingbase:/opt/kingbase/Server/bin kingbase:v8r3' is not a docker command. See 'docker --help' 麻烦帮忙看下,是不是我写的命令有问题,还是版本问题,谢谢啦 请问我build的时候一直报错,是资源没了吗?failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to do request: Head "https://reg-mirror.qiniu.com/v2/library/centos/manifests/7?ns=docker.io": Moved Permanently 能不能在代码那里详细解释一下啊,没完全懂呀 en 按照路径上的来操作的,但是启动时一直报:zsh: no such file or directory: docker run -d --name kingbase -p 54321:54321 -e SYSTEM_PWD=SYSTEM -v /Volumes/installation/opt/kingbase/data:/opt/kingbase/data -v /Volumes/installation/opt/kingbase/bin/license.dat:/opt/kingbase/Server/bin/license.dat kingbase:v8r3 错误