Openwrtx86编译

此文档用作记录编译时的笔记,仅供参考

准备环境

编译这个本身就需要一定基础知识,此文档就是笔记 很多地方说的比较简略。

系统ubuntu-20.04 x64

至少准备100GB的磁盘空间

Git

全局科学上网

Ubuntu客户端可以使用v2rayA[1]

初始化

下载更新依赖及工具等

sudo apt-get updatesudo 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源码 因为包含较多新功能 当然你也可以用其他源.

lean包含功能多但是因为提交的人多有些时候提交的代码会导致构建失败,亲测lean源码构建不太稳定,所以有些时候可以适当使用lean历史版本代码或者更换openwrt官方源

#克隆lean的源码git clone #备份原始源码,避免以后改错了有地方恢复或者参照 这一步自行选择做不做。cp -aR lede lede-bakcd l#备份feeds文件,添加自定义第三方软件源,此源基本包含了常用的所有软件包。cp feeds.conf.default feeds.conf.default.bakecho "src-git smpackage " >> feeds.conf.default#根据feed.conf拉取软件源码./scripts/feeds update -a./scripts/feeds install -a

配置

打开一个可视化的配置,第一次编译推荐只选择非常基础的选项(如下前三个选项 目标设备架构),多的都不要选择 新手乱选很容易导致编译报错而且不太好定位因为不止一个报错 可以说如果你要一步到位的 解决报错解决一天都解决不完。

make menuconfig

image-

make kernel_menuconfig

内核配置,详细参考^3

通常不需要这么做,如果您需要特定(非标准)驱动程序等,则需要“内核模块”选项 - 这通0

常是 USB 模块或特定网络接口驱动程序等。

menuConfig

各菜单解释,以下都是个人论点 技术不到位不一定准确,只列出了部分 其他没列出的自行斟酌配置或者选择help查看帮助。新手第一次编译不推荐选择其他选项,先编译通过一次后再回来二次定义编译。

可视化配置没有没有那么完善,不要乱选  需要什么勾选什么,而且也不要选择重复 不然编译的时候会报错!比如你需要dhcpv6在dns full已经提供了,就不需要再次勾选dhcpv6了。

使用y选择,n取消选择,m只选择编译模块并不编译到固件中

其他选项解释会不定期更新新增说明。

Target System

目标系统架构,本文只讲软路由x86,硬路由自行参照其他文章。

image-

Subtarget

子目标,如果是常规的x86 64位CPU就选第一个,一般都是第一个。某些古老一点的工控机使用的32位的CPU 这里就要选第三个了。可以前往英特尔官网核对相关规格[6]

image-

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)

内核及根分区的预设大小,内核保持默认就好,根分区根据需要更改 生成镜像的时候会根据你设定的分区大小预先填充空文件。

image-

Base System

系统配置

dnsmasq-full  dns相关支持,注意勾选DHCPv6以支持ipv6相关配置,勾选了dhcpv6就不要勾选上面dnsmasq-dhcpv6了

image-

Firmware

在Firmware和Kernel modules > Network Devices中配置相关驱动

如下选中项是BCM57810S网卡的驱动,详细配置参照BCM57810S

image-

Kernel modules

Network Support

这俩可以配置系统支持某些网络,比如L2TP ipsec,这里配置支持只是系统有这个相关模块,你想在web上可视化的使用还得有对应Luci app才行。

kmod-tcp-bbr  一个TCP的优化模块

image-

其他介绍

简单概括说一下大类,一般默认即可,多媒体 虚拟化 无线网络相关的根据需求选择。

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  --->        

image-

LuCI

Applications

luci的应用相关,这部分就是经常在web上使用的应用相关了.下面的所有app都是根据自己需要安装,这里还是推荐选最少的,后期单独编译ipk再安装到路由器上,确定没问题了 再可以在编译的时候选择编译进固件。

这里不过多介绍 很多插件我用的也不熟 就介绍几个我常用的.

luci-app-adbyby-plus屏蔽广告的

luci-app-ddns    动态域名相关,已经带了很多服务商支持

image-

luci-app-frpc

luci-app-frps内网穿透的客户端和服务端,这俩我编译的时候一直报错 就没选了。

luci-app-jd-dailybonus京东自动签到

luci-app-netdata.一个性能监视器

luci-app-nft-qosqos流控

luci-app-passwall…Configuration  --->

luci-app-ssr-plus

luci-app-openclash只可意会不可言传的东西~

luci-app-pptp-serverPPTP VPN

luci-app-serverchan消息推送

luci-app-smartdns提高DNS解析速度的

luci-app-turboacc网络加速的,包含dns tcp se加速,对于性能不强的软路由还是挺有用的

luci-app-unblockmusic解锁网易云音乐限制

luci-app-upnp自动分配转发

luci-app-vlmcsdkms服务器可以自动激活局域网的微软相关产品

image-

Themes

主题相关设置没什么好说的

image-

Protocols

luci-proto-ipv6  配置IPV6支持

IPv6所需的包。[7] 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

odhcpdDHCP服务

image-

Firewall

ip6tables  ipv6支持相关

Utilities

最后一项,系统工具(命令)相关。根据自己的使用习惯自行选配

lrzsz        通过ZModem传输文件

lscpu        列出CPU

lsof        进程查询实用工具

tar        归档包文件工具

tree        以树状线上目录结构

which        搜索环境变量

image-

编译

预下载:

预下载需要的依赖,-j8是指使用8个线程处理make download -j8 V=s

为防止网络原因造成文件下载出错,使用以下命令查询空文件 find dl -size -1024c -exec ls -l {} \;

如果有空文件使用find dl -size -1024c -exec rm -f {} \;删除后重新下载[4]

make download -j8 V=s

编译

参考^5

#使用8线程编译,并将日志重定向到build.log文件中,前台只会显示error关键词的信息。make -j8 V=sc 2>&1 | tee build.log | grep -i error#新打开一个终端,切换到工作目录 监听标准输出内容tail -100f build.log

编译过程非常长久,第一次编译推荐使用-j1 一线程编译,方便查找错误,成功编译过一次后就快很多了~

排错

一个系统是非常复杂的,所以编译的时候很可能会遇到千奇百怪的错误我这里不可能一一列举,我的技术不精 也不能全部解决 。这里就说一下大致会遇到的问题及解决思路:

重复构建,有些功能在其他插件里已经有了就不要再次选择。如果不记得哪些重复的,可以根据报错信息找到该功能,然后在.config文件中或者make menuconfig手动删除。

如下就是构建dnsmasq-full时出错,因为和dnsmasq冲突了

image-

网络原因,大部分编译失败的原因都是网络原因,这里推荐使用全局科学上网,比如在路由器层面全局代理 或者安装客户端全局代理。不推荐设置--proxy代理客户端这种方法,很多程序不会走这个代理的,比如wget有自己的配置文件要单独写proxy git也有自己的 go也有 你不可能一一设置 总会出问题。

文件权限,推荐克隆的时候就使用普通用户 这样克隆下来的源码目录权限就非常正常,如果你开始是root 有些东西不让你用root编译 你又切换普通用户然后给予权限很容易把权限搞乱。

failed to allocate 354 blocks, out of space?

空间不够,这里说的是你编译时,目标镜像设置的根分区大小,推荐不要小于128MB。

error: ext4_allocate_best_fit_partial: failed to allocate 354 blocks, out of space?Creating filesystem with parameters:    Size:     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: 7make[5]: *** [/home/make/lede/include/image.mk:336: 

安装

不过多讲解,将编译的产物(一般为.tar.gz文件)取出(/bin/targets/架构),解压获得img文件,此文件比较大是因为里面有根分区预先填充的空文件。

移动磁盘

如果预计启动设备是优盘或者其他移动设备使用Win32DiskImager刻录该镜像至设备。

硬盘

如果预计启动设备是磁盘 可以使用IMG写盘工具刻录

虚拟机

编译配置中,目标镜像-勾选编译vmdk,新建虚拟机,使用现有磁盘 选择编译的xxx.vmdk文件即可。

虚拟机可以先找个PE的镜像,然后使用软碟通打开此镜像,把IMG镜像和写盘工具放到PE镜像中,然后虚拟机使用被修改后的PE镜像创虚拟机即可。

image-

后续

定制文件

/home/make/lede/staging_dir/target-x86_64_musl/root-x86/etc

假如说您需要一个使用预配置文件/etc/config/firewall来构建固件,那么把您的firewall配置文件文件放到下面的路径:

<buildroot dir>/files/etc/config

IPK

一个下载IPK的地方

二次编译

#更新系统软件sudo apt-get update#清理工作空间make clean#更新源码git pull#更新feed等./scripts/feeds update -a./scripts/feeds install -a

其中清理空间如下有三种级别:^9简单来说,短期内更新用第一种;长期没更新,或者更换大的架构了推荐第二种;如果是为了提交代码或者把源码改坏了,想回到同步源码最初的样子可以使用第三种。

make clean

删除 bin 和 build_dir 目录的内容。

make dirclean

删除 /bin 和 /build_dir 目录以及 /staging_dir 和 /toolchain (=交叉编译工具)的内容。Dirclean 是您的基本“完全清洁”操作。

make distclean

核对您编译或配置的所有内容,并删除所有下载的提要内容和包源。注意:除此之外,这将删除您的构建配置 (.config)、您的工具链和所有其他来源。小心使用!OpenWrt 构建系统中还有许多其他功能,但以上内容应该涵盖了一些基础知识。

自动编译

自动编译Openwrt官方源

自动编译其他4大主流源

内核版本

修改编译使用的内核版本

查找目前编译的内核版本,如果需要更改的可以直接编辑下面这个文件

grep KERNEL  target/linux/x86/Makefile KERNEL_PATCHVER:=5.15KERNEL_TESTING_PATCHVER:=5.15KERNELNAME:=bzImage#此处使用的内核是5.15

BCM57810S

2022年1月23日后的lede源码已经包含了此设备的2.5Gb驱动补丁[8],所以不需要再手动添加。如果没有可以通过以下办法手动添加该补丁。

因为需要猫棒模块,所以找了一个支持2.5Gb速率的网卡,但是op默认源码不带驱动,参考[2]编译了一个带驱动的固件:

#路径5.10还是5.4根据你编译的内核自己选择,更改内核版本看上面文章cd openwrt/target/linux/x86/patches-5.15/#下载补丁文件wget :99/600-bnx2x-warpcore-8727-2g5.patch#重新更新./scripts/feeds update -a./scripts/feeds install -a#手动在.config添加以下俩项CONFIG_PACKAGE_bnx2x-firmware=yCONFIG_PACKAGE_kmod-bnx2x=y#或者执行make menuconfig选择bnx2x驱动 如下操作make menuconfig

勾选bnx2x

image-

注意上方路径:> Kernel modules > Network Devices

image-

作者

原文链接,如果遇到超链接或者图片附件等失效的情况下访问原文链接,转载注明出处:

:86/archives/openwrt-make

Openwrt编译 - good good study,day day up~

[email protected]

AHA

如果觉得编译麻烦,可以直接下载我编译好的。

22-04-21-openwrt-x86-64-generic-squashfs-combined.img - Share

image-image-20220421152932944

12-29-23openwrt-x86-64-generic-squashfs-combined-efi.img.gz - Share

参考资料

coolsnowwolf/lede: Leans OpenWrt source

kenzok78/small-package: 自动同步更新上游库软件

openwrt学习:make menuconfig的一些笔记_李迟的专栏-CSDN博客_make menuconfig openwrt

[1]:v2rayA - 文档[2]:Re: [Internet] [Bypassing the HH3K up to 2.5Gbps using a BCM57810S NIC - Bell Canada | DSLReports Forums]([4]:[OpenWrt 编译失败的原因及解决方案 #1 - 文件不完整 - P3TERX ZONE]([6]:[英特尔® 产品规范](#@Processors)[7]:[[OpenWrt Wiki] IPv6 configuration[8]:bnx2x 2.5G SGMII patch (#8745) · coolsnowwolf/lede@8e073bf