构建 OpenWrt
OpenWrt 是一款路由器操作系统。如果你想要给自己的路由器安装 OpenWrt 的话,一般来说使用别人已经构建好的 OpenWrt 固件就够用了。当然如果你闲得没事干,那么也可以自己构建固件。
Prerequisites
- CPU:必须为 amd64 架构
- 操作系统:Ubuntu 22.04
- 非 root 环境
- 15 GB 空闲空间
Build
安装依赖:
sudo apt update -y
sudo apt full-upgrade -y
sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \
bzip2 ccache clang cmake cpio curl device-tree-compiler ecj fastjar flex gawk gettext gcc-multilib \
g++-multilib git gnutls-dev gperf haveged help2man intltool lib32gcc-s1 libc6-dev-i386 libelf-dev \
libglib2.0-dev libgmp3-dev libltdl-dev libmpc-dev libmpfr-dev libncurses5-dev libncursesw5 \
libncursesw5-dev libpython3-dev libreadline-dev libssl-dev libtool lld llvm lrzsz mkisofs msmtp \
nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pip python3-ply \
python3-docutils python3-pyelftools qemu-utils re2c rsync scons squashfs-tools subversion swig \
texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev zstd
克隆源代码库。OpenWrt 项目有多个子分支。ImmportalWrt 是根据国人需求改进的 OpenWrt 分支,ImmportalWrt-MT798X 是 hanwckf 大佬在 ImmportalWrt 的基础上为 MediaTek MT798X 系列芯片做的适配。
%%{init: { 'gitGraph': {'mainBranchName': 'OpenWrt', 'showCommitLabel': false }} }%%
gitGraph
commit
commitbranch ImmortalWrt
commit
commit tag: "v21.02"branch ImmortalWrt-MT798X
commit
commit
commitcheckout OpenWrt
commit
checkout ImmortalWrt
commit克隆你需要的库:
# OpenWrt
git clone -b <branch> --single-branch --filter=blob:none https://github.com/openwrt/openwrt.git
cd openwrt # ImmortalWrt
git clone -b <branch> --single-branch --filter=blob:none https://github.com/immortalwrt/immortalwrt
cd immortalwrt # ImmortalWrt-798X
git clone --filter=blob:none https://github.com/hanwckf/immortalwrt-mt798x
cd immortalwrt-mt798x
branch:
更新 feeds。feeds 配置了我们想要安装的插件。
编辑 feeds 配置文件
feeds.conf(可省略)更新并安装 feeds:
# 获取 feeds.conf / feeds.conf.default 中定义的所有最新软件包定义
./scripts/feeds update -a # 请确认命令是否执行成功 # 将所有获取的软件包的符号链接安装到 package/feeds/ 中
./scripts/feeds install -a
配置构建选项:
make menuconfig # 为工具链、目标系统和固件包选择首选配置
方向键选中条目,回车键应用下方的操作,左右键切换操作。
首先要配置构建系统的目标平台。通过
Target System、Subtarget、Target Profile三个选项一起配置。Target System:构建系统的目标架构,通常指定你要为其构建固件的硬件平台类型。例如,常见的目标系统包括Atheros AR7xxx/AR9xxx、Broadcom BCM27xx、MediaTek Ralink MIPS等等。
Subtarget:有些目标系统会有不同的子目标,它们代表了更具体的硬件配置或者变种。例如,对于某些 SoC,不同的子目标可能代表不同的芯片型号或者不同的硬件功能。Target Profile:目标配置文件进一步细化到了具体的设备级别。它通常包括了特定设备的硬件特性和配置,例如内存大小、闪存布局、网卡配置等。
以我的 Redmi AX6000 为例,对构建系统配置如下:
Target System: MediaTek Ralink ARMSubtarget: MT7986Target Profile: Xiaomi Redmi Router AX6000
接下来要配置目标固件镜像格式(
Target Image)。这里介绍一下常用的选项:Root filesystem images
将构建的 OpenWrt 系统的根目录
/打入映像文件。这里我们可以选择磁盘映像内的文件系统:ext4:一种常用的 Linux 文件系统,支持读写操作。如果你的固件要刷入 PC 机或虚拟机,那么可以使用这种文件系统。squashfs:一种只读的压缩文件系统,常用于嵌入式设备以减少存储空间占用。Build GRUB EFI images:构建适用于 EFI(UEFI 前身)硬件的 x86 平台的 GRUB 引导镜像。现在的嵌入式设备都是 EFI 了。Build LiveCD image (ISO):构建一个可引导的 ISO 镜像文件,如果你要往 PC 机刷固件的话可以用这种格式Build VMware image files (VMDK):构建适用于 VMware 虚拟机的 VMDK 镜像文件GZip Images:将生成的固件映像文件进行 GZip 压缩
上面的配置都与你的目标平台有关。从现在开始你可以定制自己的 OpenWrt 了。这里我们主要编辑的是
LuCI的Collections、Applications和Themes配置。*表示将模块包含进固件(按Y)M表示模块将单独编译,不会包含进固件(按M)(空白)表示不编译该模块(按N)
首先将
LuCI -> Collections -> LuCI选中,这将启用 LuCI Web 配置界面。接下来在LuCI -> Applications中选中你喜欢的插件。然后在LuCI -> Themes中选择你喜欢的主题。最后在LuCI -> Modules -> Translations选择语言。配置完成后退出并保存。配置文件将被保存到项目根目录下的
.config文件中。
更多关于插件的解释可以参见:OpenWrt 编译 LuCI -> Applications 添加插件应用说明-L大【2022.11.28】| 恩山无线论坛
构建固件
make -j $(($(nproc)+1)) download world # 下载依赖,然后使用多线程构建
编译过程需要 2 个小时左右。
该命令会:
- 编译工具链
- 然后用这个工具链交叉编译源文件
- 创建
opkg软件包 - 创建镜像
Artifacts
- 构建产物位于
bin/targets/{platform}/{subtarget}/目录中。 - 构建时生成的工具链位于
staging_dir/toolchain-{arch}_gcc-{gcc-version}_musl
一个完整的 OpenWrt 固件由两部分组成:rootfs(根文件系统)和 kernel(内核)。这两部分共同组成了设备启动和运行所需的基本软件环境。
- 内核:
openwrt-{arch}-kernel.bin - 根文件系统:
openwrt-{arch}-squashfs-rootfs.bin
在实际使用中,OpenWrt 通常会将这两部分结合起来生成一个完整的固件映像文件,例如:
openwrt-{arch}-squashfs-sysupgrade.bin:用于系统升级的固件映像。openwrt-{arch}-squashfs-factory.bin:用于初次刷入设备的固件映像。openwrt-{arch}-combined.bin:一些平台会生成结合了内核和根文件系统的单一镜像文件。
此外,在构建过程中 OpenWrt 还会生成一些元数据文件:
config.buildinfo记录了构建过程中使用的所有配置选项feeds.buildinfo记录了构建过程中使用的所有软件包源openwrt-{arch}.manifest记录了构建过程中所选的所有软件包及其版本信息packages文件夹包含了根据你的配置编译和打包的所有软件包sha256sums包含了所有生成文件的 SHA-256 校验和version.buildinfo记录了当前构建所使用的 OpenWrt 版本信息,包括主版本号、分支名称、Git 提交哈希等。profiles.json包含了构建目标(profiles)的详细信息。这对于了解支持的设备、生成的固件以及配置特性非常有用。
Clean
在开始新的构建前,你可能想要清理上次构建的产物。
清理构建产物:
make clean # 删除 /bin 和 /build_dir 中的内容
完全清理:
make dirclean # 删除 /bin、/build_dir、/staging_dir(工具和交叉编译工具链)、/tmp(有关软件包的数据)和 /logs 中的内容
Appandix
一些名词:
Stock firmware:原厂固件
Stock layout:原厂分区(容量较小)
Uboot layout:U-Boot 大分区(容量较大)
预编译固件:
U-Boot:OpenWrt 官方开发了一个 U-Boot,而恩山论坛的大佬们也开发了自己的 U-Boot。OpenWrt 官方的 U-Boot 叫 OpenWrt U-Boot,而恩山大佬们开发的 U-Boot 叫 Custom U-Boot。
Breed:另一种 U-Boot
Web 配置界面:
参见:
- OpenWrt | GitHub
- ImmortalWrt | GitHub
- 固件构建快速入门 | OpenWrt Docs
- Build system usage | OpenWrt Docs
- OpenWrt 固件自编译教程:从入门到酸爽!| 喵斯基部落
Troubleshooting
Ubuntu 24.04 无法安装 Python2.7
构建 OpenWrt的更多相关文章
- 在主机上如何构建openwrt的编译环境?
答: 请参考官方文档
- openwrt开发笔记一:源码下载与编译
1.1 环境要求 编译系统:Linux发行版(本文使用Ubuntu) 编译一个可以安装的OpenWrt固件镜像文件(大约8MB大小的),你需要: 一个纯净的OpenWrt编译系统大约需要200MB的空 ...
- openwrt构建过程探索
参考网站:http://wiki.openwrt.org/doc/howto/buildroot.exigence 需要下载必要的库文件,编译器等... 1 首先要获得openwrt的源码,参考ope ...
- 嵌入式文件系统构建工具 busybox / buildroot / openwrt
1.busybox busybox最轻量 1) 修改Makefile CROSS_COMPILE ?= /usr/local/gcc-linaro-arm-linux-gnueabihf/bin/ar ...
- 【OpenWRT】【RT5350】【一】OpenWrt开发环境搭建
[宿主机构建] 本人电脑配置如下: CPU: intel 酷睿 i3 3.3G 双核 内存: 金士顿 8G 硬盘:希捷 1TB 7200rpm 操作系统:win7 旗舰版 64位 OpenWrt是在 ...
- OpenWrt自定义和官方一样的固件
我用的OpenWrt版本是Barrier Breaker 14.07,硬件是NetGear WNDR4300. 我自定义固件的目的是把固件的根分区扩到最大(100MB,总FLASH是128MB),试过 ...
- [Openwrt 项目开发笔记]:Openwrt平台搭建(一)
[Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 最近开始着手进行Openwrt平台的物联网网关设 ...
- openwrt的交叉编译
默认情况下,openwrt编译脚本会自动从Internet上获取所需要的软件包源代码,并把下载的源码包存放在当前目录的 dl/ 目录中: 在 build_dir/ 目录中存放编译中使用的软件包, ...
- OpenWrt for vmware 从openwrt.org下载10.03.1 或是自己下载最新的源码进行编译生成x86 vmdk格式
1,直接从OpenWrt.org官网下载 http://downloads.openwrt.org/backfire/10.03.1/x86_generic/ 更新OpenWrt在线软件源 opkg ...
- openwrt教程 第一章 物联网&openwrt开发概述
1.1 我们的宗旨 互联网.移动互联网的时代已经过去,物联网的时代已经来临!2014年,是物联网元年,2016年,物联网将达到高潮!为了迎接该潮流,我们工作室(F403科技创意室:http://f40 ...
随机推荐
- SpringBoot获取请求头信息
Http 头信息 HTTP 头(Header)是一种附加内容,独立于请求内容和响应内容. HTTP 协议中的大量特性都通过Header信息交互来实现,比如内容编解码.缓存.连接保活等等. reques ...
- [oeasy]python0085_[趣味拓展]字体样式_下划线_中划线_闪动效果_反相_取消效果
字体样式 回忆上次内容 \033 xm 可以改变字体样式 0m - 10m 之间设置的 都是字体效果 0m 复原 1m 变亮 2m 变暗 添加图片注释,不超过 140 字(可选) ...
- oeasy教您玩转vim - 23 - 配置文件
配置文件 回忆上节课内容 我们上次找到配置文件的位置 ~/.vimrc 了解各种配置开关 修改配置文件并应用 这次想了解和配色方案相关的内容 colorscheme vi ~/.vimrc.old 中 ...
- .Net4.5及.Net Core2.1下的HttpClient使用详解
一.HTTP系列演进 方式 说明 HttpWebRequest .NET早期版本,同步方式 WebClient HttpWebRequest的封装简化版,同步方式 HttpClient .NET4.5 ...
- CF916C 题解
CF916C 题解 思路 思考发现,如果我们让很多边的边权变得非常大,而故意留下 \(1\) 到 \(n\) 的某一条路径,使整条路径之和甚至还没有剩下一条边的权值大,这条路径显然就是最短路了. 更重 ...
- R语言基于表格文件的数据绘制具有多个系列的柱状图与直方图
本文介绍基于R语言中的readxl包与ggplot2包,读取Excel表格文件数据,并绘制具有多个系列的柱状图.条形图的方法. 首先,我们配置一下所需用到的R语言readxl包与ggplot2 ...
- QT 的 ModelView
QApplication a(argc, argv); QDirModel model; //QDirModel, 问文件目录树 QTreeView tree; QListView l ...
- freemarker+minio实现页面静态化
什么是页面静态化? 将原本动态生成的网页内容通过某种形式转化为html并存储在服务器上,当用户请求这些页面时就不需要执行逻辑运算和数据库读 优点: 性能:提高页面加载速度和响应速度,还可以减轻数据库. ...
- java中的Context
在java编程中,上下文(Context)是指程序运行时的环境和状态的集合.包括了类对象变量方法等运行时的相关数据 在类中,我们可以通过this获取当前类的变量.方法的上下文, 例如getset方法: ...
- 写写stream流的终结操作
终结操作和中间操作的区别:中间操作返回的一直都是stream,所以可以一直使用,但是终结操作返回的不是stream,后面不能继续操作 foreach:对流中的所有元素进行遍历操作 count:获取当前 ...

