七库下载 手游攻略 手游攻略 busybox报错,busybox ls

busybox报错,busybox ls

时间:2024-03-30 22:46:11 来源:头条 浏览:0

BusyBox 的诞生BusyBox 最初是由Bruce Perens 于1996 年为Debian GNU/Linux 安装盘编写的。目标是在软盘上创建可引导的GNU/Linux 系统,可用作安装盘和救援盘。一张软盘大约可以存储1.4 到1.7 MB 的内容,这并没有为Linux 内核和相关用户应用程序留下太多空间。 BusyBox 是一款集成了300 多种最常用Linux 命令和工具的软件。 BusyBox 包括简单的工具,如ls、cat 和echo,以及更大、更复杂的工具,如grep、find、mount 和telnet。有人称BusyBox 为Linux 工具中的瑞士军刀。简单来说,BusyBox是一个大工具箱,集成并压缩了很多Linux工具和命令,甚至还包括Android系统内置的shell。 BusyBox 揭示了一个事实,即许多标准Linux 工具可以共享许多通用元素。例如,许多基于文件的工具(例如grep 和find)需要代码来搜索目录中的文件。将这些工具组合成可执行程序可以使可执行程序更小,因为它们可以共享相同的元素。实际上,BusyBox 可以将大约3.5MB 的工具包装成大约200KB。这为使用Linux 的可启动磁盘和嵌入式设备提供了更多功能。 BusyBox 适用于Linux 内核版本2.4 和2.6。

BusyBox 如何工作?为了使一个可执行程序看起来像许多可执行程序,BusyBox 开发了一项很少使用的功能,用于传递给C 主函数的参数。回想一下,C 语言main 函数的定义如下。

int main( int argc, char *argv[] ) 在这个定义中,argc 是传递的参数数量(参数个数),argv 是一个字符串数组,表示从命令行传递的参数(参数向量)。 argv 的索引0 是从命令行调用的程序的名称。下面所示的简单C 程序显示了对BusyBox 的调用。这只是打印argv 向量的内容。

//test.c#include int main( int argc, char *argv[] ){ int i; for (i=0 ; i argc ; i++) { printf(\'argv[%d]=%s\n\ ', i, argv[i]); } return 0;} 当你调用这个程序时,你会注意到调用的第一个参数是程序的名称。您可以重命名该可执行程序,当您再次调用它时,您将获得该程序的新名称。此外,您可以创建指向可执行程序的符号链接,并且当您运行符号链接时,会显示符号链接的名称。使用新命令更新BusyBox 后的命令测试:

$ gcc -Wall -o test test.c$ ./test arg1 arg2argv[0]=./testargv[1]=arg1argv[2]=arg2$ mv 测试newtest$ ./newtest arg1argv[0]=./newtestargv[ 1]=arg1$ ln -s newtest linktest$ ./linktest argargv[0]=./linktestargv[1]=argBusyBox 使用符号链接使一个可执行程序看起来像多个程序。这样就为BusyBox中包含的每个工具创建了一个符号链接,这些符号链接可以用来调用BusyBox。然后BusyBox 可以通过argv[0] 调用内部工具。

配置和编译BusyBox BusyBox的最新版本可以从BusyBox官方网站下载。与大多数开源程序一样,它以压缩tarball 的形式发布。您可以使用以下命令将其转换为源代码树。 (如果您下载的版本不是1.1.1,请在此命令中使用适当的版本号以及特定于此版本号的命令。):

$ tar xvfzbusybox-1.1.1.tar.gz 结果,会创建一个名为busybox-1.1.1 的目录,其中包含BusyBox 源代码。要编译默认配置(其中包括禁用调试的几乎所有内容),请使用defconfig make 目标。编译默认的BusyBox 配置。

$ cdbusybox-1.1.1$ make defconfig$ make 的结果是一个相当大的BusyBox 映像,但这只是开始使用它的最简单方法。直接调用这个新图像将生成一个简单的帮助页面,其中包含当前配置的命令。要测试此图像,您还可以使用要运行的命令调用BusyBox,并查看BusyBox 命令运行以及BusyBox 内的Ash shell。

$ ./busybox pwd/usr/local/src/busybox-1.1.1$ ./busybox ash/usr/local/src/busybox-1.1.1 $ pwd/usr/local/src/busybox-1.1.1/usr /local/src/busybox-1.1.1 $ exit$ 在这个例子中,我们调用了pwd(打印工作目录)命令,使用BusyBox进入Ash shell,在ash中调用pwd。如果您正在构建有特殊要求的嵌入式设备,您可以使用menuconfig make target 手动配置BusyBox 的内容。如果您熟悉Linux 内核编译过程,您会注意到menuconfig 与用于配置Linux 内核内容的目标相同。事实上,它们都使用相同的基于ncurses 的应用程序。手动配置允许您指定要包含在最终BusyBox 映像中的命令。另外,配置BusyBox环境,例如国家安全局(NSA)的安全增强Linux(SELinux),使用哪些编译器(用于嵌入式环境中的交叉编译),并静态编译BusyBox。您还可以指定是否或动态编译。图1所示为menuconfig主界面。在这里,我们回顾一下可以为BusyBox 配置的不同类型的应用程序(小程序)。

要手动配置BusyBox,请使用以下命令:

$ make menuconfig$ make 这将为您提供一个可以称为BusyBox 的二进制文件。下一步是围绕BusyBox 构建一个环境,包括将标准Linux 命令重定向到BusyBox 二进制文件的符号链接。只需使用以下命令即可完成此过程:

$ make install 默认情况下,这会创建一个包含基本Linux 环境的新本地子目录_install。该根目录包含链接到BusyBox 的linuxrc 程序。 linuxrc 程序在构建安装盘或救援盘(允许预模块化引导)时非常有用。此根目录还有一个/sbin 子目录,其中包含操作系统二进制文件。还有一个包含用户二进制文件的/bin 目录。如果您正在构建软盘发行版或嵌入式初始RAM 磁盘,则可以将此_install 目录迁移到您的目标环境。您还可以使用make 程序的PREFIX 选项将安装目录重定向到另一个位置。例如,以下命令使用/tmp/newtarget 根目录而不是./_install 目录安装这些符号链接。

$ make PREFIX=/tmp/newtarget install install 使用make target 创建的符号链接来自busybox.links 文件。该文件是在编译BusyBox 时创建的,包含已配置命令的列表。安装程序会检查busybox.links 文件以确定要创建哪些符号链接。还可以使用BusyBox 在运行时动态创建到BusyBox 的命令行链接。可以使用CONFIG_FEATURE_INSTALLER 选项启用此功能,该选项可以在运行时执行,如下所示:

$ ./busybox --install -s$-s 选项强制创建这些符号链接(否则将创建硬链接)。要使用此选项,系统上必须存在/proc 文件系统。

BusyBox 编译选项BusyBox 包含多个编译选项,可帮助您编译和调试成功的BusyBox。

表1. BusyBox 提供的一些make 选项定义配置时,您只需键入make 即可实际编译BusyBox 二进制文件。例如,要为所有应用程序编译BusyBox,请运行以下命令:

$ make allyesconfig$ make$BusyBox 命令支持的选项

BusyBox 命令不支持所有可用选项,但包括常用选项。如果您需要了解命令支持哪些选项,可以使用--help 选项调用该命令。

$ ./busybox wc --helpBusyBox v1.1.1 (2006.04.09-15:27+0000) 多调用binaryUsage: wc [OPTION]. [FILE].设置每个文件的行数、字数和字节数。 输出。如果指定了多个文件,则为总行数。如果未指定文件,则读取标准输入。选项: -c 打印字节数。 -l 输出换行符的数量。 -L 打印最长行的长度。 -w 输出字数。 $这些特定数据仅在启用CONFIG_FEATURE_VERBOSE_USAGE 选项时才可用。如果没有此选项,您将无法获取此详细数据,但它会为您节省大约13 KB 的空间。向BusyBox 添加新命令由于其定义明确的架构,向BusyBox 添加新命令非常容易。第一步是选择新命令的源代码位置。根据命令的类型(网络、shell 等),您要选择与其他命令一致的位置。这很重要,因为这个新命令最终将出现在menuconfig 的配置菜单中(在下面的示例中为“其他实用程序”菜单)。在此示例中,我将新命令命名为newcmd 并将其放置在./miscutils 目录中。这个新命令的源代码是:

#include \'busybox.h\'int newcmd_main( int argc, char *argv[] ){ int i; printf(\'newcmdknown:\n\'); for (i=0 ; i argc ; i++) { printf (\'arg[%d]=%s\n\', i, argv[i]); } return 0;} 然后将此新命令的源代码添加到所选子目录.in 中的Makefile 中。在本例中,我更新了./miscutils/Makefile.in 文件。按字母顺序添加新命令以保持与现有命令的一致性。

MISCUTILS-$(CONFIG_MT) +=mt.oMISCUTILS-$(CONFIG_NEWCMD) +=newcmd.oMISCUTILS-$(CONFIG_RUNLEVEL) +=runlevel.o 接下来,再次更新./miscutils 目录中的配置文件,创建新的命令允许它被执行。将显示要配置的过程。该文件名为Config.in,新命令按字母顺序添加。

config CONFIG_NEWCMD bool \'newcmd\'default n help newcmd 是一个新的测试命令。该结构定义了新的配置项(通过config 关键字)和配置选项(CONFIG_NEWCMD)。对配置的菜单属性使用布尔值,因为可以启用或禁用新命令。默认情况下禁用此命令(n 表示否)。您可以在末尾添加简短的帮助说明。您可以在源树中的./scripts/config/Kconfig-language.txt 文件中查看完整的配置语法。接下来,您需要更新./include/applets.h 文件以包含此新命令。将以下行添加到该文件中:请务必按字母顺序排列它们。维持这个秩序非常重要。如果不维护的话,命令将找不到。将命令添加到applet.h。

USE_NEWCMD(APPLET(newcmd, newcmd_main, _BB_DIR_USER_BIN, _BB_SUID_NEVER)) 这定义了Busybox 源代码中的命令名称(newcmd) 及其函数名称(newcmd_main)。这个新命令(在本例中,它位于/usr/bin 目录中),最后是该命令是否具有设置用户ID 的权限(在本例中为否)。倒数第二步是将详细的帮助信息添加到./include/usage.h 文件中。从这个示例文件中可以看出,使用信息可以非常详细。在本例中,我只是添加了一些信息,以便可以编译新命令。将帮助信息添加到uses.h。

#define newcmd_trivial_usage \'None\'#define newcmd_full_usage \'None\'最后一步是启用新命令(通过make menuconfig,然后在“其他实用程序”菜单中启用此选项),使用make 编译BusyBox。您可以使用新的BusyBox 测试这个新命令。

$ ./busybox newcmd arg1newcmdknown:arg[0]=newcmdarg[1]=arg1$ ./busybox newcmd --helpBusyBox v1.1.1 (2006.04.12-13:47+0000) 多调用binaryUsage: newcmd NoneNone 以上,由BusyBox 开发人员开发非常好,但是很容易扩展,工具是BusyBox。

结论BusyBox 是构建内存有限的嵌入式和基于软盘的系统的优秀工具。 BusyBox 是一款对于嵌入式系统非常有用的工具,它将许多必要的工具合并到一个可执行程序中,并允许它们共享代码的相同部分,从而显着减小其大小。值得您花时间和考虑。

标题:busybox报错,busybox ls
链接:https://www.7kxz.com/news/gl/18725.html
版权:文章转载自网络,如有侵权,请联系删除!
资讯推荐
更多
天地劫幽城再临归真4-5攻略:第四章归真4-5八回合图文通关教学

天地劫幽城再临归真4-5攻略:第四章归真4-5八回合图文通关教学[多图],天地劫幽城再临归真4-5怎么样八回合内通

2024-03-30
航海王热血航线艾尼路怎么玩?艾尼路加点连招攻略大全

航海王热血航线艾尼路怎么玩?艾尼路加点连招攻略大全[多图],航海王热血航线艾尼路怎么加点?艾尼路怎么连招?关

2024-03-30
坎公骑冠剑国际服怎么玩?国际服新手攻略

坎公骑冠剑国际服怎么玩?国际服新手攻略[多图],坎公骑冠剑国际服的玩法是什么样的?关于游戏中的一些新手玩法

2024-03-30
王者荣耀鸿运6+1地狱之眼怎么抽?鸿运抽奖地狱之眼概率获取攻略

王者荣耀鸿运6+1地狱之眼怎么抽?鸿运抽奖地狱之眼概率获取攻略[多图],王者荣耀鸿运抽奖活动的奖池中还有传说

2024-03-30