简介
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,点击【创建新的虚拟机】
选择【自定义(高级)】,点击【下一步】
保持默认,直接点击【下一步】
选择稍后安装操作系统,点击【下一步】
选择【Linux】和【Ubuntu 64 位】,点击【下一步】
虚拟机名称自定义,也可以保留原来的,位置可以自己选,也可以默认,选择好了之后点击【下一步】
处理器配置根据自己的情况来选择,只要不操作自己电脑处理的的线程就可以,我电脑是12线程的,我这里可以给10个线程给虚拟机,选择好之后点击【下一步】
内存也是根据自己实体机的情况来填写,我电脑是16G的内存,我给虚拟机分8G,分好之后点击【下一步】
网络配置可以使用默认也可以修改,我这里修改为【使用桥接网络】,因为需要魔法上网环。境,但是我没有软路由,我用了一个虚拟机来做旁路有,所以我的Ubuntu需要从路由器获取到IP才能魔法上网,选择好了之后点击【下一步】
I/O控制默认就行,点击【下一步】
磁盘类型默认即可,点击【下一步】
选择磁盘也是默认,点击【下一步】
磁盘容量根据自己电脑情况尽可能的填大一点,我虚拟机放在E盘,我E盘现在还有120G,我可以给虚拟机110G,剩下的默认然后点击【下一步】
指定磁盘文件默认即可,点击【下一步】
点击【完成】
点击【编辑虚拟机】
选择【CD/DVD】,选择【使用ISO映像文件】,点击【浏览】选择刚刚下载好的Ubuntu系统,选择好了之后点击【确定】
点击【开启虚拟机】
选择好语言,然后点击【安装Ubuntu】
键盘布局这个地方有可能显示不完整,点击不了【继续】按钮,这时候可以按【win+鼠标左键】拖动窗口然后点击【继续】按钮安装
可以保持默认,然后点击【继续】
可以保持默认,点击【现在安装】
不管弹出什么提示,直接点击【继续】
选择时区,我选择的是上海的,选择好之后点击【继续】
这里更具自己的喜好设置一个名称和密码即可,设置好时候点击【继续】
接下来等待安装完成即可
安装完成,点击【现在重启】
重启好了之后登录进去,按【ctrl+alt+t】打开终端
为了方便使用,先安装一个SSH
sudo apt install -y openssh-server
更新系统
sudo apt update
sudo apt upgrade -y
接下来就是配置魔法上网了,我是用的是旁路有来进行魔法上网,所以就是改一个IP的事,我这里不介绍怎么配置魔法上网环境,如果不会的可以留言
配置好了之后可以保存一个快照,万一玩坏了可以快速恢复,不用重装系统
安装编译环境
执行下面命令安装编译依赖,编译依赖的安装速度取决于你魔法上网的速度
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
打开后是这样的
按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”按回车保存退出
更新并安装feeds.conf.default中配置的源
./scripts/feeds update -a && ./scripts/feeds install -a
定制固件
make menuconfig
按方向键调整选项,按回车选中
前两个选项是处理器架构,我的软路由是X86-64的架构,所以我保持默认就可以了
选中【Target Images ---> 】这个选项,按回车进入
往下,找到【(16) Kernel partition size (in MiB) (NEW)】选项和【(400) Root filesystem partition size (in MiB) (NEW) 】选项,这个是分区大小,需要调整大一下,可以调整成256和125,我软路由空间大我就改成512和1024
改好之后按两次【esc】键退出当前页面,回到上一级页面
往下选,找到【LuCI】,按回车进入
进入【3. Applications ---> 】选择需要编译的插件,按【Y】是选中,按【N】是取消选中,按【M】是编译出IPK文件不安装到系统里面需要自己安装
如果看不懂这个插件名可以直接百度Openwrt插接对照表
选中自己需要的插件完成后按两次【esc】返回上一级,进入【4. Themes ---> 】进入主题选择,也是按【Y】选中
选中好自己需要安装的主题之后,直接退出自定义固件的界面,出现询问是否保持配置文件的界面是,选择【yes】
下载编译所需的软件包
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
以下这种情况就是编译成功了,只要没有报错则是编译成功
二次编译
更新
进入源码目录(如果不在此目录)
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
清除 OpenWrt 源码以外的文件(可选),除非是做开发,并打算 push 到 GitHub 这样的远程仓库,否则几乎用不到。此操作相当于make dirclean外加删除/dl、/feeds目录和.config文件。
make distclean
还原 OpenWrt 源码到初始状态(可选),如果把源码改坏了,或者长时间没有进行编译时使用。
git clean -xdf
清除临时文件,删除执行make menuconfig后产生的一些临时文件,包括一些软件包的检索信息,删除后会重新加载package目录下的软件包。若不删除会导致一些新加入的软件包不显示。
rm -rf tmp
删除编译配置文件,在不删除的情况下如果取消选择某些组件它的依赖组件不会自动取消,所以对于需要调整组件的情况下建议删除。
rm -f .config
编译
调整 OpenWrt 系统组件
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
在去下面网站生成自己想要的
http://patorjk.com/software/taag/
生成好了复制进去就可以,记得在编辑页面按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
注意
本文是我自己的编译过程,只做参考,因为环境不同,所以不一定按照本文的编译方式就可以百分百成功编译,如有问题可以在文章下面留言,大家一起讨论
有一个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
重置源码,检查一下插件源,然后从新下载插件试试看