首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >浅析busybox如何集成到openwrt

浅析busybox如何集成到openwrt

作者头像
zqb_all
发布于 2019-12-27 08:06:38
发布于 2019-12-27 08:06:38
1.7K00
代码可运行
举报
文章被收录于专栏:QB杂货铺QB杂货铺
运行总次数:0
代码可运行

背景

近日添加了一个包到openwrt中,在此过程中又对openwrt多了一些认识

这个包本身自带了kconfig,可直接在这个包里面执行make menuconfig进行配置,然后执行make

但要集成到openwrt中,就需要把这些配置项都集成到openwrt的配置中。

面对这种情况,当然是要找个现成的例子做参考,首先想到的就是busybox。

以下以busybox为例进行说明,源码摘自github https://github.com/openwrt/openwrt/tree/master/package/utils/busybox

如何集成配置项

busybox本身也自带了配置项,但实际上我们却可以在openwrt的总的配置项中对其进行配置,而无需进入busybox目录单独对其做配置。

通过查看busybox包的makefile,可以看到,这个集成是这么做的。 对于busybox原生的配置项不做改动,而是针对每个配置项都另外生成一个对应的配置项,用于集成到openwrt中。 这些配置项在 openwrt/package/utils/busybox/config目录中。并通过 openwrt/package/utils/busybox/Config.in 文件连接到openwrt配置项。下面结合代码分析下。

从Makefile中可以看到,对于openwrt来说,busybox包的配置,就来源于Config.in

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
文件 openwrt/package/utils/busybox/Makefile

define Package/busybox/config
    source "$(SOURCE)/Config.in"
endef

先来看下openwrt/package/utils/busybox/Config.in这个总的配置文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
文件 openwrt/package/utils/busybox/Config.in

if PACKAGE_busybox

config BUSYBOX_CUSTOM
    bool "Customize busybox options"
    default n
        help
          Enabling this allows full customization of busybox settings.
          Note that there are many options here that can result in a build
          that doesn't work properly.  Enabling customization will mark your
          build as "tainted" for the purpose of bug reports.
          See the variables written to /etc/openwrt_release

          Unless you know what you are doing, you should leave this as 'n'

    source "Config-defaults.in"        #引入默认配置项的值

    if BUSYBOX_CUSTOM             #当选择了自定义配置项时
        source "config/Config.in"       #引入对应于busybox原生配置项的配置文件,允许用户完全自定义
    endif

config BUSYBOX_USE_LIBRPC
    bool
    default y if BUSYBOX_CUSTOM && BUSYBOX_CONFIG_FEATURE_HAVE_RPC
    default y if !BUSYBOX_CUSTOM && BUSYBOX_DEFAULT_FEATURE_HAVE_RPC

endif

这里面定义了一个BUSYBOX_CUSTOM配置项,当不选中时,就只引入默认配置"Config-default.in",当选中时,就再引入config目录下对应于busybox原生配置项的配置文件,以允许用户完全自定义这些配置。

先看不自定义配置的情况。此时Config.in就只引入了Config-defaults.in,打开这个文件,可以看到,里面是一系列以BUSYBOX_DEFAULT开头的配置项,如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
文件 openwrt/package/utils/busybox/Config-defaults.in

config BUSYBOX_DEFAULT_HAVE_DOT_CONFIG
    bool
    default y
config BUSYBOX_DEFAULT_DESKTOP
    bool
    default n
config BUSYBOX_DEFAULT_EXTRA_COMPAT
    bool
default n

这些其实就是对应到busybox本身的所有配置项的。只是名字略有不同。最终,在Makefile中,会将这些配置项转换为busybox本身的配置文件。即

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
文件 openwrt/package/utils/busybox/Makefile

define Build/Configure
    grep 'CONFIG_BUSYBOX_$(BUSYBOX_SYM)' $(TOPDIR)/.config | sed -e "s,\\(# \)\\?CONFIG_BUSYBOX_$(BUSYBOX_SYM)_\\(.*\\),\\1CONFIG_\\2,g" > $(PKG_BUILD_DIR)/.config
    yes 'n' | $(MAKE) -C $(PKG_BUILD_DIR) $(MAKE_FLAGS) oldconfig
endef

从总的配置文件中,滤出所有CONFIG_BUSYBOX_$(BUSYBOX_SYM)开头的配置项,并通过sed将前缀CONFIG_BUSYBOX_$(BUSYBOX_SYM)去掉,生成用于busybox编译的.config文件。再执行一遍make oldconfig,以自动处理掉一些配置不合适的情况,修正最终的.config文件。

其中这个$(BUSYBOX_SYM)变量,也是在Makefile中赋值的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
文件 openwrt/package/utils/busybox/Makefile

BUSYBOX_SYM=$(if $(CONFIG_BUSYBOX_CUSTOM),CONFIG,DEFAULT)

这样就清楚了。busybox的makefile中,在未选中CONFIG_BUSYBOX_CUSTOM的情况下,BUSYBOX_SYM的值为DEFAULT,则将CONFIG_BUSYBOX_DEFAULT_xxx过滤出来,处理为busybox最终的配置项。这些CONFIG_BUSYBOX_DEFAULT_xxx是在Config-defaults.in文件中配置好的。

在选中了CONFIG_BUSYBOX_CUSTOM的情况下,则最终将CONFIG_BUSYBOX_CONFIG_xxx过滤出来使用。

接下来看自定义的情况。自定义的情况其实也很清晰,就是引入了config目录下的配置项。 这些配置项,跟busybox源码中的布局和内容完全一致,区别只是配置项的名字都为BUSYBOX_CONFIG开头,且默认值均为对应的BUSYBOX_DEFAULT_开头的配置项。记得吗,这些BUSYBOX_DEFAULT_开头的配置项都是在Config-default.in中配置的。如下例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
文件 openwrt/package/utils/busybox/config/init/Config.in

config BUSYBOX_CONFIG_INIT
    bool "init"
    default BUSYBOX_DEFAULT_INIT
    select BUSYBOX_CONFIG_FEATURE_SYSLOG
    help
init is the first program run when the system boots.

也就是说,当用户需要自定义的时候,引入了BUSYBOX_CONFIG_xxx的配置项,但其默认值还是用的已经配置好的。此时要自定义的就是在这个基础上做修改。

最终用户的配置就体现在BUSYBOX_CONFIG_xxx的配置项上。 如上文所述,在选中了CONFIG_BUSYBOX_CUSTOM的情况下,BUSYBOX_SYM的值为CONFIG,则将CONFIG_BUSYBOX_CONFIG_xxx过滤出来,处理为busybox最终的配置项。

配置项文件的生成

搞清楚了如何集成之后,接下来的问题就是,这些BUSYBOX_DEFAULT_xxx 和 BUSYBOX_CONFIG_xxx 的配置文件,是怎么来的,如此多的配置项,肯定不可能时手工修改的,必然有自动化处理。

是的,这些BUSYBOX_CONFIG_xxx配置项,就是从busybox本身的配置项生成而来。而这些BUSYBOX_DEFAULT_xxx的默认配置值,其实就是从一份配置好的busybox.config文件生成而来。在busybox的包中,就提供了两个脚本 convert_defaults.pl 和 convert_menuconfig.pl,用来生成配置项和默认配置值

使软件包随配置项改变而重新编译

一般软件包在编译过一次之后,如果源码没有改动,则下次make无须重新编译。

但对于busybox这种包,源码未变,配置改变了的话,也是需要重新编译的。 现在的问题在于,用户修改配置项,是在openwrt的.config修改,根本不会改动到busybox这个目录下的文件。 那么busybox包就需要有一个方法,来监控配置项的变动。如果配置项变化,则需要重新编译。如何监控呢?从makefile中也可以找到答案

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
文件 openwrt/package/utils/busybox/Makefile

ifeq ($(DUMP),)
  STAMP_CONFIGURED:=$(strip $(STAMP_CONFIGURED))_$(shell grep '^CONFIG_BUSYBOX_' $(TOPDIR)/.config | mkhash md5)
endif

此处设置了STAMP_CONFIGURED变量,这个变量的值,是将.config中所有CONFIG_BUSYBOX_滤出,再做md5得到的值。一旦这些配置项发生变化,则md5的值会改变,STAMP_CONFIGURED的值也会改变。编译包的时候,就能判断出需要重新编译。

具体的,STAMP_CONFIGURED值是在package.mk中使用。这里还有其他的类似变量,只要改变了,就说明需要重新执行对应的操作。如STAMP_CONFIGURED,STAMP_BUILT,STAMP_INSTALLED等。

这个配置项,也会在软件包的编译目录体现出来。如果没有对其赋值,则在编译目录下,可看到名字类似 .configured_yyy 的隐藏文件。

对其进行赋值之后,这个文件的形式会变成 .configured_yyy_622f380fff06dde988852308f044653b 这种形式,后面跟着的就是由配置项生产的md5值。

结语

分析清楚了busybox的套路之后,修改下 convert_defaults.pl 和 convert_menuconfig.pl ,就可以套用到其他软件包上了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-01-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何添加APP到Buildroot里(以瑞芯微rv1126为例)
Buildroot是Linux平台上一个构建嵌入式Linux系统的框架,整个Buildroot是由Makefile脚本和Kconfig配置文件构成。可以和编译Linux内核一样,通过buildroot配置,menuconfig修改,编译出一个完整的可以直接烧写到机器上运行的Linux系统软件(包含boot、kernel、rootfs以及rootfs中的各种库和应用程序)。制作的rootfs通常需要包含很多第三方软件,比如busybox,udhcpc,tftp,apache,sqlite,PHP,iptable,DNS等,为避免复杂的移植工作,在buildroot中通过menuconfig配置我们根文件系统中需要的功能,将不需要的去掉,再执行make编译,buildroot就会自动从指定的服务器上下载源码包,自动编译,自动搭建我们所需要的嵌入式根文件系统。
杨源鑫
2021/07/07
8.1K1
如何添加APP到Buildroot里(以瑞芯微rv1126为例)
全志v851s 在 eyesee-mpp 中添加一个hello_world sample 的流程
1. 为什么要在eyesee-mpp 中添加sample? 1)保持整个openwrt 应用程序编写的完成性; 2)eyesee-mpp 中包含了几乎所有全志视频音频模块的sample 以及 头文件,参考以及头文件调用起来非常方便,而且可以学习各种模块的使用流程; 3)可以直接在make menuconfig 中管理应用程序,是否编译; 4)不需要将交叉编译工具链放到外面,只要按照步骤添加好sample ,就可以直接mm -B 进行编译;
阿志小管家
2024/02/02
3150
全志v851s 在 eyesee-mpp 中添加一个hello_world sample 的流程
全志 Tina Linux 系统软件 开发指南 sdk源码编译操作 深入理解Tina-sdk编译框架 支持百问网T113 D1-H哪吒 DongshanPI-D1s V853-Pro等开发板
编写目的:本文档作为Allwinner Tina Linux系统平台开发指南,旨在帮助软件开发工程师、技术支持工程师快速上手,熟悉Tina Linux系统的开发及调试流程。
韦东山
2022/12/28
5.4K0
全志 Tina Linux 系统软件 开发指南 sdk源码编译操作 深入理解Tina-sdk编译框架 支持百问网T113 D1-H哪吒 DongshanPI-D1s V853-Pro等开发板
Tina Linux(1)---系统篇
本人是嵌入式linux小白,之前尝试过多个平台的嵌入式linux学习,但是反反复复没有下去,导致后面再学的时候全部都要重头再来。这次痛定思痛,决定把笔记记录下来。但是为什么不用更好的专用的笔记软件的,比如OneNote之类的。实际上有考虑过,也查过很多的笔记软件资料,多多少少都存在一些问题,比如导出不方便,多平台兼容性问题之类的。所以,不如在网站上写成文章,这样不管换到什么地方都方便我阅读了。
tanxiaoming
2024/02/18
9840
Buildroot 用户手册 (中文)
Buildroot是一个工具,它使用交叉编译简化了为嵌入式系统构建完整Linux系统的过程,并实现了自动化。
全栈程序员站长
2022/11/01
10.4K0
浅谈内核的Makefile、Kconfig和.config文件
Linux内核源码文件繁多,搞不清Makefile、Kconfig、.config间的关系,不了解内核编译体系,编译修改内核有问题无从下手,自己写的驱动不知道怎么编进内核,不知道怎么配置内核,这些问题都和Makefile、Kconfig、.config有关,下面简单谈谈Makefile、Kconfig和.config。希望对你有启发。
韦东山
2020/09/30
4.1K0
浅谈内核的Makefile、Kconfig和.config文件
Tina_Linux_OTA_开发指南
OTA 是Over The Air 的简称,顾名思义就是通过无线网络从服务器上下载更新文件对本地系统或文件进行升级,便于客户为其用户及时更新系统和应用以提供更
韦东山
2023/02/25
4.7K0
OpenWrt make menuconfig 构建过程「建议收藏」
之前在《20190614 OpenWrt如何添加驱动以及应用程序 谢艺华-遗留问题解答》文档的问题7中,承诺要写一个关于make menuconfig的构架过程。于是就决定花点时间熟悉一下流程,方便以后的工作。
全栈程序员站长
2022/08/27
4.1K0
OpenWrt make menuconfig 构建过程「建议收藏」
【北京迅为】i.mx8mm嵌入式linux开发指南第四篇 嵌入式Linux系统移植篇第六十八章u-boot图形化配置
性能强:i.MX8MM处理器采用了先进的14LPC FinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。
用户10555372
2024/09/11
2560
【北京迅为】i.mx8mm嵌入式linux开发指南第四篇 嵌入式Linux系统移植篇第六十八章u-boot图形化配置
Tina_Linux_syslog_使用指南
syslog 可以说是一套统一管理系统日志的机制,尤其常用于记录守护进程的输出信息上。因为守护进程不存在控制终端,它的打印不能简单地直接输出到stdin 或
韦东山
2023/02/25
10.6K0
Tina_Linux_syslog_使用指南
嵌入式Linux利用busybox制作根文件系统
将busybox源码拷贝到linux主机并解压,同时新建一个rootfs文件夹,用于保存待会制作好的根文件系统。
知否知否应是绿肥红瘦
2025/02/19
6470
嵌入式Linux利用busybox制作根文件系统
Ubuntu20.04linux内核(5.4.0版本)编译准备与实现过程-编译过程(2)
Ubuntu20.04linux内核(5.4.0版本)编译准备与实现过程-编译前准备(1)
玖柒的小窝
2021/09/15
3.3K0
Ubuntu20.04linux内核(5.4.0版本)编译准备与实现过程-编译过程(2)
【openwrt】【编译问题】openwrt编译问题
在某次openwrt编译过程中出现了undefined reference to pthread_once错误,具体报错信息如下:
知否知否应是绿肥红瘦
2025/02/19
3070
linux menuconfig搜索,linux系统menuconfig解析
在对linux进行编译,常用的命令是make menuconfig,使用图形界面来对整个系统进行裁剪;这里主要就make menuconfig的执行过程进行解析。
全栈程序员站长
2022/09/02
1.3K0
详解Linux内核编译配置(menuconfig)、文件系统制作
分别是: 1、Makefile:分布在 Linux 内核源代码根目录及各层目录中,定义 Linux 内核的编译规则; 2、配置文件(config.in):给用户提供配置选择的功能; 3、配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供基于字符界面、基于 Ncurses 图形界面以及基于 Xwindows 图形界面的用户配置界面,各自对应于 Make config、Make menuconfig 和 make xconfig)。
全栈程序员站长
2022/08/10
8.3K0
详解Linux内核编译配置(menuconfig)、文件系统制作
鸿蒙系统开发教程_韦东山 3-1Kconfig介绍
对于各类内核,只要支持menuconfig配置界面,都是使用Kconfig。 在配置界面中,可以选择、设置选项,这些设置会保存在.config文件里。 Makefile会包含.config,根据里面的值决定编译哪些文件、怎么编译文件。
韦东山
2022/05/05
8710
鸿蒙系统开发教程_韦东山 3-1Kconfig介绍
buildroot是什么_yocto buildroot
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说buildroot是什么_yocto buildroot,希望能够帮助大家进步!!!
Java架构师必看
2022/09/18
1.5K0
buildroot是什么_yocto buildroot
全志V851SETinyVision异构视觉AI开发套件源码工具文档手册
SyterKit 是一个纯裸机框架,用于 TinyVision 或者其他 v851se/v851s/v851s3/v853 等芯片的开发板,SyterKit 使用 CMake 作为构建系统构建,支持多种应用与多种外设驱动。同时 SyterKit 也具有启动引导的功能,可以替代 U-Boot 实现快速启动(标准 Linux6.7 主线启动时间 1.02s,相较于传统 U-Boot 启动快 3s)。
阿志小管家
2024/05/28
5250
全志V851SETinyVision异构视觉AI开发套件源码工具文档手册
【openwrt】package介绍
OpenWrt 构建系统主要围绕package的概念展开。不管是什么软件,几乎都对应一个package。 这几乎适用于系统中的所有内容:HOST工具、交叉编译工具链、Linux 内核、内核mod、根文件系统和上层的应用软件。
知否知否应是绿肥红瘦
2025/02/19
2350
busybox配置telnetd
 busybox配置telnetd的问题 进入busybox源码文件夹,选择telnet,telnetd.后确保在ramdisk的sbin文件夹下存在inetd和in.telnetd或telned。在ramdisk中的mnt/etc文件夹中,确保存在文件fstab,service,inetd.conf,passwd文件确保fstab文件里存在none /dev/pts devpts mode=0622 0 0这一行确保services文件里存在 telnet 23/tcp 这一行确保inetd.conf中存在 telnet stream tcp nowait root /sbin/in.telnetd in.telnetd 确保passwd文件里存在root::0:0:root:/:/bin/sh,表示没有password的root帐号在kernal的代码中,通过makemenuconfig,在Character devices中选中Unix98 PTY support 在File systems中选中/dev/pts file system for Unix98 PTYs 退出后make zImage就可以在ramdisk的启动文件mnt/etc/init.d/rcS中,在mount –a的后面下一行添�inetd,使系统启动的时候就载入telnetd服新建inetd.conf文件,内容例如以下: # telnetstream tcp nowait root /usr/sbin/telnetd 执行inetd inetd.conf 在网上google了一天,终于能够确定要使用telnetd,内核必须配置下面项: dev/pts file system for Unix98 PTYs Unix98 PTY support (256) Maximum number of Unix98 PTYs in use (0-2048) 可我使用的2.6.14.1的内核,make menuconfig根本找不到这些配置项!那么内核是否支持这些选项呢?cat /proc/filesystems发现已支持devpts文件系统,那么uinx98 pty呢?查看内核的Kconfig和Makefile文件,发现仅仅要CONFIG_UNIX98_PTYS=y就会编译支持devpts文件系统和unix98的功能。而选择了嵌入式CPU内核会默认CONFIG_UNIX98_PTYS=y。所以我的内核已经支持telnet。 fstab文件里也载入了devpts文件系统: devpts /dev/pts devpts defaults 00 inittab文件里也指明了telnet的动作: tty0::askfirst:-/bin/sh 为什么还不行呢?困惑!后来细致想想,应该是设备文件节点的问题。我在开发板上移植2.6内核和驱动时一直没有使用devfs。由于devfs尽管方便,但同一时候也阻止了对设备文件节点的了解,且2.6内核已放弃了devfs。那么使用telnet应该创建那些文件节点呢?devpts会在/dev/pts下自己主动创建节点,还有什么呢?google了一会没有答案。后来忽然想起Kconfig文件里好象些说明,再去看一看,原来是这样: A pseudo terminal (PTY) is a software device consisting of two halves: a master and a slave. The slave device behaves identical to a physical terminal; the master device is used by a process to read data from and write data to the slave, thereby emulating a terminal. Typical programs for the master side are telnet servers and xterms. Linux has traditionally used the BSD-like names /dev/ptyxx for masters and /dev/ttyxx for slaves of pseudo terminals. This scheme has a number of problems. The GNU C library glibc 2.1 and later, however, supports the Unix98 naming standard: in order to acquire a pseudo terminal, a process opens /dev/ptmx; the number of the pseu
全栈程序员站长
2021/12/23
1.3K0
推荐阅读
相关推荐
如何添加APP到Buildroot里(以瑞芯微rv1126为例)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验