OpenWrt 编译入门(小白版)
编译环境
示例编译所用系统为 Ubuntu 22.04,信息如下
编译时由于网络问题,部分软件包可能出现下载问题,还请自备网络工具或尝试重新运行命令
编译步骤
下图为官网指示
编译环境设置(Build system setup)
这里根据我选择的系统 Ubuntu22.04
,终端输入如下命令
Debian / Ubuntu
Modernized set for Ubuntu 22.04 for OpenWrt master, 22.03 and 21.02 branches that do not need python2.7 any more. Python3 is installed by default in Ubuntu 22.04.
sudo apt update
sudo apt install build-essential clang flex bison g++ gawk \
gcc-multilib g++-multilib gettext git libncurses-dev libssl-dev \
python3-distutils rsync unzip zlib1g-dev file wget qemu qemu-utils
Older advice: (此步骤为比较旧的建议,可以不用输入)
sudo apt update
sudo apt install build-essential ccache ecj fastjar file g++ gawk \
gettext git java-propose-classpath libelf-dev libncurses5-dev \
libncursesw5-dev libssl-dev python python2.7-dev python3 unzip wget \
python3-distutils python3-setuptools python3-dev rsync subversion \
swig time xsltproc zlib1g-dev qemu qemu-utils
编译系统(Build system usage)
- 下载源代码(Downloading sources)
Clone the Git repository using the following command.
git clone https://git.openwrt.org/openwrt/openwrt.git [<buildroot>]
Possible issues:
-bash: git: command not found
- verify your build system setup.fatal: destination path 'openwrt' already exists and is not an empty directory.
- remove/rename the buildroot directory.
其中 [] 替换为你的编译目录,比如我的为
~/tmp/build/openwrt/
- 更新源代码(Updating sources)
Sources in development branch change frequently. It is recommended that you work with the latest sources.
cd [<buildroot>]
git pull
其中 [] 替换为你的编译目录,比如我的为
~/tmp/build/openwrt/
- 选择一个指定的版本(Select a specific code revision)
git branch -a
git tag
git checkout v23.05.2
因为现在我用的最新版本
v23.05.2
,所以就切换为git checkout v23.05.2
- 更新 Feed(Updating feeds)
./scripts/feeds update -a
./scripts/feeds install -a
因为网络环境的问题,建议重复执行上面的命令直到能够看到完全正常为止,正常如下
重复运行 ./scripts/feeds update -a
直到显示如下
shenyanwu@shenyanwu:~/tmp/build/openwrt$ ./scripts/feeds update -a
Updating feed 'packages' from 'https://git.openwrt.org/feed/packages.git^8e3a1824645f5e73ec44c897ac0755c53fb4a1f8' ...
Updating feed 'luci' from 'https://git.openwrt.org/project/luci.git^7739e9f5b03b830f51d53c384be4baef95054cb3' ...
Updating feed 'routing' from 'https://git.openwrt.org/feed/routing.git^83ef3784a9092cfd0a900cc28e2ed4e13671d667' ...
Updating feed 'telephony' from 'https://git.openwrt.org/feed/telephony.git^9746ae8f964e18f04b64fbe1956366954ff223f8' ...
Create index file './feeds/packages.index'
Create index file './feeds/luci.index'
Create index file './feeds/routing.index'
Create index file './feeds/telephony.index'
shenyanwu@shenyanwu:~/tmp/build/openwrt$
重复运行 ./scripts/feeds install -a
直到显示如下
shenyanwu@shenyanwu:~/tmp/build/openwrt$ ./scripts/feeds install -a
Collecting package info: package/feeds/packages/udp-broadcast-relay-redux-openwr
Collecting package info: done
Installing all packages from feed packages.
Installing all packages from feed luci.
Installing all packages from feed routing.
Installing all packages from feed telephony.
shenyanwu@shenyanwu:~/tmp/build/openwrt$
参考官方的编译配置信息(Using official build config)
wget https://downloads.openwrt.org/releases/23.05.2/targets/x86/64/config.buildinfo -O .config
我的版本是
23.05.2
,x86/64
可以在官方的下载目录去找到与你设备芯片对应的配置文件 官方页面传送门
编译镜像配置(Image configuration)
make menuconfig
运行此命令后等待片刻则会出现配置选择,通过上下方向键 ↑ ↓ 进行选择,回车键 ↵ 进入,空格键 Space 选择,其中选项前面的 <M>
表示编译为独立的包,即类似安装包,不会在编译好的系统中存在,需要另外安装, <*>
表示编译为内建包,即相当于直接编译至系统内部,不需要另外再安装,连续按下两次退出键 ESC 返回上一级目录,最后保存好的配置文件将会在当前的 OpenWrt
目录下生成一个名为 .config
的隐藏文件
此处提供一些基于官方编译配置的简单更改,根据的你目标机器的芯片选择前三项,第四项选择镜像格式,如果空间足够,可以考虑适当增加第四项 Target Images
-> Kernel partition size
和 Root filesystem partition size
LuCI
-> Modules
-> Translations
-> Chinese Simplified (zh_Hans)
为 LuCI 界面增加中文语言
在编译命令之前,可以运行一个检查命令,用来检查你的依赖项,包的一些先决条件等是否满足要求,还会从中删除过时的项目,例如对不存在的软件包或配置选项的引用
make defconfig
我的运行如下图所示:
shenyanwu@shenyanwu:~/tmp/build/openwrt$ make defconfig
tmp/.config-package.in:33826:error: recursive dependency detected!
tmp/.config-package.in:33826: symbol PACKAGE_python3-pymysql depends on PYTHON3_PYMYSQL_SHA_PASSWORD_SUPPORT
feeds/packages/lang/python/pymysql/Config.in:4: symbol PYTHON3_PYMYSQL_SHA_PASSWORD_SUPPORT depends on PACKAGE_python3-pymysql
For a resolution refer to Documentation/kbuild/kconfig-language.rst
subsection "Kconfig recursive dependency limitations"#
# configuration written to .config
#
shenyanwu@shenyanwu:~/tmp/build/openwrt$
此处检测到发生了一个依赖错误,通过查询 OpenWrt 官方 Github 的 issues,找到解决方案,链接 issues #22668
问题在于 feeds/packages/lang/python/pymysql
路径下 Makefile
里面的依赖冲突,该 issues 给出了解决方案,对 Makefile
文件修改如下,其中段落前面的 -
代表需要删除的部分, +
代表需要增添的部分
## Copyright (C) Alexandru Ardelean <ardeleanalex@gmail.com>## This is free software, licensed under the GNU General Public License v2.# See /LICENSE for more information.#include $(TOPDIR)/rules.mkPKG_NAME:=pymysqlPKG_VERSION:=1.0.2
-PKG_RELEASE:=1
+PKG_RELEASE:=2PYPI_NAME:=PyMySQLPKG_HASH:=816927a350f38d56072aeca5dfb10221fe1dc653745853d30a216637f5d7ad36PKG_MAINTAINER:=Alexandru Ardelean <ardeleanalex@gmail.com>PKG_LICENSE:=MITPKG_LICENSE_FILES:=LICENSEPKG_CONFIG_DEPENDS:=CONFIG_PYTHON3_PYMYSQL_SHA_PASSWORD_SUPPORTinclude ../pypi.mkinclude $(INCLUDE_DIR)/package.mkinclude ../python3-package.mk-define Package/python3-pymysql
+define Package/python3-pymysql/DefaultSUBMENU:=PythonSECTION:=langCATEGORY:=LanguagesTITLE:=Pure Python MySQL ClientURL:=https://pymysql.readthedocs.io/
- DEPENDS:=+python3 +PYTHON3_PYMYSQL_SHA_PASSWORD_SUPPORT:python3-cryptographyendef-define Package/python3-pymysql/config
- source "$(SOURCE)/Config.in"
+define Package/python3-pymysql
+$(call Package/python3-pymysql/Default)
+ DEPENDS:=+python3endefdefine Package/python3-pymysql/descriptionThis package contains a pure-Python MySQL client library, based on PEP 249.endef+define Package/python3-pymysql-sha-pwd
+$(call Package/python3-pymysql/Default)
+ TITLE+=w/ SHA256 password auth
+ DEPENDS:=+python3-pymysql $(RUST_ARCH_DEPENDS) +PACKAGE_python3-pymysql-sha-pwd:python3-cryptography
+endef+define Package/python3-pymysql-sha-pwd/description
+ This is a meta-package installing python3-pymysql and python3-cryptography
+ packages to be able to use pymysql with “sha256_password” or
+ “caching_sha2_password” for authentication.
+endef
+
+define Package/python3-pymysql-sha-pwd/install
+ true
+endef$(eval $(call Py3Package,python3-pymysql))$(eval $(call BuildPackage,python3-pymysql))$(eval $(call BuildPackage,python3-pymysql-src))
+$(eval $(call BuildPackage,python3-pymysql-sha-pwd))
修改后的完整文件如下
#
# Copyright (C) Alexandru Ardelean <ardeleanalex@gmail.com>
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#include $(TOPDIR)/rules.mkPKG_NAME:=pymysql
PKG_VERSION:=1.0.2
PKG_RELEASE:=2PYPI_NAME:=PyMySQL
PKG_HASH:=816927a350f38d56072aeca5dfb10221fe1dc653745853d30a216637f5d7ad36PKG_MAINTAINER:=Alexandru Ardelean <ardeleanalex@gmail.com>
PKG_LICENSE:=MIT
PKG_LICENSE_FILES:=LICENSEPKG_CONFIG_DEPENDS:=CONFIG_PYTHON3_PYMYSQL_SHA_PASSWORD_SUPPORTinclude ../pypi.mk
include $(INCLUDE_DIR)/package.mk
include ../python3-package.mkdefine Package/python3-pymysql/DefaultSUBMENU:=PythonSECTION:=langCATEGORY:=LanguagesTITLE:=Pure Python MySQL ClientURL:=https://pymysql.readthedocs.io/
endefdefine Package/python3-pymysql
$(call Package/python3-pymysql/Default)DEPENDS:=+python3
endefdefine Package/python3-pymysql/descriptionThis package contains a pure-Python MySQL client library, based on PEP 249.
endefdefine Package/python3-pymysql-sha-pwd
$(call Package/python3-pymysql/Default)TITLE+=w/ SHA256 password authDEPENDS:=+python3-pymysql $(RUST_ARCH_DEPENDS) +PACKAGE_python3-pymysql-sha-pwd:python3-cryptography
endefdefine Package/python3-pymysql-sha-pwd/descriptionThis is a meta-package installing python3-pymysql and python3-cryptographypackages to be able to use pymysql with “sha256_password” or“caching_sha2_password” for authentication.
endefdefine Package/python3-pymysql-sha-pwd/installtrue
endef$(eval $(call Py3Package,python3-pymysql))
$(eval $(call BuildPackage,python3-pymysql))
$(eval $(call BuildPackage,python3-pymysql-src))
$(eval $(call BuildPackage,python3-pymysql-sha-pwd))
修改完成后重新运行 make defconfig
,结果如下
shenyanwu@shenyanwu:~/tmp/build/openwrt$ make defconfig
Collecting package info: done
#
# configuration written to .config
#
shenyanwu@shenyanwu:~/tmp/build/openwrt$
下载相关源以及多核编译的依赖(Download sources and multi core compile)
make download
此命令将会预先下载你依赖的所有源代码,同时开启支持多核编译的功能,这样你才可以成功编译,并且使用多核编译提升编译速度
编译镜像(Building images)
make -j $(($(nproc)+1))
这个命令属于多核编译开启,使用你所有的核心进行编译,当然如果你想使用指定核心数量编译,请在 -j
命令后指定核心数,例如单核编译
make -j1
当然你要是不放心之前下载的相关源以及多核编译的依赖,你可以执行下面的代码,在编译前重新下载一次,然后自动开始编译
make -j $(nproc) download world
你可能在别的教程里面见过在命令后面还有
V=sc
或者V=s
,这是打开日志显示,在你编译出错排错时,会在终端进行显示错误信息,对于排除错误很有用,比如以下命令会输出很多日志提供错误帮助make -j1 download world V=s
建议在第一次编译时,如果你不确定你的配置项都满足编译要求,可以使用单核,日志输出编译 make -j1 V=s
来确保出错后进行排除。比如我编译配置中选择了编译 vmdk
格式的镜像文件,产生了以下错误日志
WARNING: Install qemu-img to create VDI/VMDK images
make[5]: *** [Makefile:158: /home/shenyanwu/tmp/build/openwrt/build_dir/target-x86_64_musl/linux-x86_64/tmp/openwrt-23.05.2-x86-64-generic-squashfs-combined.vmdk] Error 1
make[5]: Leaving directory '/home/shenyanwu/tmp/build/openwrt/target/linux/x86/image'
make[4]: *** [Makefile:24: install] Error 2
make[4]: Leaving directory '/home/shenyanwu/tmp/build/openwrt/target/linux/x86'
make[3]: *** [Makefile:11: install] Error 2
make[3]: Leaving directory '/home/shenyanwu/tmp/build/openwrt/target/linux'
time: target/linux/install#86.46#47.88#127.74ERROR: target/linux failed to build.
make[2]: *** [target/Makefile:30: target/linux/install] Error 1
make[2]: Leaving directory '/home/shenyanwu/tmp/build/openwrt'
make[1]: *** [target/Makefile:24: /home/shenyanwu/tmp/build/openwrt/staging_dir/target-x86_64_musl/stamp/.target_install] Error 2
make[1]: Leaving directory '/home/shenyanwu/tmp/build/openwrt'
make: *** [/home/shenyanwu/tmp/build/openwrt/include/toplevel.mk:232: world] Error 2
可以看出是由于 WARNING: Install qemu-img to create VDI/VMDK images
导致了以下输出,应该是选择了 vmdk
格式的镜像后,通过 qemu-img
这个文件进行转换格式,但是并未安装 qemu-img
,因此运行命令(此命令我已添加在了编译环境设置中)
sudo apt install qemu qemu-utils
然后重新开始执行编译即可,或者你在 make menuconfig
中去除掉 image vmdk
格式的镜像文件选项,在用编译之后的 img
镜像进行转换格式即可
编译完成后,可以发现镜像在 openwrt/bin/targets
目录下,根据我的配置文件,生成以下镜像压缩文件,选择一个合适的使用即可
相关文章:

OpenWrt 编译入门(小白版)
编译环境 示例编译所用系统为 Ubuntu 22.04,信息如下 编译时由于网络问题,部分软件包可能出现下载问题,还请自备网络工具或尝试重新运行命令 编译步骤 下图为官网指示 编译环境设置(Build system setup) 这里根据我…...

嵌入式视频播放器(mplayer)
1.文件准备: MPlayer-1.0rc2.tar.bz2 libmad-0.15.1b.tar.gz 直接Git到本地 git clone https://gitee.com/zxz_FINE/mplayer_tarball.git 2.文件夹准备: src存放解压后的源码文件,target_Mplayer存放编译安装的目标文件 mkdir src targe…...

对房价数据集进行处理和数据分析
大家好,我是带我去滑雪,每天教你一个小技巧! 房价数据集通常包含各种各样的特征,如房屋面积、地理位置、建造年份等。通过对数据进行处理和分析,可以更好地理解这些特征之间的关系,以及它们对房价的影响程度…...

BERT的学习
BERT 1.前言 self-supervised learning是一种无监督学习的特殊形式,算法从数据本身生成标签或者目标,然后利用这些生成的目标来进行学习。(也就是说数据集的标签是模型自动生成的,不是由人为提供的。)例如࿰…...

数据结构OJ实验9-图存储结构和遍历
A. 图综合练习--构建邻接表 题目描述 已知一有向图,构建该图对应的邻接表。 邻接表包含数组和单链表两种数据结构,其中每个数组元素也是单链表的头结点,数组元素包含两个属性,属性一是顶点编号info,属性二是指针域n…...

20231226在Firefly的AIO-3399J开发板上在Android11下调通后摄像头ov13850
20231226在Firefly的AIO-3399J开发板上在Android11下调通后摄像头ov13850 2023/12/26 8:22 开发板:Firefly的AIO-3399J【RK3399】 SDK:rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2.ab And…...

0101包冲突导致安装docker失败-docker-云原生
文章目录 1 前言2 报错3 解决结语 1 前言 最近在学习k8s,前置条件就是要安装指定版本的docker,命令如下 yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.62 报错 file /usr/libexec/docker/cli-plugins/docker-buildx fr…...
【力扣100】17.电话号码的字母组合
添加链接描述 class Solution:def letterCombinations(self, digits: str) -> List[str]:# 思路是使用回溯算法if not digits:return []phone {2:[a,b,c],3:[d,e,f],4:[g,h,i],5:[j,k,l],6:[m,n,o],7:[p,q,r,s],8:[t,u,v],9:[w,x,y,z]}def backtrack(con,dig):# 收获if le…...

2023。
一月 从头开始 二月 准备复试&初试成绩 三月 最开心 过了两个生日(这机率,幸运儿) 考研也成功上岸!nnuGISer! 四月 和室友去了趟武汉 五月 拍毕业照 六月 人生高光时刻 省创!上台领奖!考研…...
出现 Cause: java.sql.SQLException: Field ‘id‘ doesn‘t have a default value解决方法
目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 在驱动Springboot项目的时候,出现如下问题: org.springframework.dao.DataIntegrityViolationException: ### Error updating database. Cause: java.sql...

Linux--批量自动装机
实验环境 随着某公司业务不断发展,服务器主机的数量也迅速增长,对于功能变更或新采购的服务器, 需要重新安装CentOS7操作系统,为了提高服务器装机效率,要求基于PXE网络实现全自动无人值 守批量安装。 需求描述 > 服…...

病理HE学习贴(自备)
目录 正常结构 癌症HE 在线学习 以胃癌的学习为例 正常结构 1:胃粘膜正常结构和细胞分化 ●表面覆盖小凹上皮细胞(主要标志物:MUC5AC)以保护黏膜。 ●胃底腺固有腺体由黏液颈细胞(MUC6)、主细胞(Pepsinogen l)和壁细胞(Proton pump α-subunit)组…...
关于协同过滤算法在物联网的应用-基于用户行为数据和物联网设备数据,以此提供个性化的智能家居控制推荐服务
关于协同过滤算法在物联网领域的应用的一个案例是基于用户行为数据和物联网设备数据,为用户提供个性化的智能家居控制推荐服务。 具体实现如下: 数据收集:收集用户对智能家居设备的使用行为数据,包括设备的打开、关闭、调节等操…...

计算机网络(6):应用层
每个应用层协议都是为了解决某一类应用问题,而问题的解决又往往是通过位于不同主机中的多个应用进程之间的通信和协同工作来完成的。 应用层的具体内容就是规定应用进程在通信时所遵循的协议。 应用层的许多协议都是基于客户服务器方式。即使是对等通信方式&#x…...

ESP32:整合存储配网信息和MQTT笔记
文章目录 1.给LED和KEY的所用IO增加配置项1.1 增加配置文件1.2 修改相应的c源码 2. 把mqtt\tcp的工程整合到一起2.1 在何处调用 mqtt_app_start() 3. 测试MQTT4. 完整的工程源码 有一段时间没有玩ESP32,很多知识点都忘记了。今天测试一下MQTT,做个笔记。…...

nginx源码分析-4
这一章内容讲述nginx的模块化。 ngx_module_t:一个结构体,用于描述nginx中的各个模块,其中包括核心模块、HTTP模块、事件模块等。这个结构体包含了一些模块的关键信息和回调函数,以便nginx在运行时能够正确地加载和管理这些模块。…...

【Unity美术】Unity工程师对3D模型需要达到的了解【二】
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:Uni…...
《微信小程序开发从入门到实战》学习六十九
6.6 网络API 6.6.3 下载文件API 使用 wx.downloadFile 接口是可使小程序发起HTTPS GET请求,下载文件到手机端。 单次下载的最大文件为50MB。接受Obkect参,参支持属性如下: url(必填):下载文件的URL he…...

2022年全球软件质量效能大会(QECon北京站2022)-核心PPT资料下载
一、峰会简介 当前,新一轮科技革命和产业变革正在重塑全球经济格局,以云计算为代表的新一代信息技术创新活跃,与实体经济深度融合,推动泛在连接、数据驱动、智能引领的数字经济新形式孕育而生。 新兴技术的出现给测试乃至整个软…...

ILI9481 TFT3.5寸屏STM32F446ZEXX FMC驱动方式详解
图片来源于网络,如若侵权请联系博主删除 文章目录 1. 背景2. 基础知识2.1 TFT-LCD2.2 硬件接线2.3 FMC2.4 ILI9481 3. 软件抽象 1. 背景 最近做项目需要,博主在某宝上买了一块3.5寸的TFT屏,店家虽然发了资料,但是往产品上移植驱动…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...