目录
使用 make defconfig 生成.config文件,并执行make all
make install CONFIG_PREFIX=/mh/tools
版本和下载方式
下载路径:https://busybox.net/
版本为1.36.1
压缩包:busybox-1.36.1.tar.bz2
解压
Linux下的解压指令:tar -jxvf busybox-1.36.1.tar.bz2
解压出来以后目录如下:
1、README文件
有关复制和使用的详细信息,请参阅许可证文件。
有关如何构建的说明,请参阅INSTALL文件。
----------------
什么是busybox:
BusyBox将许多常见UNIX实用程序的微小版本组合成一个小型可执行文件。它为您通常在bzip2、coreutils、dhcp、diffutils、e2fsprogs、file、findutils、gawk、grep、inetutils、less、modutils、net-tools、procps、sed、shadow、sysklogd、sysvinit、tar、util-linux和vim中找到的大多数实用程序提供了最低限度的替换。BusyBox中的实用程序通常比其功能齐全的同类工具有更少的选择;
然而,所包含的选项提供了预期的功能,其行为与较大的对应选项非常相似。
BusyBox在编写时考虑到了大小优化和有限的资源,既可以生成小型二进制文件,也可以减少运行时内存的使用。
Busybox也是非常模块化的,因此您可以在编译时轻松地包含或排除命令(或功能)。这使得定制嵌入式系统变得容易;要创建一个工作系统,只需添加/dev/etc和一个Linux内核。Busybox(通常与uClibc一起使用)也被用作“瘦客户端”桌面系统、实时CD发行版、救援磁盘、安装程序等的组件。
BusyBox为任何小型系统提供了一个相当完整的POSIX环境,包括嵌入式环境和更全面的空间系统。Busybox正在缓慢地实现完整的Single Unix Specification V3(http://www.opengroup.org/onlinepubs/009695399/),但还没有(由于大小原因,可能最多支持UTF-8进行国际化)。我们也有兴趣通过Linux测试项目(http://ltp.sourceforge.net).
----------------
使用busybox:
BusyBox是非常可配置的。这允许您只包含所需的组件和选项,从而减少二进制大小。运行“make config”或“make menuconfig”以选择要启用的功能。(有关更多命令,请参阅“make help”。)
busybox的行为由其调用的名称决定:作为“cp”,它的行为类似于cp,作为“sed”,其行为类似于sed,依此类推。作为“busybox”,它将第二个参数作为要运行的小程序的名称(即 “./busybox ls -l /proc”)。
“standalone shell”模式是尝试busybox的一种简单方法;这是一个命令shell,它调用内置的applet,而不需要将它们安装在路径中。(请注意,如果从引导软盘或chroot环境中进行测试,则需要安装/proc。)
该构建会自动生成一个文件“busybox.links”,“make install”使用该文件为所有已编译的命令创建指向busybox二进制文件的符号链接。这使用CONFIG_PREFIX环境变量指定安装位置,并根据配置首选项安装硬链接或符号链接。(您也可以在“applets/install.sh”中手动运行安装脚本)。
----------------
下载当前源代码:
最新发布版本的源代码以及每日快照始终可以从下面地址下载
http://busybox.net/downloads/
您可以在线浏览最新的源代码和更改历史记录。
http://git.busybox.net/busybox/
可以匿名访问GIT。有关说明,请查看:
http://www.busybox.net/source.html
对于那些积极参与并希望签入文件的人,请参阅:
http://busybox.net/developer.html
开发人员还有一个漏洞和补丁跟踪系统(https://bugs.busybox.net)尽管将bug and patch发布到邮件列表通常是一种更快的修复方法,而且所发生的事情的完整存档是git changelog。
注意:如果要在busybox环境中编译busybox,则必须选择CONFIG_DESKTOP。
----------------
获得帮助:
当你发现自己需要帮助时,你可以在上查看busybox邮件列表档案 http://busybox.net/lists/busybox/ 如果你感兴趣,甚至可以加入邮件列表。
----------------
Bugs:
如果您发现错误,请向busybox邮件列表提交详细的错误报告,网址为busybox@busybox.net.一个写得好的bug报告应该包括一个shell会话的记录,该会话演示了不良行为,并使其他人能够在自己的机器上复制bug。以下是这样一个例子:
to: busybox@busybox.net
from: diligent@testing.linux.org
subject: /bin/date doesn't work
package: busybox
version: 1.00
when i execute busybox 'date' it produces unexpected results. with gnu date i get the following output:
$ date
fri oct 8 14:19:41 mdt 2004
but when i use busybox date i get this instead:
$ date
illegal instruction
i am using debian unstable, kernel version 2.4.25-vrs2 on a netwinder,and the latest uclibc from cvs.
-diligent
注意仔细描述和使用的示例不仅显示了busybox的功能,还显示了等效应用程序的功能(或指向相关标准的文本)。缺少这些细节的错误报告可能永远无法修复。。。感谢您的理解。
----------------
便携性:
Busybox是在Linux 2.4和2.6内核上开发和测试的,使用gcc编译(3.4及更高版本中的每次单元优化值得升级,但旧版本应该可以使用),并链接到uClibc(0.9.27或更高版本)或glibc(2.2或更高版本)。在这种环境下,busybox的所有功能都应该能正常工作,如果有任何问题,我们都会知道,以便进行修复。
还有许多其他环境,busybox可以在其中构建和运行得很好。我们只是不测试它们。由于busybox由大量或多或少独立的小程序组成,因此可移植性是一个哪些功能在哪里工作的问题。一些busybox小程序(如cat和rm)是高度可移植的,几乎可以在任何地方工作,而另一些(如insmod和losetup)则需要具有最新C库的最新Linux内核。
对于任何给定的配置,Linux和glibc的早期版本可能工作,也可能不工作。Linux 2.2或更早版本应该基本上可以工作(在mount.c之类的东西中仍然有一些支持代码),但这不再是定期测试的,而且本质上不支持某些功能(如长文件和 --bind mounts)。glibc 2.0和2.1也是如此:使用这种旧的基础设施会带来更高的测试和调试负担。(busybox开发人员对支持这些旧版本不太感兴趣,但可能会接受小型的自包含补丁来解决简单的问题。)
不建议使用某些环境。uClibc的早期版本有缺陷,缺少许多功能:升级。不支持针对libc5或dietlibc进行链接,busybox开发人员对此也不感兴趣。(第一个已经过时,与uClibc相比没有已知的大小或功能优势,第二个有已知的漏洞,其开发人员一直拒绝修复。)古老的Linux内核(2.0.x及更早版本)同样令人不感兴趣。
理论上,可以在其他操作系统(如MacOS X、Solaris、Cygwin或BSD Fork Du Jour)下使用Busybox。这通常同时涉及不同的内核和不同的C库。虽然应该可以移植大部分代码以在其中一个环境中工作,但如果它不能开箱即用,也不要感到惊讶。如果你喜欢这类事情,从小事开始(只选择几个小程序),然后一路向上。
2005年,Shaun Jackman将busybox移植到了newlib和libgloss的组合中,他的一些补丁已经集成。
----------------
支持的硬件:
BusyBox通常将构建在gcc支持的任何体系结构上。我们同时支持32位和64位平台,以及big和little-endian系统。
在2.4 Linux内核下,内核模块加载是以特定于平台的方式实现的。据报道,Busybox的insmod实用程序可在ARM、CRIS、H8/300、x86、ia64、x86_64、m68k、MIPS、PowerPC、S390、SH3/4/5、Sparc和v850e下工作。其他任何事情都可能行不通。
2.6内核的模块加载机制要通用得多,我们认为2.6.x内核模块加载支持应该适用于内核支持的所有架构。
----------------
请将建议、错误报告、侮辱和贿赂反馈到busybox邮件列表:
busybox@busybox.net
或者维护者:
Denys Vlasenko
<vda.linux@googlemail.com>
2、Makefile文件
make help
执行下make help 看看指令输出:
$ make help
Cleaning:
clean - 删除生成创建的临时文件
distclean - 删除所有非源文件(包括.config)
doc-clean - 删除所有生成的文档
Build:
all - 可执行文件和文档
busybox - the swiss-army 的可执行文件
doc - docs/BusyBox.{txt,html,1}
html - 创建基于html的交叉引用
Configuration:
allnoconfig - 禁用.config中的所有符号
allyesconfig - 启用.config中的所有符号(参见defconfig)
config - 基于文本的配置器(最后的手段)
defconfig - 将.config设置为最大通用配置
menuconfig - 交互式的基于诅咒的配置器
oldconfig - 解析.config中任何未解析的符号
android2_defconfig - Build for android2
TEST_noprintf_defconfig - Build for TEST_noprintf
cygwin_defconfig - Build for cygwin
TEST_nommu_defconfig - Build for TEST_nommu
android_defconfig - Build for android
android_ndk_defconfig - Build for android_ndk
android_502_defconfig - Build for android_502
TEST_rh9_defconfig - Build for TEST_rh9
freebsd_defconfig - Build for freebsd
Installation:
install - 将busybox安装到CONFIG_PREFIX中
uninstall
Development:
baseline - 为 bloatcheck 创建 busybox_old。
bloatcheck - 显示新旧版本之间的大小差异
check - 运行所有小程序的测试套件
checkhelp - 检查Config.in中是否缺少帮助条目
randconfig — 生成随机配置
release - 创建一个分发包
sizes - 显示所有启用busybox符号的大小
objsizes - 显示每个构建的 .o对象的大小
bigdata - 显示数据对象,最大的先显示
stksizes - 首先显示堆栈用户,最大的用户
Makefile文件先挖个坑
Makefile的坑等后面的Makefile语法专栏再填。
简单说就是,Makefile中都是编译相关的参数和配置,以及一些其他变量的记录
3、INSTALL 文件
Building:
=========
BusyBox的构建过程类似于Linux内核的构建:
make menuconfig # 创建一个名为".config"的文件
make # 创建"busybox"可执行文件
make install # 或者 make CONFIG_PREFIX=/path/from/root install
输入以下命令可以获得配置和安装选项的完整列表:
make help
Quick Start:
============
第一次尝试BusyBox的简单方法是,不需要安装它,启用所有功能,然后使用 "standalone shell" 模式和空白命令$PATH。
要启用所有功能,可以使用 "make defconfig" ,它会生成最大的通用配置。它是allyesconfig减去调试选项、可选打包选项和一些需要使用额外配置的专用功能。然后启用"standalone shell"功能:
make defconfig
make menuconfig
# select Busybox Settings
# then General Configuration
# then exec prefers applets
# exit back to top level menu
# select Shells
# then Standalone shell
# exit back to top level menu
# exit and save new configuration
# OR
# use these commands to modify .config directly:
sed -e 's/.*FEATURE_PREFER_APPLETS.*/CONFIG_FEATURE_PREFER_APPLETS=y/' -i .config
sed -e 's/.*FEATURE_SH_STANDALONE.*/CONFIG_FEATURE_SH_STANDALONE=y/' -i .config
make
PATH= ./busybox ash
Standalone shell模式导致busybox的内置命令shell直接运行任何内置的busybox小程序,而不需要寻找该名称的外部程序。提供一个空的命令路径(如上所示)意味着busybox只能找到内置的命令。
请注意,Standalone shell需要适当地设置 CONFIG_BUSYBOX_EXEC_PATH,这取决于 /proc/self/exe 是否可用。如果没有/proc,则将配置选项指向busybox二进制文件的位置,通常是/bin/busybox。
另一种解决方案是给内核打补丁(参见 examples/linux-*_proc_self_exe.patch),使("/proc/self/exe")始终工作。
配置Busybox:
====================
Busybox针对大小进行了优化,但是启用全套功能仍然会导致相当大的可执行文件——在静态链接时超过1兆字节。为了节省空间,busybox可以配置为每个环境只需要一组applet。禁用所有小程序的最小配置生成一个4k可执行文件。(它没什么用,但体积很小。)
手动配置器 "make menuconfig" 修改现有配置。(对于没有ncurses的系统,请尝试 "make config"。)
最有趣的两个启动配置是 "make allnoconfig" (禁用所有配置,只添加所需配置)和"make defconfig"(启用所有配置,删除不需要的配置)。
如果menuconfig在没有现有配置的情况下运行,make defconfig将首先运行以创建一个已知的起点。
其他启动配置(主要用于测试目的)包括"make allbareconfig"(启用所有小程序,但禁用所有可选功能),"make allyesconfig"(完全启用包括调试功能在内的所有功能),和 "make randconfig"(生成随机配置)。configs/目录包含许多以_defconfig结尾的额外配置文件,这些文件在特定情况下很有用。"make help"栏目会列出它们。
配置BusyBox会生成一个".config"文件。可以保存以备将来使用。运行"make oldconfig"从旧版本的busybox中获取最新的.config文件。
Busybox安装:
===================
Busybox是一个可执行文件,它的行为类似于许多不同的命令,Busybox使用调用它的名称来确定所需的行为。(试试 "mv busybox ls" 然后是 "./ls -l".)
安装busybox包括为busybox中启用的每个小程序创建指向busybox二进制文件的符号链接(或硬链接),并确保这些符号链接位于shell命令$PATH中。
运行"make install"将创建这些符号链接,而运行"make install-hardlinks"将创建硬链接(在inode数量有限的系统上很有用)。这个安装过程使用文件“busybox。(由make创建),其中包含已启用的小程序列表和安装它们的路径。
安装busybox的链接并不总是必要的。特殊的applet名称 "busybox" (或者带有任何可选的后缀,例如"busybox-static")使用第一个参数来确定哪一个applet的行为,
例如 "./busybox cat LICENSE".(不带参数运行busybox小程序会列出所有启用的小程序。)独立shell也可以在没有链接的情况下调用文件系统中其他名称下的busybox小程序。您还可以将独立安装功能配置到busybox基础applet中,然后在运行时使用"busybox --install"(用于硬链接)或 "busybox --install -s" (用于符号链接)安装此类链接。
如果您启用了busybox共享库功能(libbusybox.so),并且希望在不安装的情况下运行测试,请在运行可执行文件时相应地设置您的LD_LIBRARY_PATH:
LD_LIBRARY_PATH=`pwd` ./busybox
Building out-of-tree:
=====================
默认情况下,BusyBox构建将其临时文件放在源代码树中。
从只读源代码树构建,或者从同一个源目录构建多个配置,需要能够将临时文件放在其他地方。
要使用tree构建,可以cd到一个空目录并从那里配置busybox:
make KBUILD_SRC=/path/to/source -f /path/to/source/Makefile defconfig
make
make install
或者,在配置步骤中使用 O=$BUILDPATH 选项(带有绝对路径),如下所示:
make O=/some/empty/directory allyesconfig
cd /some/empty/directory
make
make CONFIG_PREFIX=. install
更多信息:
=================
在 "我如何开始使用busybox" 和 "我如何构建一个基于busybox的系统?" BusyBox FAQ可从http://www.busybox.net/FAQ.html获取
编译
目标是能编译出可执行的二进制文件。
make all
按照 make help 的说明,make all 指令能生成可执行文件和文档,我们先执行试试看
编译报错了:
(如果没有报错那么就会生成对应的可执行文件和文档吧,我没碰到其他情况,出问题解问题)
编译出错是因为新解压出来的包里没有 .config (配置)文件,按照报错的提示,需要使用下面指令中的一个来生成配置
make oldconfig
make menuconfig
make defconfig
先试下 make oldconfig指令
提示: 启用全功能桌面系统的兼容性(8kb) (desktop) [Y/n/?])(新)
提示:为罕见的极端情况(更大的代码)提供兼容的行为(EXTRA_COMPAT) [N/y/?])(新)
提示:构建Fedora分发版(FEDORA_COMPAT) [N/y/?])(新)
......
好家伙,按得手麻
产生问题:为啥有这么多要输入的?
解决问题:<因为指令理解错误,在没有.config文件的时候,这么用的话就是会有很多输入>
参考资料来源:make *config_make oldconfig && make prepare如何跳过-CSDN博客
关键信息:
make oldconfig和make config类似,但是它的作用是在现有的内核设置文件基础上建立一个新的设置文件,只会向用户提供有关新内核特性的问题,在新内核升级的过程 中,make oldconfig非常有用,用户将现有的配置文件.config复制到新内核的源码中,执行make oldconfig,此时,用户只需要回答那些针对新增特性的问题。
CTRL+C掉,C掉,第一次编译不需要一直按,换下一个指令
然后是 make defconfig 指令
执行以后,输出了大量的信息,看起来是按照默认配置把.config文件配完了
查看下是否有 .config 文件生成,使用指令 ls -a ,因为以.开头的文件使用 ls 指令可能看不到
我并不确定这个.config文件是因为我执行了 make defconfig 才生成的,所以我得确认下
使用指令 ls -l --time=status .config
可以看到.config文件的创建时间是4月9号的11:19 ,而其他文件则为4月8号的11:05,确认是因为执行配置执行才生成的,ok。
综上,使用 make defconfig 指令是会生成.config文件的
确认了,刚解压出来的文件中确实是没有.config文件的
啥情况就产生了这个文件,不会是默认把所有的特性都设置了yes以后生成的文件吧?
产生问题:make defconfig 生成的.config文件从哪儿来的?
解决问题:<生成的.config是默认的缺省配置,并不是拷贝的哪个文件,至少不是原始解压包解出来的某个文件>
参考资料来源: https://blog.51cto.com/u_4018548/6421115
关键信息:
首先通过make xxx_defconfig,生成最开始的.config,相当于把XXX_defconfig 文件复制为.config 文件,其中 defconfig 是最小的 config 项,kermel编译会根据.config 文件去编译驱动情况,加载过改指令后,后面的 make menuconfig 就会基于现在的.config 去配置 config ;
-------------------------------------------------------------------------------------------------------------------
新问题?
busybox里面有这么多xxx_defconfig,是从哪个来的呢?
答案: <我不知道,网上没搜出来>
可以曲线救国下,比对各个文件的MD5值,遗憾地发现,没有一个文件是一样的。
所以,综上,这个.config文件是一个执行以后会生成的缺省配置。
最后是 make menuconfig 指令
碰到问题1
执行后,指令报错
原因是没有curses.h文件
解决:
执行指令安装相关库即可解决
yum install ncurses-devel
碰到问题2
但是执行指令是会报错
解决:
问题解决资料来源:
CentOS8 yum install 报错: 为仓库‘appstream‘下载元数据失败_unit network.service could not be found-CSDN博客
#进入源目录把失效的源备份或直接删除:
cd /etc/yum.repos.d/
rm -rf ./*.repo
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
#建立新的元数据缓存
yum makecache
解决后,执行结果如下
几乎所有的配置都不熟悉,那么我们先试用默认的defconfig来编译
使用 make defconfig 生成.config文件,并执行make all
执行指令
make defconfig
make all
编译报错,信息如下,查看了下当前环境上确实没有 pod2html 这个指令
安装 pod2html - 执行指令:yum install perl-Pod-Html
安装成功以后,继续执行make all,成功
make install CONFIG_PREFIX=/mh/tools
在上层路径创建tools文件夹,然后安装busybox到上层文件夹的tools中
mkdir tools
cd busybox-1.36.1/
make install CONFIG_PREFIX=/mh/tools
至此,busybox安装完毕