简介

Openwrt可以说是最常用的开源的软路由系统了,之前我是用的都是别人编译好的系统,但是用了很多之后发现没有一个是完全适合自己的,要么就是有严重的BUG要么就是功能达不到自己想要的,所以打算自己编译自己的Openwrt,经过一个多星期的尝试,终于编译出了自己地Openwrt。

编译Openwrt需要魔法上网环境,需要Ubuntu系统,这两个缺一不可,Ubuntu这个好解决,用虚拟机就可以了,但是如果你没有外网环境的话可以是用云服务器编译或者是github编译。

如果使用的是云服务器的话编辑方法和我下面说的差不多,如果是使用github编译的话你只能重新找相关的教程了,因为我也不会,我是用的是虚拟机编译。

虚拟机安装

我是用的虚拟机软件是VMware Workstation Pro,简称VM,如果没有相关软件或者是不会是用虚拟机软件的请自行百度。

首先下载一个Ubuntu系统,官方下载连接如下

https://ubuntu.com/download/desktop/thank-you?version=22.04.2&architecture=amd64

打开VM,点击【创建新的虚拟机】 1.png

选择【自定义(高级)】,点击【下一步】 2.png

保持默认,直接点击【下一步】 3.png

选择稍后安装操作系统,点击【下一步】 4.png

选择【Linux】和【Ubuntu 64 位】,点击【下一步】 5.png

虚拟机名称自定义,也可以保留原来的,位置可以自己选,也可以默认,选择好了之后点击【下一步】 6.png

处理器配置根据自己的情况来选择,只要不操作自己电脑处理的的线程就可以,我电脑是12线程的,我这里可以给10个线程给虚拟机,选择好之后点击【下一步】 7.png

内存也是根据自己实体机的情况来填写,我电脑是16G的内存,我给虚拟机分8G,分好之后点击【下一步】 8.png

网络配置可以使用默认也可以修改,我这里修改为【使用桥接网络】,因为需要魔法上网环。境,但是我没有软路由,我用了一个虚拟机来做旁路有,所以我的Ubuntu需要从路由器获取到IP才能魔法上网,选择好了之后点击【下一步】 9.png

I/O控制默认就行,点击【下一步】 10.png

磁盘类型默认即可,点击【下一步】 11.png

选择磁盘也是默认,点击【下一步】 12.png

磁盘容量根据自己电脑情况尽可能的填大一点,我虚拟机放在E盘,我E盘现在还有120G,我可以给虚拟机110G,剩下的默认然后点击【下一步】 13.png

指定磁盘文件默认即可,点击【下一步】 14.png

点击【完成】 15.png

点击【编辑虚拟机】 16.png

选择【CD/DVD】,选择【使用ISO映像文件】,点击【浏览】选择刚刚下载好的Ubuntu系统,选择好了之后点击【确定】 17.png

点击【开启虚拟机】 18.png

选择好语言,然后点击【安装Ubuntu】 19.png

键盘布局这个地方有可能显示不完整,点击不了【继续】按钮,这时候可以按【win+鼠标左键】拖动窗口然后点击【继续】按钮安装 20.png

可以保持默认,然后点击【继续】 21.png

可以保持默认,点击【现在安装】 22.png

不管弹出什么提示,直接点击【继续】 23.png

选择时区,我选择的是上海的,选择好之后点击【继续】 24.png

这里更具自己的喜好设置一个名称和密码即可,设置好时候点击【继续】 25.png

接下来等待安装完成即可 26.png

安装完成,点击【现在重启】 27.png

重启好了之后登录进去,按【ctrl+alt+t】打开终端 28.png

为了方便使用,先安装一个SSH

sudo apt install -y openssh-server

29.png

更新系统

sudo apt update
sudo apt upgrade -y

接下来就是配置魔法上网了,我是用的是旁路有来进行魔法上网,所以就是改一个IP的事,我这里不介绍怎么配置魔法上网环境,如果不会的可以留言 30.png

配置好了之后可以保存一个快照,万一玩坏了可以快速恢复,不用重装系统 31.png

安装编译环境

执行下面命令安装编译依赖,编译依赖的安装速度取决于你魔法上网的速度

sudo apt install -y ack antlr3 aria2 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 libpython3-dev qemu-utils \
rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev

清理

sudo apt autoremove --purge
sudo apt clean

克隆源码

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

进入源码文件夹

cd lede

添加插件源和主题源

vi feeds.conf.default

打开后是这样的 32.png

按i进入编辑模式,把下列的代码复制粘贴到里面去,前三个连接时源码仓库,第四个是主题,第五个是DDNS-GO

src-git haibo https://github.com/haiibo/openwrt-packages
src-git kenzo https://github.com/kenzok8/openwrt-packages
src-git small https://github.com/kenzok8/small
src-git infinityfreedom https://github.com/xiaoqingfengATGH/luci-theme-infinityfreedom.git
src-git ddnsgo https://github.com/sirpdboy/luci-app-ddns-go

编辑好了之后按【esc】键,然后输入“:wq”按回车保存退出 33.png

更新并安装feeds.conf.default中配置的源

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

定制固件

make menuconfig

34.png

按方向键调整选项,按回车选中

前两个选项是处理器架构,我的软路由是X86-64的架构,所以我保持默认就可以了

选中【Target Images ---> 】这个选项,按回车进入 35.png

往下,找到【(16) Kernel partition size (in MiB) (NEW)】选项和【(400) Root filesystem partition size (in MiB) (NEW) 】选项,这个是分区大小,需要调整大一下,可以调整成256和125,我软路由空间大我就改成512和1024 36.png

改好之后按两次【esc】键退出当前页面,回到上一级页面 37.png

往下选,找到【LuCI】,按回车进入 38.png

进入【3. Applications ---> 】选择需要编译的插件,按【Y】是选中,按【N】是取消选中,按【M】是编译出IPK文件不安装到系统里面需要自己安装

40.png

如果看不懂这个插件名可以直接百度Openwrt插接对照表

选中自己需要的插件完成后按两次【esc】返回上一级,进入【4. Themes ---> 】进入主题选择,也是按【Y】选中

41.png

选中好自己需要安装的主题之后,直接退出自定义固件的界面,出现询问是否保持配置文件的界面是,选择【yes】

42.png

下载编译所需的软件包

make download -j8 V=s

看看有没有没下完整的包,这是查看dl目录下有没有1k以下的文件,有的话建议删除重新下,很可能没下完整

find dl -size -1024c -exec ls -l {} \;

如果有的话是用下面命令删除,然后在从新是用make download -j8 V=s命令从新下载

find dl -size -1024c -exec rm -f {} \;

首次编译

第一次编译建议是用单线程编译,如果想要多线程编译可以把-j1中的数字改成你系统线程的数字

make -j1 V=s

以下这种情况就是编译成功了,只要没有报错则是编译成功 43.png

二次编译

更新

进入源码目录(如果不在此目录)

cd lede

更新系统软件包

sudo sh -c "apt update && apt upgrade -y"

更新Openwrt源码

git pull

更新feeds源中的软件包源码

./scripts/feeds update -a

安装feeds中的软件包

./scripts/feeds install -a

清理

清除旧的编译产物(可选),在源码有大规模更新或者内核更新后执行,以保证编译质量。此操作会删除/bin和/build_dir目录中的文件。

make clean

清除旧的编译产物、交叉编译工具及工具链等目录(可选),更换架构编译前必须执行。此操作会删除/bin和/build_dir目录的中的文件(make clean)以及/staging_dir、/toolchain、/tmp和/logs中的文件。

make dirclean

清除 Open­Wrt 源码以外的文件(可选),除非是做开发,并打算 push 到 GitHub 这样的远程仓库,否则几乎用不到。此操作相当于make dirclean外加删除/dl、/feeds目录和.config文件。

make distclean

还原 Open­Wrt 源码到初始状态(可选),如果把源码改坏了,或者长时间没有进行编译时使用。

git clean -xdf

清除临时文件,删除执行make menuconfig后产生的一些临时文件,包括一些软件包的检索信息,删除后会重新加载package目录下的软件包。若不删除会导致一些新加入的软件包不显示。

rm -rf tmp

删除编译配置文件,在不删除的情况下如果取消选择某些组件它的依赖组件不会自动取消,所以对于需要调整组件的情况下建议删除。

rm -f .config

编译

调整 Open­Wrt 系统组件

make menuconfig

预下载编译所需的软件包

make download -j8 V=s

检查文件完整性,此命令可以列出下载不完整的文件(根据我多次编译的经验得出小于1k的文件属于下载不完整),如果存在这样的文件可以使用find dl -size -1024c -exec rm -f {} \;命令将它们删除,然后重新执行make download下载并反复检查,确认所有文件完整可大大提高编译成功率,避免浪费时间。

find dl -size -1024c -exec ls -l {} \;

开始编译,多线程编译失败后自动进入单线程编译,失败则输出详细日志。

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

ipv6配置

Extra Packages->ipv6helper 选中
Network->odhcp6c 选中
Network->odhcpd-ipv6only 选中

定制SSH登录欢迎界面

进入package/base-files/files/etc文件夹,编辑里面的banner文件(确定你已经lede文件夹里面了,如果没有进入lede文件夹则先进入lede文件夹)

vi package/base-files/files/etc/banner

2022042304140047.png

在去下面网站生成自己想要的

http://patorjk.com/software/taag/

屏幕截图 2023-04-24 095852.png

生成好了复制进去就可以,记得在编辑页面按I打开插入模式才能编辑文件

修改默认主题

进入lede文件夹,使用下面命令打开需要修改的文件

vi feeds/luci/collections/luci/Makefile

打开后大致如下

编译报错

大部分编译报错都是网络问题或者是组件版本过低、源码问题导致的,如果编译失败的。

网络问题

如果是网络问题的话只能自行解决了,我这里不能做过多的指导,比较懂得都懂

组件问题

如果是组件版本过低的话最简单的方法就是更新组件,看看那个组件报错就更新相关的组件,或者是直接跟新所有组件

官方组件仓库地址:https://github.com/openwrt/packages

分支仓库地址:https://github.com/openwrt/packages/branches/

可能不同的源码使用的仓库不同,但是更新方法一样,我这里使用官方的仓库的来做演示

全部手动更新

找到lede目录下的feeds目录,删除packages文件夹

rm -rf packages

克隆官方的packages目录下来

git clone https://github.com/openwrt/packages

部分更新

进入lede/feeds/packages/lang,需要更新那个则删除那个,例如我需要更新golang,则删除golang

rm -rf golang

然后下载最先版的golang放进去

首先安装svn,一般安装编译环境的时候都已经安装有了的,但是以防万一还是执行一下下面命令

sudo apt install -y subversion

然后再github上打开需要更新的组件的文件夹,复制目录下来,例如我需要更新golang,则复制它的网络路径下来

https://github.com/openwrt/packages/tree/master/lang/golang

然后把链接里面的tree/master替换成trunk,替换后的链接如下

https://github.com/openwrt/packages/trunk/lang/golang

替换好之后使用下面命令克隆组件到本地

svn checkout https://github.com/openwrt/packages/trunk/lang/golang

源码问题

如果源码损坏直接删除源码再次克隆源码编译

更新完成

更新完成后在lede目录下执行下面命令重新安装库,以防万一缺库导致编译失败

./scripts/feeds install libpcre

更多错误

如有更多错误可以到作者项目下面讨论,查找看看有没有相关的错误或解决方法

项目讨论地址:https://github.com/coolsnowwolf/lede/discussions

注意

本文是我自己的编译过程,只做参考,因为环境不同,所以不一定按照本文的编译方式就可以百分百成功编译,如有问题可以在文章下面留言,大家一起讨论


二维码

发表评论

已有 2 条评论

  1. 有一个warning怎么解决啊?
    ./scripts/feeds install -a
    WARNING: Makefile 'package/feeds/haibo/linkease/Makefile' has a dependency on 'ffmpeg-remux', which does not exist
    WARNING: Makefile 'package/feeds/haibo/luci-app-cpulimit/Makefile' has a dependency on 'cpulimit', which does not exist

    1. @sdjal

      重置源码,检查一下插件源,然后从新下载插件试试看