Openwrt x86编译
此文档用作记录编译时的笔记,仅供参考
准备环境
编译这个本身就需要一定基础知识,此文档就是笔记 很多地方说的比较简略。
- 系统ubuntu-20.04 x64
推荐准备100GB的磁盘空间
我的openwrt工作空间占用了50GB
- Git
- 全局科学上网
Ubuntu客户端可以使用v2rayA[1]
初始化
下载更新依赖及工具等
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
拉取源码
这里使用lean源码 因为包含较多新功能 当然你也可以用其他源.以下教程在openwrt官方源码下也测试通过。
lean包含功能多但是因为提交的人多有些时候提交的代码会导致构建失败,亲测lean源码构建不太稳定,所以有些时候可以适当使用lean历史版本代码或者更换openwrt官方源
#克隆lean的源码
git clone https://github.com/coolsnowwolf/lede
#备份原始源码,避免以后改错了有地方恢复或者参照 这一步自行选择做不做。
cp -aR lede lede-bak
cd lede
feeds
feed可以理解为软件源[2]
#备份feeds文件,添加自定义第三方软件源,此源基本包含了常用的所有软件包。
cp feeds.conf.default feeds.conf.default.bak
echo "src-git smpackage https://github.com/kenzok78/small-package" >> feeds.conf.default
#根据feed.conf更新软件源并安装。
./scripts/feeds update -a
./scripts/feeds install -a
更新是拉取源码到./feeds/目录中,安装则是将拉取的源码做软连接到./package/feeds中。
#常用的feed命令,feed.conf中注释的行就是不生效的。
#列出软件包
./scripts/feeds list
#安装软件包通过feed.conf,如果该文件中没有生效的不会安装。 -a是安装所有feed,-p -a则是安装指定feed内的所有软件
./scripts/feeds install -a
#搜索软件包在哪些feed中提供了,如果同时提供优先使用第一个,这一点可以在~/openwrt/package目录中验证。其中xray是软件包的名称
./scripts/feeds search xray
#卸载软件包,-a则是卸载所有
./scripts/feeds uninstall -a
#更新软件包通过feed.conf,如果该文件中没有生效的不会更新。
./scripts/feeds update -a
列出几个源
kenzok8/openwrt-packages: openwrt常用软件包
比较全面的算是一个整合源
ssr ray及依赖
xiaorouji/openwrt-passwall: A commonly used proxy toolchain for Openwrt LuCI Application.
lede的lean源
配置
打开一个可视化的配置,第一次编译推荐只选择非常基础的选项(如下前三个选项 目标设备架构),多的都不要选择 新手乱选很容易导致编译报错而且不太好定位因为不止一个报错 可以说如果你要一步到位的 解决报错解决一天都解决不完。
make menuconfig
make kernel_menuconfig
内核配置,详细参考[3]
通常不需要这么做,如果您需要特定(非标准)驱动程序等,则需要“内核模块”选项 - 这通0
常是 USB 模块或特定网络接口驱动程序等。
menuConfig
各菜单解释,以下都是个人论点 技术不到位不一定准确,只列出了部分 其他没列出的自行斟酌配置或者选择help查看帮助。新手第一次编译不推荐选择其他选项,先编译通过一次后再回来二次定义编译。
可视化配置没有没有那么完善,不要乱选 需要什么勾选什么,而且也不要选择重复 不然编译的时候会报错!比如你需要dhcpv6在dns full已经提供了,就不需要再次勾选dhcpv6了。
使用y选择,n取消选择,m只选择编译模块并不编译到固件中
其他选项解释会不定期更新新增说明。
Target System
目标系统架构,本文只讲软路由x86,硬路由自行参照其他文章。
Subtarget
子目标,如果是常规的x86 64位CPU就选第一个,一般都是第一个。某些古老一点的工控机使用的32位的CPU 这里就要选第三个了。可以前往英特尔官网核对相关规格[4]
Target Images
只说几个常用的:
- Build GRUB images (Linux x86 or x86_64 host only)
- Build GRUB EFI images (Linux x86 or x86_64 host only)
这俩个是GRUB的引导方式,第一个是传统的,第二个是UEFI。这个是生成的镜像,俩个都勾选就每种类型镜像都生成一个。
*** Image Options ***
-
Kernel partition size (in MB)
-
Root filesystem partition size (in MB)
内核及根分区的预设大小,内核保持默认就好,根分区根据需要更改 生成镜像的时候会根据你设定的分区大小预先填充空文件。
Base System
系统配置
- dnsmasq-full dns相关支持,注意勾选DHCPv6以支持ipv6相关配置,勾选了dhcpv6就不要勾选上面dnsmasq-dhcpv6了
Firmware
在Firmware和Kernel modules > Network Devices中配置相关驱动
如下选中项是BCM57810S网卡的驱动,详细配置参照BCM57810S
Kernel modules
Network Support
这俩可以配置系统支持某些网络,比如L2TP ipsec,这里配置支持只是系统有这个相关模块,你想在web上可视化的使用还得有对应Luci app才行。
- kmod-tcp-bbr 一个TCP的优化模块
其他介绍
简单概括说一下大类,一般默认即可,多媒体 虚拟化 无线网络相关的根据需求选择。
- Input modules —> 输入设备支持,比如键鼠手柄等
- LED modules —> 灯光相关设置
- Libraries —> 库支持
- Native Language Support —> 编码语言支持,默认即可
- Network Devices —> 网络设备驱动
- Network Support —> 网络功能相关
- Sound Support —> 音频相关支持
- USB Support —> USB相关设备支持
- Video Support —> 视频支持,一般不是all in one 多媒体都不需要选。
- Virtualization —> 虚拟化相关,不搞一机多用不需要选
- WPAN 802.15.4 Support —> 以下俩项都是无线网络相关支持,一般无线网络由AP AC管控。
- Wireless Drivers —>
LuCI
Applications
luci的应用相关,这部分就是经常在web上使用的应用相关了.下面的所有app都是根据自己需要安装,这里还是推荐选最少的,后期单独编译ipk再安装到路由器上,确定没问题了 再可以在编译的时候选择编译进固件。
这里不过多介绍 很多插件我用的也不熟 就介绍几个我常用的.
- luci-app-adbyby-plus
屏蔽广告的 - luci-app-ddns
动态域名相关,已经带了很多服务商支持。dnspod就是腾讯云的域名。
- luci-app-frpc
- luci-app-frps
内网穿透的客户端和服务端,这俩我编译的时候一直报错 就没选了。 - luci-app-jd-dailybonus
京东自动签到 - luci-app-netdata.
一个性能监视器 - luci-app-nft-qos
qos流控 - luci-app-passwall…Configuration —>
- luci-app-ssr-plus
- luci-app-openclash
只可意会不可言传的东西~ - luci-app-pptp-server
PPTP VPN - luci-app-serverchan
消息推送 - luci-app-smartdns
提高DNS解析速度的 - luci-app-turboacc
网络加速的,包含dns tcp se加速,对于性能不强的软路由还是挺有用的 - luci-app-unblockmusic
解锁网易云音乐限制 - luci-app-upnp
自动分配转发 - luci-app-vlmcsd
kms服务器可以自动激活局域网的微软相关产品
Themes
主题相关设置没什么好说的,需要什么选什么,酌情全选因为部分主题和你当前的luci不兼容。默认主题是bootstrap
。如果因为主题导致使用时网页进不去参照排错篇里的主题相关
Protocols
- luci-proto-ipv6 配置IPV6支持
IPv6所需的包。[5] odhcp6c odhcpd ip6tables luci-proto-ipv6 luci
Network
- 6to4
- dhcpcd… DHCPv4/IPv4LL/IPv6RS/DHCPv6 quad stack client
- ethtool-full… Display or change ethernet card settings (full)
这个推荐选上,有很多网卡实用工具,和上面的ethtool二选一 不要都选
- iftop 网卡流量监控工具
- iperf 网络性能测试
- netcat TCP/IP实用工具,可以用来扫描端口和简单通讯
- tcpdump 抓包工具
- odhcp6c
- odhcpd DHCP服务
Firewall
- ip6tables ipv6支持相关
Utilities
最后一项,系统工具(命令)相关。根据自己的使用习惯自行选配
- lrzsz 通过ZModem传输文件
- lscpu 列出CPU
- lsof 进程查询实用工具
- tar 归档包文件工具
- tree 以树状线上目录结构
- which 搜索环境变量
编译
预下载:
预下载需要的依赖,-j8是指使用8个线程处理
make download -j8 V=s
为防止网络原因造成文件下载出错,使用以下命令查询空文件
find dl -size -1024c -exec ls -l {} \;
如果有空文件使用find dl -size -1024c -exec rm -f {} \;
删除后重新下载[6]
make download -j8 V=s
编译
参考[7]
#使用8线程编译,并将日志重定向到build.log文件中,前台只会显示error关键词的信息。
make -j8 V=sc 2>&1 | tee build.log | grep -i error
#新打开一个终端,切换到工作目录 监听标准输出内容
tail -100f build.log
编译过程非常长久,如果编译失败了,推荐推荐使用-j1 一线程或者-j2俩个线程编译,方便查找错误, 成功编译过一次后就快很多了~
排错
一个系统是非常复杂的,所以编译的时候很可能会遇到千奇百怪的错误我这里不可能一一列举,我的技术不精 也不能全部解决 。这里就说一下大致会遇到的问题及解决思路:
重复构建
有些功能在其他插件里已经有了就不要再次选择。如果不记得哪些重复的,可以根据报错信息找到该功能,然后在.config文件中或者make menuconfig
手动删除。
如下就是构建dnsmasq-full时出错,因为和dnsmasq冲突了
网络原因
大部分编译失败的原因都是网络原因,这里推荐使用全局科学上网,比如在路由器层面全局代理 或者安装客户端全局代理。不推荐设置–proxy代理客户端这种方法,很多程序不会走这个代理的,比如wget有自己的配置文件要单独写proxy git也有自己的 go也有 你不可能一一设置 总会出问题。
文件权限
推荐克隆的时候就使用普通用户 这样克隆下来的源码目录权限就非常正常,如果你开始是root 有些东西不让你用root编译 你又切换普通用户然后给予权限很容易把权限搞乱。
failed to allocate 354 blocks, out of space?
空间不够可能是你编译机磁盘满了,df -h可以看下。或者是你编译时,目标镜像设置的根分区大小,推荐不要小于128MB。
error: ext4_allocate_best_fit_partial: failed to allocate 354 blocks, out of space?
Creating filesystem with parameters:
Size: 67108864
Block size: 4096
Blocks per group: 32768
Inodes per group: 4096
Inode size: 256
Journal blocks: 0
Label: rootfs
Blocks: 16384
Block groups: 1
Reserved blocks: 0
Reserved block group size: 7
make[5]: *** [/home/make/lede/include/image.mk:336:
GO相关
大部分go的相关设置都在go的环境变量中,输入./go env查看当前环境变量,但是注意在编译的时候会通过mk文件重设编译时的环境变量。系统默认的环境变量在GOENV
中,默认是GOENV=“~/.config/go/env”
-
网络原因,推荐使用v2raya直接全局代理,不要使用设置proxy变量进行代理
环境变量为:GOPROXY
可以直接在终端输入`export GOPROXY=""设空 -
golang相关mk编译规则路径在~/openwrt/feeds/packages/lang/golang/*.mk
缓存
- GOMODCACHE
在环境变量GOMODCACHE中存放着编译go应用时下载的模块缓存,可以在合适的时候清楚一下试试再编译
#清楚命令/或者直接删除该目录也可以
go clean -modcache
#openwrt
GOMODCACHE="/home/make/go/pkg/mod"
#系统默认路径:
GOMODCACHE="/home/make/openwrt/dl/go-mod-cache"
- GOCACHE
环境变量GOCACHE中有构建缓存 清楚命令
#清楚命令/或者直接删除该目录也可以
go clean -cache
#路径,系统默认:
GOCACHE="/home/make/.cache/go-build"
#openwrt环境变量
GOCACHE="/home/make/openwrt/tmp/go-build"
themes主题
此处的主题排错是指在编译成功后运行时出现的问题,如果在终端内正常开机但是web控制台无法打开提示类似Error Unhandled exception during request dispatching
的错误,很有可能是主题的问题。可以修改当前luci使用的主题为默认主题bootstrap
,第三方主题有可能没有适配新版luci相关的更改。我提供的固件手动适配了argonne主题的,其他主题我不经常用就没适配。
#编辑luci文件
vim /etc/config/luci
#找到以下片段修改默认主题
config core 'main'
option lang 'auto'
option mediaurlbase '/luci-static/bootstrap' //这里就是当前使用的主题,修改为bootstrap
option resourcebase '/luci-static/resources'
option ubuspath '/ubus/'
#以下片段是编译的时候安装定义的主题,名称就是/luci-static/argonne里的argonne
config internal 'themes'
option Argonne '/luci-static/argonne'
option ATMaterial '/luci-static/atmaterial'
option ATMaterial_red '/luci-static/atmaterial_red'
option ATMaterial_Brown '/luci-static/atmaterial_Brown'
option Bootstrap '/luci-static/bootstrap'
option BootstrapDark '/luci-static/bootstrap-dark'
option BootstrapLight '/luci-static/bootstrap-light'
#重启web服务
/etc/init.d/uhttpd restart
如果不想要让这些主题在编译的时候设置为默认主题可以修改软件包源码中的文件:
#切换到软件包路径查找当前安装的主题。
cd ~/openwrt/package
find ./ -name luci-theme-*
#编辑源码内的uci-defaults文件,注释set_opt main.mediaurlbase即可
cd ~/openwrt/package/feeds/luci/luci-theme-bootstrap
vim root/etc/uci-defaults/30_luci-theme-bootstrap
set_opt themes.Bootstrap /luci-static/bootstrap
#if [ "$PKG_UPGRADE" != 1 ] && [ $changed = 1 ]; then
#set_opt main.mediaurlbase /luci-static/bootstrap //注释这行即可
#fi
set_opt themes.BootstrapDark /luci-static/bootstrap-dark
set_opt themes.BootstrapLight /luci-static/bootstrap-light
2023年6月12日对于openwrt官方源码下的主题适配情况如下:
兼容:
bootstrap默认
argonne手动适配了
material
openwrt.org
openwrt2020
argone
不兼容:
atmaterial
design
ifit
edge
opentopd
tomato
安装
不过多讲解,将编译的产物(一般为openwrt-x86-64-generic-squashfs-combined.img.gz
文件)取出(/bin/targets/架构
)。解压获得openwrt-x86-64-generic-squashfs-combined.img
文件,此文件比较大是因为里面有根分区预先填充的空文件。
移动磁盘
如果预计启动设备是优盘或者其他移动设备使用Win32DiskImager
刻录该镜像至设备。
硬盘
如果预计启动设备是磁盘 可以使用IMG写盘工具
刻录
虚拟机
方法1: 编译配置中,目标镜像-勾选编译vmdk,新建虚拟机,使用现有磁盘 选择编译的openwrt-x86-64-generic-squashfs-combined.vmdk
文件即可。
方法2: 可以先找个PE的镜像,然后使用软碟通打开此镜像,把IMG镜像和写盘工具放到PE镜像中,然后使用被修改后的PE镜像启动虚拟机,在启动PE后,打开写盘工具把固件写到虚拟磁盘内。
后续
定制文件
/home/make/lede/staging_dir/target-x86_64_musl/root-x86/etc
假如说您需要一个使用预配置文件/etc/config/firewall
来构建固件,那么把您的firewall配置文件文件放到下面的路径:
<buildroot dir>/files/etc/config
IPK
一个下载IPK的地方
https://op.dllkids.xyz/packages/x86_64/
二次编译
#更新系统软件
sudo apt-get update
#清理工作空间
make clean
#清理工作空间这一步注意一下feed和golang应用的缓存,详情见上述相关标题项。
#更新源码
git pull #注意同步代码后检查一下内核版本是否你需要的版本
#更新feed等
./scripts/feeds update -a
./scripts/feeds install -a
其中清理空间如下有三种级别:[8]简单来说,短期内更新用第一种;长期没更新,或者更换大的架构了推荐第二种;如果是为了提交代码或者把源码改坏了,想回到同步源码最初的样子可以使用第三种。
make clean
删除 bin 和 build_dir 目录的内容。
make dirclean
删除 /bin 和 /build_dir 目录以及 /staging_dir 和 /toolchain (=交叉编译工具)的内容。 ‘Dirclean’ 是您的基本“完全清洁”操作。
make distclean
核对您编译或配置的所有内容,并删除所有下载的提要内容和包源。
注意:除此之外,这将删除您的构建配置 (.config)、您的工具链和所有其他来源。小心使用!
OpenWrt 构建系统中还有许多其他功能,但以上内容应该涵盖了一些基础知识。
自动编译
自动编译Openwrt官方源
https://github.com/kenzok78/Bulid_Wrt
自动编译其他4大主流源
https://github.com/kenzok78/Build-OpenWrt
内核版本
修改编译使用的内核版本
查找目前编译的内核版本,如果需要更改的可以直接编辑下面这个文件
grep KERNEL target/linux/x86/Makefile
KERNEL_PATCHVER:=5.15
KERNEL_TESTING_PATCHVER:=5.15
KERNELNAME:=bzImage
#此处使用的内核是5.15
#以下文件说明了使用了内核具体的哪个版本及hash
~/openwrt/include/kernel-5.x
BCM57810S
大部分采用BCM5710S芯片组的都可以修改2.5g速率,参考[9]可以看到测试通过的网卡型号。本人测试过hp 530flr和10Gtek俩个型号的网卡没有问题。
修改网卡闪存中配置信息
- 使用rufus制作dos系统盘
参考[10]
rufus工具下载:https://github.com/pbatard/rufus/releases/download/v4.1/rufus-4.1.exe
设备选择你的U盘,文件系统选择FAT32,引导系统选择Freedos。确认没有问题后点击开始。
- 复制博通诊断工具
B57BCMCD工具下载链接:
https://mega.nz/file/rrJyFaxB#yqW-FTDNuTb2-2Ewm7nuafab8lbzDrE-G7-zUeksUV8
https://mega.nz/file/fuRQyAZJ#0sGH8szJovJIiPcjkM3gkTUpfPthE2dJ2G0shWxY9kQ
https://mega.nz/file/b2YWHahJ#R8J-sEzQ5wm9EMxlyu4AULj5JqadlnJsc0zkfeIu57U
将文件/dos/Diag/NX2_Ev/ ediag.exe 所在的所有内容复制到可启动 USB 上,包括 ediag.exe 本身
- 启动dos系统,按照以下操作修改配置。
#中文注释不要一起复制运行,不要盲目执行这些操作,根据情况自行选择。
#使用以下命令在工程模式下执行 eDiag
ediag.exe -b10eng
#选择设备1
device 1
#运行配置文件管理程序
nvm cfg
#运行固件配置
7
#掩码值 35/36=70 表示 1G、2.5G 和 10G
35=70
36=70
#56/59=6默认链接速度为2.5G而不是10G
56=6
59=6
#保存
save
#退出
exit
修改驱动使之适配2.5g
爱快默认带这个驱动。
2022年1月23日后的lede源码已经包含了此设备的2.5Gb驱动补丁[11],所以不需要再手动添加。如果没有可以通过以下办法手动添加该补丁。
以下驱动文件理论是所有Linux系统均可使用,Windows不受支持。
https://file.ahaly.cc:99/openwrt/993-bnx2x_warpcore_8727_2_5g_sgmii_txfault-510.patch
https://file.ahaly.cc:99/openwrt/993-bnx2x_warpcore_8727_2_5g_sgmii_txfault-515.patch
#路径5.10还是5.15根据你编译的内核自己选择,更改内核版本看上面文章
cd openwrt/target/linux/x86/patches-5.15/
#下载补丁文件
wget https://file.ahaly.cc:99/600-bnx2x-warpcore-8727-2g5.patch
#重新更新
./scripts/feeds update -a
./scripts/feeds install -a
#手动在.config添加以下俩项
CONFIG_PACKAGE_bnx2x-firmware=y
CONFIG_PACKAGE_kmod-bnx2x=y
#或者执行make menuconfig选择bnx2x驱动 如下操作
make menuconfig
勾选bnx2x
注意上方路径:> Kernel modules > Network Devices
作者
原文链接,如果遇到超链接或者图片附件等失效的情况下访问原文链接,转载注明出处:
https://ahaly.cc:86/archives/openwrt-make
Openwrt编译 - good good study,day day up~
下载
如果觉得编译麻烦,可以直接下载我编译好的。同源码系列的均可直接在luci界面选择保留配置升级。
- openwrt
23-06-19-openwrt-x86-64-generic-squashfs-combined.img.gz - Share
22-11-23-openwrt-x86-64-generic-squashfs-combined.img.gz - Share
- lede-lean
22-04-21-openwrt-x86-64-generic-squashfs-combined.img - Share
21-12-29-23openwrt-x86-64-generic-squashfs-combined-efi.img.gz - Share
参考资料
coolsnowwolf/lede: Lean’s OpenWrt source
kenzok78/small-package: 自动同步更新上游库软件
openwrt学习:make menuconfig的一些笔记_李迟的专栏-CSDN博客_make menuconfig openwrt