busybox的编译使用及安装

busybox是什么?

     (1)busybox是Linux上的一个应用程序(application),即只有一个ELF文件头。

     (2)它整合了许多Linux上常用的工具和命令(utilities), 如rm, ls, gzip, tftp等。对于这些工具和命令,busybox中的实现可能不是最全的,但却是最常用的,因此它的特点就是短小精悍,特别适合对尺寸很敏感的嵌入式系统。

     (3)busybox的官方网站是http://www.busybox.net/,在这里你可以找到与busybox相关的所有资料。

 

busybox编译和移植

     busybox 的编译与Linux内核的编译过程类似。从http://www.busybox.net/downloads/ 下载最新的源码,解压后,通过以下几步,即可完成busybox的编译和移植:

    (1)make xxxxxxconfig

         busybox提供了几种配置:defconfig (缺省配置)、allyesconfig(最大配置)、 allnoconfig(最小配置),一般选择缺省配置即可。

          这一步结束后,将生成.config

      (2)make menuconfig

         这一步是可选的,当你认为上述配置中还有不尽如意的地方,可以通过这一步进行微调,加入或去除某些命令。

         这一步实际上是修改.config

      (3)make CROSS_COMPILE=arm-linux-

          这一步就是根据.config,生成busybox,当然你也可以指定其他的编译器, 如arm-linux-gnueabi-。("make CROSS_COMPILE="将用gcc编译PC机上运行的busybox.

 

busybox的使用

    busybox的使用很简单,有以下三种方式:

    (1) busybox后直接跟命令,如

          busybox ls

          busybox tftp

     (2)  直接将busybox重命名,如

          cp busybox tftp

          cp busybox tar

          然后再执行tftp, tar  

     (3)创建符号链接(symbolic link), 如

          ln -s busybox rm

          ln -s busybox mount

          然后就可以执行rm,mount等

         

busybox的安装

      以上三种方法中,第三种方法是最简洁最方便的,可是如果手工为busybox中每个命令都创建一个软链接,那是相当的费事。为此,busybox提供了一种自动方法:

      在busybox编译成功后,接着执行“make install”,则会产生一个_install目录,其中包含了busybox及每个命令的软链接。以后只要将这个目录拷贝到目标平台上就可以了。

 

========================================================

 

BusyBox制作根文件系统(rootfs)

一、系统环境:

1、操作系统:Ubuntu12.04

2、交叉编译工具:arm-linux-gcc4.4.3

3、busybox源码包:busybox-1.25.0.tar.bz2

 

二、制作rootfs

1、建立rootfs目录

本人在/home/zxx下建立rootfs目录

#mkdir rootfs

#cd rootfs

#mkdir root home bin sbin etc dev usr lib tmp mnt sys proc  //建立常用目录

#mkdir usr/lib usr/bin

#pwd

/home/zxx/rootfs

2、解压源码包:

#tar -jxvf busybox-1.25.0.tar.bz2

3、修改Makefile配置

进入busybox-1.25.0目录,修改Makefile文件如下:

ARCH ?= arm

CROSS_COMPILE ?= /usr/local/arm/4.4.3/bin/arm-linux- (与你自己主机的arm-linux-gcc安装目录一样)

4、编译BusyBox

 #make menuconfig

选择Busybox Settings--->Build Options--->,选择[*] Build Busybox as a static binary(no shared libs)

选择Busybox Settings ---> Installation Options --->BusyBox installation prefix(在里面输入BusyBox的安装目录,我是保存在/home/zxx/rootfs下)

Shells --->Choose your default shell (ash) --->  --- ash

保存并退出

5、编译安装

#make

#make install

6、把busybox源码目录下的etc的内容拷贝到rootfs目录下的etc下

# cd /home/zxx/rootfs/etc

# cp -a /home/zxx/Downloads/busybox-1.25.0/examples/bootfloppy/etc/* ./

7、从本机拷贝passwd、shadow、group文件

# cp /etc/passwd .

# cp /etc/shadow .

# cp /etc/group .

修改passwd文件,把第一行和最后一行的bash修改成ash。

8、修改初始化文件inittab和fstab

# vim inittab
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::restart:/sbin/init

tty2::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff –a

# vim fstab
proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
mdev /dev ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0

9、rootfs下lib的制作

将交叉编译环境下lib库拷贝到/rootfs/lib

#cd /home/zxx/rootfs/lib

#cp /usr/local/arm/4.4.3/arm-none-linux-gnueabi/sys-root/lib./

 

三、编译错误解决参考

1、make出现如下错误:

miscutils/nandwrite.c: In function 'nandwrite_main':

miscutils/nandwrite.c:151: error: 'MTD_FILE_MODE_RAW' undeclared (first use in this?function)

miscutils/nandwrite.c:151: error: (Each undeclared identifier is reported only once

miscutils/nandwrite.c:151: error: for each function it appears in.)

scripts/Makefile.build:197: recipe for target 'miscutils/nandwrite.o' failed

make[1]: *** [miscutils/nandwrite.o] Error 1

Makefile:742: recipe for target 'miscutils' failed

make: *** [miscutils] Error 2

 

解决办法:

MTD_FILE_MODE_RAW在/usr/include/mtd/mtd-abi.h中定义。将/usr/include/mtd/mtd-abi.h拷贝到busybox的include文件中。

#gedit miscutils/nandwrite.c 

修改头文件如下:

 #include "libbb.h"

#include "mtd-abi.h"

#include <mtd/mtd-user.h>

编译可以通过。

2、继续make,出现如下错误:

util-linux/blkdiscard.c: In function 'blkdiscard_main':

util-linux/blkdiscard.c:72: error: 'BLKSECDISCARD' undeclared (first use in this function)

util-linux/blkdiscard.c:72: error: (Each undeclared identifier is reported only once

util-linux/blkdiscard.c:72: error: for each function it appears in.)

scripts/Makefile.build:197: recipe for target 'util-linux/blkdiscard.o' failed

make[1]: *** [util-linux/blkdiscard.o] Error 1

Makefile:742: recipe for target 'util-linux' failed

make: *** [util-linux] Error 2

 

解决办法:

BLKSECDISCARD在/usr/include/linux/fs.h中定义,方法如上所述,将/usr/include/linux/fs.h拷贝到busybox的include文件中linux下。

#gedit util-linux/blkdiscard.c

修改内容如下:

#include <linux/fs.h>

编译通过。

到这里rootfs基本上已经制作出来,有些内容需要的,可根据自己rootfs的需要进行自己增加。最后将rootfs目录制作成镜像后,就可以烧写到开发板上了。
 

=========================================================

 

传统的嵌入式系统都是uboot+kernel+rootfs。其中最简单的rootfs就是ramfs+busybox+/dev + /etc + /lib。至于etc目录中的inittab和init.d/rcS这两个都是busybox中init程序分析的内容。如果本身没有busybox,其实也无所谓这两个脚本。

1、busybox就是普通的用户程序

    建议同学们可以用objdump看一下busybox,不管是静态编译还是动态编译,busybox只是一个简单的类hello_world程序。

2、所有的命令都指向busybox

    如果登录到嵌入式设备上,那么我们会发现其实所有命令指向的都是busybox这么一个程序。

3、第一个用户程序就是busybox

    在kernel返回用户侧运行的第一个程序,即/bin/init或者/sbin/init,其本身运行的还是busybox程序。

4、返回用户侧后,第一个c函数不是init_main

    之前说过,busybox就是普通的c代码,因此它的入口就是main函数、代码位于libbb目录下。只不过这个程序会判断argv[0]的数值,如果发现是init,那么会调用init_main,如果是cd,那么会调用cd_main,以此类推。

5、调试busybox

    调试busybox有很多办法。a、调试的时候一般静态编译busybox;b、如果是自己添加的命令,只要gdb server+gdb调试就可以了;c、如果是系统自带命令,不确认系统是否调用busybox,可以用打印或者点灯的方法来解决;d、如果以上方法都不合适,可以自己写一个init程序代替busybox,android开机后的第一个用户程序就是自己写的,也没有用busybox,问题不大。大家平时使用较多的ubuntu,它的启动程序也不是busybox,一般也是由sysvinit+systemd一起完成的。

6、过分夸大的busybox

    busybox只是rootfs的一个组成部分,没有busybox我们可以自己写一个简单的shell,这些问题都不大。特别是调试的时候,厘清drvier、busybox、script、rootfs问题的时候,常常需要我们自己手写init程序,这个时候如果对rootfs和busybox理解比较充分,调试就会变得很简单了。

 

Busybox创建nfs文件系统 1、解压busybox-1.19.4.tar.bz2 修改Makefilez中的ARCH和CROSS_COMPILE与本机的路径一致: CROSS_COMPILE ?= /opt/crosstool/bin/arm-s3c2410-linux-gnu- ... ARCH ?= arm 2、编译busybox。先make menuconfig,修改以下: Busybox Settings ---> Build Options ---> Build BusyBox as a static binary (no shared libs) //直接编译成静态库,省事点 (/opt/crosstool/bin/arm-s3c2410-linux-gnu-) Cross Compiler prefix //这里和Makefile里保持一致,应该写一处就行了 Installation Options ---> Don't use /usr //不用本机的目录 Shells ---> Choose your default shell (ash) ---> //这里选择shell为ash,应该是默认选中的 --- ash //把ash这档的选项全部选上 保存退出,直接make,make install。 3、用shell脚本创建根文件系统的目录结构,并在想要建立根文件系统的地方运行此脚本。我是用root用户登陆的,直接创建了设备节点。 [root@Sure root-s3c2410]# vim makedir.sh #!/bin/sh echo "makeing rootdir" mkdir rootfs cd rootfs echo "makeing dir: bin dev etc lib proc sbin sys usr" mkdir bin dev etc lib proc sbin sys usr #8 dirs mkdir usr/bin usr/lib usr/sbin lib/modules #Don't use mknod, unless you run this Script as mknod -m 600 dev/console c 5 1 mknod -m 666 dev/null c 1 3 echo "making dir: mnt tmp var" mkdir mnt tmp var chmod 1777 tmp mkdir mnt/etc mnt/jiffs2 mnt/yaffs mnt/data mnt/temp mkdir var/lib var/lock var/log var/run var/tmp chmod 1777 var/tmp echo "making dir: home root boot" mkdir home root boot echo "done" 执行这个sh: [root@Sure root-s3c2410]# sh makedir.sh 创建出一个主文件夹rootfs,里面有一批文件: [root@Sure rootfs]# ls bin boot dev etc home lib mnt proc root sbin sys tmp usr var 4、把busybox源码目录下的etc的内容拷贝到这里的etc下 [root@Sure rootfs]# cd etc/ [root@Sure etc]# cp -a /home/jacky/busybox-1.11.1/examples/bootfloppy/etc/* ./ 5、修改拷贝过来的profile文件 [root@Sure etc]# vim profile # /etc/profile: system-wide .profile file for the Bourne shells echo "Processing /etc/profile" # no-op # Set search library path echo " Set search library path" export LD_LIBRARY_PATH=/lib:/usr/lib # Set user path echo " Set user path" PATH=/bin:/sbin:/usr/bin:/usr/sbin export PATH # Set PS1 echo " Set PS1" HOSTNAME=`/bin/hostname` # 此处让shell提示符显示host名称的。是`,不是’,要注意 # 会在进入根系统后显示Jacky export PS1="\\e[32m[$USER@$HOSTNAME \\w\\a]\\$\\e[00;37m " # 此处\\e[32m是让后面的“[$USER@$HOSTNAME \\w\\a]”显示为绿色 # \\e[00是关闭效果 # \\e[05是闪烁 # 37m是让后面的显示为白色 # 多个命令可以;号隔开 echo "All done!" echo 6、修改初始化文件inittab和fstab [root@Sure etc]# vim inittab ::sysinit:/etc/init.d/rcS ::respawn:-/bin/sh ::restart:/sbin/init tty2::askfirst:-/bin/sh ::ctrlaltdel:/bin/umount -a -r ::shutdown:/bin/umount -a -r ::shutdown:/sbin/swapoff –a [root@Sure etc]# vim fstab proc /proc proc defaults 0 0 none /tmp ramfs defaults 0 0 mdev /dev ramfs defaults 0 0 sysfs /sys sysfs defaults 0 0 7、修改初始化的脚本文件init.d/rcS [root@Sure etc]# vim init.d/rcS #! /bin/sh echo "Processing etc/init.d/rc.S" #hostname ${HOSTNAME} echo " Mount all" /bin/mount -a echo " Start mdev...." /bin/echo /sbin/mdev > proc/sys/kernel/hotplug mdev -s echo "****************************************************" echo " RootFS by NFS, s3c2410" echo " Created by Jacky Xu @ 2008.7.13" echo " Enjoy it!!!" echo "****************************************************" echo 8、创建一个空的mdev.conf文件,在挂载根文件系统时会用到的 [root@Sure etc]# touch mdev.conf 9、从本机拷贝passwd、shadow、group文件。 [root@Sure etc]# cp /etc/passwd . [root@Sure etc]# cp /etc/shadow . [root@Sure etc]# cp /etc/group . 修改passwd文件,把第一行和最后一行的bash修改成ash。 10、把busybox默认安装目录中的文件全部复制到这里的rootfs中。会发现多了linuxrc -> bin/busybox文件,这是挂载文件系统需要执行的。 [root@Sure etc]# cd .. [root@Sure rootfs]# cp -Rfv /home/jacky/busybox-1.11.1/_install/ ./ OK,以上用busybox创建了一个基本的文件系统。
BusyBox 是一个集成了一百多个最常用 Linux 命令和工具(如 ash、awk、sed、grep、mount 等)的单一可执行文件。它非常适合用于嵌入式系统,因为它的体积小且功能强大。编译 BusyBox 可以根据需要进行配置和裁剪,以适应特定的需求。以下是编译 BusyBox 的基本步骤: 1. **获取源码**: 首先,从官方网站或 Git 仓库下载 BusyBox 的源码包。 ```bash wget https://busybox.net/downloads/busybox-<version>.tar.bz2 tar -xvjf busybox-<version>.tar.bz2 cd busybox-<version> ``` 2. **配置**: 使用 `make menuconfig` 命令进入配置界面,根据需要进行配置。 ```bash make menuconfig ``` 在配置界面中,可以选择需要编译的命令和功能。 3. **编译**: 配置完成后,使用 `make` 命令进行编译。 ```bash make ``` 编译完成后,会生成一个 `busybox` 可执行文件。 4. **安装**: 将编译好的 `busybox` 文件安装到目标系统的目录中,通常是 `/usr/bin` 或 `/bin`。 ```bash make install ``` 这将把 `busybox` 文件和相关符号链接安装到指定的目录中。 5. **部署**: 将编译好的 BusyBox 部署到目标设备上,可以通过挂载文件系统或使用其他传输方式。 6. **测试**: 在目标设备上测试 BusyBox 的功能,确保所有命令都能正常工作。 ```bash # 示例:编译安装 BusyBox wget https://busybox.net/downloads/busybox-<version>.tar.bz2 tar -xvjf busybox-<version>.tar.bz2 cd busybox-<version> make menuconfig make make install ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值