编译属于自己的Openwrt固件
本文发布于 1126 天前,其中的部分信息可能已经失效或过时。

在我的R2S退役之后,我重新买了一个J4105的软路由,之前为了图省事就凑合用了Esir编译好的固件,最近乘着有空就尝试自己编译了一个固件,结果折腾了一个星期才成功,于是就有了这篇文章,给需要帮助的人,也当作一个记录。

其实Esir的固件并不是不能用,只是高大全版不需要的功能实在太多,精品小包又缺少功能,所以我才考虑自己编译。如果你并不是很在意这个问题或者不想折腾,还请直接下载他人编译好的固件。

这篇文章分为以下几个部分:

  1. 编译准备
  2. 配置编译参数
  3. 高级编译参数设置
  4. 开始编译
  5. 安装至软路由
  6. 二次编译
  7. 常见报错和解决方案
  • 编译准备

首先我们需要一个安装有 Ubuntu 20.04 LTS 的编译环境,在Windows电脑上你可以使用 WSL / WSL2 或者使用Hyper-V虚拟化来建立这样一个环境(我个人推荐 Hyper-V 虚拟机,不容易出现玄学问题),在准备完毕后你需要在Ubuntu系统内新建一个非Root账户,然后使用这个账户登陆系统,接下来所有的步骤都将使用这个账户进行。关于如何安装 WSL2 或者 Hyper-V 在这里不再赘述,如有问题请自行搜索解决。

经过测试,编译环境至少需要以下配置才能正常编译完成:

内存:6GB 或 4GB + 4GB SWAP (16线程编译) / 4GB 或 2GB + 4GB SWAP (8线程编译)
硬盘:至少 40GB 可用空间
网络:科学的上网环境(你懂我在说什么),至少 10Mbps 至海外连接速度

准备完成后使用 非Root账户 连接至服务器即可。

  • 配置编译参数

首先我们要安装必要的软件包和编译工具,依次运行以下命令:

sudo apt-get update

sudo apt-get install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch 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

//此处安装了所有必要的软件包,请不要随意删减

然后我们就可以下载源码了,下载完成后进入目录:

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

cd lede

接下来我们需要对软件包列表做一些调整,因为现在的LEDE固件不再默认包含科学上网插件了。打开目录下的 feeds.conf.default 文件,选择你常用的科学插件加到末尾即可,以下是一些常用的科学插件列表:

#Openclash
src-git Openclash https://github.com/vernesong/OpenClash

#Passwall
src-git PassWall https://github.com/xiaorouji/openwrt-passwall

#HelloWorld
src-git HelloWorld https://github.com/fw876/helloworld

另外Lede默认的软件列表不是很全,可以再加入这两个软件包源进行补充:

src-git freifunk https://github.com/freifunk/openwrt-packages.git
src-git kenzo https://github.com/kenzok8/openwrt-packages

添加完成后保存文件,然后下载并安装这些软件包,依次运行以下指令:

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

注意看下载和安装过程中有无报错,如果报下载失败请检查网络环境然后重新下载。下载完成后使用以下指令进入图形化配置页面(请注意图形化配置至少需要 1024*768 分辨率的界面,如果界面太小会报错)

make menuconfig

不出意外的话你会看到如下一个界面:

在这个图形化界面中,使用键盘的上下键控制光标,按Y键选中,按N键取消选中,按下Enter进入下一级目录,双击Esc键返回上一级菜单。

首先确定最上面的三项,分别是目标系统的架构和型号,如果你是编译给X86_64的CPU的话保持不变即可,如果你需要编译给 R2S/R4S 请在第一项中选择 Rockchip ,随后在第三项中选择具体的软路由型号,例如 FreindlyARM NanoPi R2S.

随后进入到Targe-Image目录中,在这里根据需要选择输出的镜像类型,推荐选择有 .img 和 .iso,然后把默认选中的VMDK格式取消勾选,接下来找到 Root Filesystem Partition Size 选项,按Enter键,然后将这个值改为大于 1024 的数,具体值请根据你需要安装的插件多少决定。完成后退出到主目录

接下来进入Extra packages 目录中,如果你没有使用 SMB 共享或者外挂硬盘的需要的话可以取消勾选 automount 和 autosamba 这两项,然后为了使用IPV6,需要勾选 ipv6helper 。完成后退回主目录

随后进入 Base Sytem 目录中,找到 dnsmasq-full 选项,在其下方的复选框中选择 Build With DHCPv6 Support 来启用IPV6,如果有需要还可以选上 DNSSEC 选项,完成后退回主目录,如下图所示:

接下来来到 Luci 目录下,这里是整个配置的重头戏,首先进入 Collections 目录下,在这里你可以选择是否要使用 Nginx 作为后台的网页服务器以及是否要编译 SSL 支持,注意即使你要使用Docker,也请不要勾选这里的 Docker 选项,配置完成后退回 Luci 目录

然后进入 Applications 目录下,这里你可以自由选择需要什么插件,以下是一些常用插件对应的名称和简介:

luci-app-accesscontrol:访问管理,用于禁止对于某个特定应用或网站的访问。

luci-app-adbybyplus:用于过滤广告,可能与 Openclash 冲突

luci-app-arpbind:用于IP地址和MAC的绑定

luci-app-ddns:用于自动更新域名解析到当前的IP地址

luci-app-diskman:用于管理和监控硬盘状态

luci-app-docker:适用于Openwrt的Docker软件包,包含管理后台

luci-app-filetransfer:用于在网页后台上传并安装IPK软件包

luci-app-jd-dailybonus:某东的自动签到脚本,如果你有其他方式运行自动签到的话可以不用

lcui-app-netdata:在网页后台以直观的方式监控软路由运行情况,推荐

luci-app-opencalsh:用于Openwrt的图形化小猫咪管理工具,你懂的

luci-app-openvpn-server:OpenVPN的服务端,如果你有需要从外面连回家里的内网的需求的话这个比较有用

luci-app-qos:Quality of Service,用于限制某一特定客户端的连接速度

luci-app-ramfree:一键释放空闲内存,适用于内存较小的机器

luci-app-serverchan:使用Server酱推送路由器运行状况和客户端的连接/断开等信息

luci-app-ttyd:在网页后台使用命令行,比较玄学,可能不能正常工作

luci-app-turboaac:一件管理各种网络加速组件,例如 BBR ,Shorcut-FE,Fullcone NAT 等

luci-app-unblockmusic:使用其他音源替换网易云中无法收听的音乐,可能与 Openclash 冲突

luci-app-upnp:通用即插即用模块以及后台管理界面,如果有下载磁力或其他需求的话建议勾选

luci-app-usb-printer:通过局域网共享家里的打印机

luci-app-wol:使用LAN接口唤醒其他设备或者被唤醒,适用于定时开关其他设备或使用了UPS电源的情况

luci-app-wrtbwmon:用于监控,记录和分析各个设备的网络流量、协议类型等

另外 Luci 目录下的 Themes 子目录里可以选择你喜欢的后台主题,例如我选择的是 Argon ,效果如下:

完成配置后退回到主目录即可。

到这里基础的编译配置就完成了,如果你有高级需求,例如需要其他软件包,更换内核版本,更换默认后台地址等,请阅读下面的高级配置说明

  • 高级编译参数设置
注意:以下的内容属于高级设置,如果你不明白下面这些选项是干什么的,请不要随意更改,否则容易导致编译失败

进入Network目录,在这里你可以配置大部分和网络有关的内容,例如在 Download Manage 子目录下可以选择 Aria2-NG 插件,也可以选择除Aria2外的其他 BT下载插件比如 Transmission 等 ;在 SSH 子目录下你可以找到 openssh 组件,给你提供完整的SSH支持。(请注意,如果你在 LuCI-Application 目录下配置时选择了 luci-app-dropbear 插件,那么再安装 Openssh 将造成冲突,导致无法连接 SSH),再往下拉你可以找到包括 iperf / iperf3 等网络测试工具,以及 Adguardhome 等DNS相关的组件。完成配置后请退回主目录

在 Utilities 目录下,你可以配置一些用于开发环境的工具,例如在 Compression 子目录下你可以找到 unzip / bzip2 等压缩和解压缩工具,在 Database 子目录下有 SQLite / mariadb 等数据库软件 ;Editers 子目录下有包括VIm在内的各种命令行编辑工具;甚至在 Virtuliazation 子目录下你可以选择 QEUM 等虚拟化环境,请根据自己的需要选择配置。

自此图形化配置的部分就结束了,双击Esc退出配置界面,它会提示你是否保存更改,选择YES并按Enter键。接下来我们需要直接改动文件进行配置。

如果你要修改后台的默认IP地址(其实就是Lan口的默认网段),请打开并编辑 package/base-files/files/bin 目录下的 config_generate 文件,然后找到大约第150行的位置,对以下代码进行修改:

//原来是这样的

case "$1" in
	lan) ipad=${ipaddr:-"192.168.1.1"} ;;
	*) ipad=${ipaddr:-"192.168.$((addr_offset++)).1"} ;;
esac

//如果你要把默认地址改成 192.168.5.1

case "$1" in
	lan) ipad=${ipaddr:-"192.168.5.1"} ;;
	*) ipad=${ipaddr:-"192.168.$((addr_offset++)).1"} ;;
esac

关于内核版本,虽然Lede使用的是 5.4 版的内核,但其实LEDE的源码里已经包含了 Kernel-5.10 的配置文件了,我们只需要将它启用即可,你需要修改以下文件:

2022.2.18更新:目前 LEDE 固件似乎已经默认使用 5.10 内核,故无需再做更改,直接编译即可。当然如果你因为网卡驱动等各种原因必须要使用 5.4 内核,下方内容我仍然保留,只需要照着反过来改回去即可。

找到 include 目录下的 kernel-version.mk 文件,进行以下修改

//原来的配置

LINUX_VERSION-5.4 = .155
LINUX_VERSION-5.10 = .75

//改成这样
LINUX_VERSION-5.10 = .75
LINUX_VERSION-5.10 = .75

然后找到 target/linux 目录,里面有很多文件夹,选择你之前设定的目标设备的构架的那个文件夹(例如我是x86,那么就进入 x86 文件夹,同理如果是 Rockchip 就进入rockchip文件夹),找到并打开 Makefile 文件,进行以下修改:

//原来的配置

KERNEL_PATCHVER:=5.4
KERNEL_TESTING_PATCHVER:=5.10

//改成这样

KERNEL_PATCHVER:=5.10
KERNEL_TESTING_PATCHVER:=5.10

最后找到根目录下的 .config 文件,在里面找到这样一行配置(通常在第60行)并修改:

//原来的配置

CONFIG_LINUX_5_4=y

//改成这样

CONFIG_LINUX_5_10=y

完成后重新进入并退出一次 make menuconfig ,注意这次不需要做任何修改,进入界面后直接双击Esc退出,它会提示你是否保存修改,选择YES即可。然后再次检查上面三个文件,看看之前做的更改是否还在,如果还在就是正常的。

至你就完成了内核版本的更换,可以开始编译了。

  • 开始编译

完成配置后就可以开始编译了,首先需要下载必须的文件,运行以下命令,下载过程中请保持网络稳定并注意输出的信息里是否有报错,如果有需要重新运行一次直到没有报错为止。

make -j8 download V=s

// -j8 中的"8"请替换成你的CPU核心数

下载完成后开始编译,网上很多教程推荐第一次编译使用单线程,但我个人使用多线程也没有遇到问题,如果你首次编译使用多线程遇到了问题请使用单线程重新编译,如果还有问题请查看后面的错误排除板块。

make -j8 V=s

//-j8 中的"8"请替换成你的CPU核心数
//若要使用单线程改为 -j1 即可

编译通常需要20到40分钟,单线程则需要3-4小时,完成后镜像文件保存在 bin/targets/你选择的CPU/你选择的构架/你选择的型号 这个目录下,文件名的格式是这样:

//这是 IMG 文件的文件名格式
openwrt-CPU-构架-型号-squashfs-combined-efi.img

//这是 ISO 文件的文件名格式
openwrt-CPU-构架-型号-image-efi.iso
  • 安装至软路由

编译好的镜像使用正常方式安装到软路由上即可,R2S/R4S可以直接把固件烧录到SD卡上,X86软路由可以借助PE系统使用 Physicdiskwrite 程序写入硬盘,需要注意的是在某些情况下 Physicdiskwrite 可能无法正确识别固件的大小,但不影响正常使用

安装完成后进入后台,如果你没有更改过后台IP的话,默认地址是 192.168.1.1 ,后台密码是 password ,默认的LAN口是 eth0 ,WAN口为 eth1,成功进入后台后即可正常使用

  • 二次编译

在第一次编译之后如果你想再次编译固件,则需要清除之前的编译文件并拉取最新的代码,然后再次编译即可:

//清除之前的编译缓存
make clean

//拉取最新代码
git pull

//编译
make -j8 V=s
  • 错误排除
定位报错的原因需要找到输出的编译日志中最开始报错的地方,把它翻译成中文看看是什么错误,下面是一些我在编译时遇到过的错误

1、使用 WSL / WSL2 编译时报错

一般是因为 WSL 中没有禁用 Windows 的环境变量,禁用的方法为编辑 /etc 目录下的 wsl.conf 文件,加入以下内容:

[interop]
appendWindowsPath = false

[automount]
enabled = false

然后重启 WSL 系统后再试。如果还是不行请换用 Hyper-V 虚拟机(同样Windows10自带)重试

2、提示组件冲突

通常是因为你选择了重复的组件,例如在防火墙组件时同时选择了 dnsmasq-full 和包含 dnsmasq 的其他插件,类似的情况还会出现在手动选择了其实默认配置里已经包含的网卡驱动,或者在 luci-app 目录里选择了的插件又在其他目录里选择了一遍。查看一下报错信息出现时正在编译的内容是什么,然后在 menuconfig 里去掉这个内容即可。

3、提示 bash:po2lmo: command not found

在第一次编译的时候容易出现,解决方法是手动使用单线程编译 luci-base ,然后再继续编译(这个问题的出现比较玄学,大概率是编译顺序的原因)

make package/feeds/luci/luci-base/compile -j1 V=99

4、第一次编译时通过,但再次编译时报错

如果你运行过了 make clean 命令还这样那么可以尝试使用更彻底的 make dirclean 命令(请注意:运行这个命令会删除大部分编译缓存,导致编译时间变长),还是报错则考虑运行 make dirclean 后使用单线程重新编译,如果还是不行请删除所有文件,重新拉取代码,重新完整编译。

限于我的水平,这篇文章可能有表达不当或者技术问题,如果你有疑问,欢迎在评论区提出

现在你已经编译安装好了属于自己的软路由固件,可以愉快的使用了,Enjoy it~~

若没有特殊说明,这篇文章 《编译属于自己的Openwrt固件》最先发表在NanNan's Blog。本文采用BY-CC-SA 4.0协议授权,禁止未经授权用于商业用途,如需非商业转载,请注明本文链接 https://blog.nannan.cool/archives/121/

评论

  1. K
    Macintosh Edge
    2年前
    2022-8-09 14:50:57

    歪瑞古德, 回去试试👍

  2. R
    Linux Firefox
    2年前
    2023-3-13 18:02:14

    ipv6是不是和ssr冲突?

    • 博主
      R
      Windows Chrome
      2年前
      2023-4-13 4:17:41

      你好,IPV6 和 SSR 是不冲突的,之所以你会觉得冲突,可能是因为 SSR 或代理服务器没能正确的处理 IPV6 流量,导致浏览网页时优先使用 IPV6 连接的浏览器会在某些情况下出现部分或完全无法加载的情况。因此我建议如果你需要使用代理工具,可以在 DHCP 中禁用 IPV6 地址分配或在 dnsmasq 里禁用 IPV6 地址解析。

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇