曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 9232|回复: 0
打印 上一主题 下一主题

BusyBox 安装与添加新命令

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2011-3-1 00:56:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Busybox 主页:http://www.busybox.net/

默认情况下的编译:
$ make defconfig
$ make

测试生成的 busybox 程序:
$ ./busybox pwd
/home/beyes/tools/busybox-1.18.3
$ ./busybox ls /
bin         etc         lost+found  opt         sbin        sys         var
boot        home        media       proc        selinux     tmp
dev         lib         mnt         root        srv         usr

除了默认编译,还可以像编译 Linux 内核一样 make menuconfig 来进行手工配置:
$ make menuconfig
$ make
$ make install


完后,可以在源码目录下生成一个 _install 目录,该目录包含了 linux 的基本环境:
beyes@linux-kd1q:~/tools/busybox-1.18.3> ll _install/
total 12
drwxr-xr-x 2 beyes users 4096 2011-02-28 11:00 bin
lrwxrwxrwx 1 beyes users   11 2011-02-28 11:00 linuxrc -> bin/busybox
drwxr-xr-x 2 beyes users 4096 2011-02-28 11:00 sbin
drwxr-xr-x 4 beyes users 4096 2011-02-28 11:01 usr
在这个目录下,同样可以看到 /sbin /bin/ /usr 等根文件系统下所需的目录,在构建嵌入式初始 RAM 盘 (initramfs),可以将 _install 目录下的文件搬移到目标环境中。当然,对于不同体系结构的嵌入式环境,需要用交叉编译器和特定于目标体系结构且编译好了的 C 库 (glibc 或 uClibc) 来编译 Busybox 。

如果不想使用默认的 ./_install 目录,还可以在 make install 里指定别的路径,如:
$ make PREFIX=/tmp/busybox insall

busybox 中的命令并不是全功能命令,也就是说这些命令不支持标准命令里的所有选项,想了解 busybox 支持的命令所支持的选项,可以如下查询:
beyes@linux-kd1q:~/tools/busybox-1.18.3> ./busybox wget --help
BusyBox v1.18.3 (2011-02-28 10:58:22 EST) multi-call binary.

Usage: wget [-c|--continue] [-s|--spider] [-q|--quiet] [-O|--output-document FILE]
        [--header 'header: value'] [-Y|--proxy on/off] [-P DIR]
        [--no-check-certificate] [-U|--user-agent AGENT][-T SEC]  URL

Retrieve files via HTTP or FTP

Options:
        -s      Spider mode - only check file existence
        -c      Continue retrieval of aborted transfer
        -q      Quiet
        -P DIR  Save to DIR (default .)
        -T SEC  Network read timeout is SEC seconds
        -O FILE Save to FILE ('-' for stdout)
        -U STR  Use STR for User-Agent header
        -Y      Use proxy ('on' or 'off')
这个功能依赖于 FEATURE_MOUNT_VERBOSE 选项的支持,如果此选项不选,则无法像上面那样罗列出命令所支持的选项信息。

向 Busybox 中添加新的命令

Busybox 版本:1.18.3

在 busybox 的源码目录下,按照各个命令工具的各自的用途与应用目的而安排在相应的目录下,如网络相关的程序安排在 networking 里,和 shell 相关的安排在 shell 目录下,和杂项相关的安排在 miscutils 目录下等等。下面我们添加一个称为 hellobbox 的新命令到  miscutils 目录中。

程序的代码如下(将该程序的 C 代码放在 miscutils 目录下):
#include "busybox.h"

int hellobbox_main (int argc, char **argv)
{
         int i;
         printf ("hello busybox, arg list belowing:\n");
         for (i = 0; i < argc; i++) {
                 printf ("arg[%d] : %s\n", i, argv[i]);
         }

         return (0);
}

接着在配置文件里为这个程序添加一个入口,这样在 make menuconfig 时候就能看到此程序的配置项。将下面的代码添加到  miscutils/Config.src 中,注意要按照字母排列顺序:
[Plain Text] 纯文本查看 复制代码
config HELLOBBOX
        bool "hellobbox"
        default n
        help
          This is a test command


当我们在 menuconfig 里选中将这个命令编译时,我们还要引导 busybox 能够编译它,将下面的代码添加到 miscutils/Kbuild.src 中,注意要按照字母的顺序放置:
[Plain Text] 纯文本查看 复制代码
lib-$(CONFIG_HELLOBBOX)   += hellobbox.o


下一步,还要在  include/applets.src.h 中增加一个入口,在这里提供了可执行文件(软连接)创建在根文件系统的什么地方以及该命令的 SUID 权限相关的设定信息,将下面的代码同样按照字母顺序添加进去:
IF_HELLOBBOX(APPLET(hellobbox, _BB_DIR_BIN, _BB_SUID_DROP))
上面,第 1 个参数就是新增的命令名,也就是它能在命令行中 ./busybox hellobbox 这么用;
第 2 个参数定义这个命令(软连接)出现在根文件系统的哪个目录下,这里是 /bin 下;
第 3 个参数表示不检查 suid 权限。

最后,我们不打算在使用 --help 选项时打印出帮助信息,那么将以下定义设定在 include/usage.src.h 文件中:
#define hellobbox_trivial_usage "None"
#define hellobbox_full_usage "None"

所有的设置工作到此全部完成,现在重新 make menuconfig 配置一下,选定该命令:


然后检查命令是否添加成功:
beyes@linux-kd1q:~/tools/busybox-1.18.3/_install> ls bin/ |grep hello
hellobbox
已经在 _install/bin 目录下生成了该命令的软连接。

执行新增命令:
beyes@linux-kd1q:~/tools/busybox-1.18.3> ./busybox hellobbox are you ok
hello busybox, arg list belowing:
arg[0] : hellobbox
arg[1] : are
arg[2] : you
arg[3] : ok
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-19 18:50 , Processed in 0.076797 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表