busybox 安装配置

busybox 安装配置br/转自http://blog.csdn.net/denlee/archive/2008/04/06/2254192.aspxbr/   这几天在使用Busybox制作FS2410开发板的CRAMFS文件系统,由于开始下载的是Busybox1.10,每次下载到开发板中,然后启动总是出现”Failedtoexecute/linuxrc. Attemptingdefaults…“的错误。到网上查了大量的资料,并做了大量的实验,发现都不能成功。今天下午突然发现一个能够仿真arm的软件

大家好,欢迎来到IT知识分享网。

转自http://blog.csdn.net/denlee/archive/2008/04/06/2254192.aspx

   这几天在使用Busybox制作FS2410开发板的CRAMFS文件系统,由于开始 下载的是Busybox1.10,每次下载到开发板中,然后启动总是出现”Failed to execute /linuxrc.  Attempting defaults…“的错误。到网上查了大量的资料,并做了大量的实验,发现都不能成功。今天下午突然发现一个能够仿真arm的软件qemu,在Ubuntu中的安装方法:sudo apt-get install qemu,Busybox编译后,可以通过arm仿真来测试:qemu-arm ./busybox ls,如果成功,则会显示当前目录下的文件列表。我对Busybox1.10编译后的结果进行测试,发现出现错误:

 

qemu: unhandled CPU exception 0x8 – aborting
R00=001c596c R01=00000000 R02=001c5960 R03=00000001
R04=000cbf94 R05=00000000 R06=00000000 R07=00000000
R08=000cbfdc R09=000cbf94 R10=00000000 R11=00000000
R12=ffff0fff R13=b7d6c470 R14=000d4588 R15=ffff0fa0
PSR=20000010 –C- A usr32 ffff0fa0
s00=00000000(       0) s01=00000000(       0) d00=0000000000000000(       0)
s02=00000000(       0) s03=00000000(       0) d01=0000000000000000(       0)
s04=00000000(       0) s05=00000000(       0) d02=0000000000000000(       0)
s06=00000000(       0) s07=00000000(       0) d03=0000000000000000(       0)
s08=00000000(       0) s09=00000000(       0) d04=0000000000000000(       0)
s10=00000000(       0) s11=00000000(       0) d05=0000000000000000(       0)
s12=00000000(       0) s13=00000000(       0) d06=0000000000000000(       0)
s14=00000000(       0) s15=00000000(       0) d07=0000000000000000(       0)
s16=00000000(       0) s17=00000000(       0) d08=0000000000000000(       0)
s18=00000000(       0) s19=00000000(       0) d09=0000000000000000(       0)
s20=00000000(       0) s21=00000000(       0) d10=0000000000000000(       0)
s22=00000000(       0) s23=00000000(       0) d11=0000000000000000(       0)
s24=00000000(       0) s25=00000000(       0) d12=0000000000000000(       0)
s26=00000000(       0) s27=00000000(       0) d13=0000000000000000(       0)
s28=00000000(       0) s29=00000000(       0) d14=0000000000000000(       0)
s30=00000000(       0) s31=00000000(       0) d15=0000000000000000(       0)
FPSCR: 00000000
qemu: uncaught target signal 6 (Aborted) – exiting

说明,所编译得到的busybox不能使用在arm处理器,由于时间关系就放弃了使用Buxybox1.10版本。后又尝试了Busybox1.5.x,发现有同样的问题。(后来和1.00版本对照,发现去掉了对devfs的支持)

于是使用FS2410开发版自带的源码中的Busybox1.00版本,编译后仿真没有问题,生成cramfs文件系统后下载、启动也正常,只是会出现“/bin/sh: can’t access tty; job control turned off”的问题,查阅了一些资料,发现都不能很好的解决这个问题。于是下载了Busybox1.1.3版本,编译、生成文件系统、下载、启动,一切正常,讲一讲过程:
1.下载BusyBox 1.1.3
2. 执行make menuconfig,然后进行设置,我截了几张图,这几张图就是在进行配置时需要重点注意的地方:

busybox 安装配置

(1)在General Configuration中,一定要选择“Support for devfs”选项,现在的Busybox新版本去掉了这个选项,不过应该可以通过修改配置文件加入。

busybox 安装配置

(2)在Build Options选项中,选择使用“静态库”以及设置交叉编译工具的PREFIX。

busybox 安装配置

(3)在Linux System Utilities选项中,“Support loopback mounts”和“Support for the old /etc/mtab file”2个选项应该选中。

busybox 安装配置

(4)在Init Utilities选项中,“Support reading an inittab file”应该选中,这样可以根据自己编写的inittab文件初始化;“Support running commands with a controlling-tty”应该选中,否则会提示非常困扰的“/bin/sh: can’t access tty; job control turned off”的提示,尽管可以进入控制台命令行。

busybox 安装配置

(4)在Shell选项中,应该选中默认shell:ash,否则不会生成sh,导致不能解释脚本文件。

(5)其他的选项根据自己的需要设置。

3. 配置完成后,退出保存(最好备份.config文件以供后用),然后开始生成,执行make TARGET_ARCH=arm;此处的TARGET_ARCH是必须的。生成完成后使用qemu-arm测试:qemu-arm ./busybox ls,如果没有错误的话,会显示出 当前目录下的文件列表。
说明:在生成的过程中,提示了“/mnt/extdisk/embedded/busybox-1.1.3/include/bbconfigopts.h:28 hmm, untermina”错误,分析相应的文件,发现应该是一个配置包含文件,在配置后保存在.config文件中,因此这个文件中的内容应该不是关键内容,因此我将此文件清空保存,然后重新执行上面的生成命令,成功。

4. 生成结束后,执行make install,生成一个_install文件夹,内有一个linuxrc文件和bin、sbin、usr三个文件夹,删除linuxrc,将三个文件夹打包。

5. 准备生成cramfs文件系统:

(1)创建一个文件夹,比如rootfs,转到rootfs,执行命令mkdir bin dev etc home lib mnt proc sbin sys tmp  var usr,建立相应的文件夹,再建立etc下的init.d文件夹。

(2)准备启动所需的文件:linuxrc、rcS、inittab、fstab四个文件;
linuxrc文件:
----------------------------------------------
#!/bin/sh
echo “mount /etc as ramfs”
/bin/mount -f -t cramfs -o remount,ro /dev/bon/2 /
/bin/mount -t ramfs ramfs /var
/bin/mkdir -p /var/tmp
/bin/mkdir -p /var/run
/bin/mkdir -p /var/log
/bin/mkdir -p /var/lock
/bin/mkdir -p /var/empty
#/bin/mount -t usbdevfs none /proc/bus/usb

exec /sbin/init
------------------------------------------------

rcS文件:
———————————————————————————–
#!/bin/sh
/bin/mount -a
———————————————————————————–
这两个文件生成后,应该使其具有执行的权限,可使用chmod 775 linuxrc rcS来修改,linuxrc应该放在rootfs根目录,rcS应该放在rootfs/etc/init.d/目录。

inittab文件:
-------------------------------------------------
# This is run first except when booting
::sysinit:/etc/init.d/rcS

# Start an “askfirst” shell on the console
#::askfirst:-/bin/bash
::askfirst:-/bin/sh

# Stuff to do when restarting the init process
::restart:/sbin/init

# Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
-------------------------------------------------
fstab文件:
-------------------------------------------------
none        /proc        proc    defaults    0 0
none        /dev/pts    devpts    mode=0622    0 0
tmpfs        /dev/shm    tmpfs    defaults    0 0
-------------------------------------------------
这两个文件应该放在rootfs/etc/目录,应该注意其权限问题。

(3)如果使用linux 2.6.xx内核,应该实现创建节点console、null。转到rootfs/dev/目录来创建:
sudo mknod console c 5 1
sudo mknod null c 1 3
否则就会提示“Warning: unable to open an initial console.
Kernel panic – not syncing: Attempted to kill init!”的类似错误。

(4)将刚才在busybox的_install下的三个文件夹的打包文件复制到rootfs目录,解压后删除打包文件。

(5)也可以将一些常用的lib文件复制到rootfs/lib/目录下,比如:ld-2.5.so      libc-2.5.so      libcrypt.so.1  libgcc_s.so.1  libm.so.6 ld-linux.so.3  libcrypt-2.5.so  libc.so.6      libm-2.5.so等文件或符号连接,在复制时应该注意采用图形化的界面复制活打包后解包方式复制。

(6)转到rootfs的上一级目录,使用mkcramfs制作文件系统:./mkcramfs rootfs xxxxx.cramfs,然后下载、少录、启动,成功,如下图所示:
busybox 安装配置

6. 后记
(1)qemu-arm仿真工具
花费了2天多的时间来使用Busybox制作文件系统,时间有点长,主要是开始走了弯路,使用Busybox1.10版本,当时不太清楚有qemu-arm仿真arm的工具,借助qemu-arm仿真工具可以很方便的验证自己的busybox编译结果是否正确,可以节省很多时间。就如刚开始我使用busybox1.10版本,没有借助qemu-arm仿真,下载后启动出现”Failed to execute /linuxrc.  Attempting defaults…“的错误,这个错误很难排除,这几天一有时间就查资料看解决这个问题的方法,只可惜浪费了时间。
(2)交叉编译工具
看网上有资料说,linux内核以及busybox最好使用相同的交叉编译工具编译,否则可能会出现问题。我使用的是不同版本的交叉编译工具,没有出现问题。因为linux2.6.24内核是几天前编译的,采用的是4.2.1版本;今天编译busybox1.1.3用的是3.3.2版本。
(3)BusyBox
Linux2.6.xx内核取消了devfs的支持,Busybox也跟上了这个步伐,前面我也提到过,对于busybox的新版本应该可以通过修改配置文件十七支持devfs,具体方法:修改Config.in文件,找到menu “General Configuration”,然后在其后适当位置加入如下内容:
config CONFIG_FEATURE_DEVFS
    bool “Support for devfs”
    default n
    help
      Enable if you want BusyBox to work with devfs.
这样,在进行配置时就会出现“Support for devfs”选项。只是我加入后,在进行编译,所得到的busybox也没有在qemu-arm仿真中通过。

 

 

转自http://apps.hi.baidu.com/share/detail/1529790

 

编译busybox 出错
$ make meuncnfig

> miscutils/ionice.c: In function 'ioprio_set':
> miscutils/ionice.c:16: error: 'SYS_ioprio_set' undeclared (first use in
> this function)
> miscutils/ionice.c:16: error: (Each undeclared identifier is reported
> only once
> miscutils/ionice.c:16: error: for each function it appears in.)
> miscutils/ionice.c: In function 'ioprio_get':
> miscutils/ionice.c:21: error: 'SYS_ioprio_get' undeclared (first use in
> this function)
> make[1]: *** [miscutils/ionice.o] Error 1
> make: *** [miscutils] Error 2

***********************************************************************************************

解决方法:

将在busybox应用里关闭 ionice 选项。

$  make meunconfig 

选择下面的菜单:

Miscellaneous Utilities  —>     

[ * ] ionice                                     

按空格去掉这个选项。改成下面这样。

[ ] ionice          

然后按 Y 保存退出。

$  make 

$  make install

 

转自http://blog.csdn.net/huihui1988

///

 

宿主机:Fedora13
目标 机:s3c2440
交叉 编译 器:arm-linux-gcc- 3.4.1
交叉编译器路径:/usr/local/arm/3.4.1

busybox版本:1.17.2

一、准备工作

1、配置交叉编译环境

http://www.handhelds.org/download/projects/toolchain/ 下 载arm-linux-gcc-3.4.1.tar.bz2

解压:

将交叉编译工具装到/usr/local下

2、从http://www.busybox.net/downloads/下载最新的busybox1.17.2版本

二、配置

1、修改Makefile

进入busybox的解压目录,

vim Makefile,将

ARCH ?= $(SUBARCH) 改为

ARCH ?= arm

CROSS_COMPILE ?=改为

CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-(根据你自己的路径定义)

2、配置busybox的相关工具

执行 make menuconfig,进入配置菜

 

  1. Busybox Settings —>  
  2.      Build Options —>  
  3.           [*] Build BusyBox as a static binary (no shared libs) //这里编译为静态库  
  4.           [ ] Build with Large File Support //这里要去掉这一项  
  5.           () Cross Compiler perfix //设置交叉编译器路径  
  6.      Installation Options —>  
  7.           [*] Don’t use /usr //不安装到系统的usr目录下,以解压目录下的_install来代替  
  8. Linux System Utilities —>  
  9.      [ ] mkfs_ext2  
  10.      [ ] mkfs_vfat  //这两项不选,否则编译会报错  
  11. 别的选项工具自己需要进行选择  
  12. Miscellaneous Utilities —>  
  13.      [ ] ionice //去掉,否则编译报错  
  14. 其他选项根据个人需要  
  15. Networking Utilities —>  
  16.      可以去除一些不必要的选项  

 

3、编译

下面进行编译:make ARCH=arm CROSS_COMPILE=/usr/local/arm/3.4.1/bin/arm-linux-

这里,我们会发现出错了,错误信息如下:

networking/interface.c:807: error: `ARPHRD_INFINIBAND’ undeclared here (not in a function)

通过查看内核源代码目录中的“include/linux/ifarp.h”文件可得知“ARPHRDINFINIBAND”的值为“32”,然后 修改“networking/interface.c”文件,在其中添加:

#define ARPHRD_INFINIBAND 32 /* InfiniBand */

继续编译,发现还是有错误:

networking/libiproute/ipaddress.c:167: error: `IFLA_OPERSTATE’ undeclared (first use in this function)

这个错误其实是busybox的一个bug,一直未解决,我们对代码做如下修改:

networking/libiproute/ipaddress.c

 

  1.        
  2. 164 164                 printf(“master %s “, ll_idx_n2a(*(int*)RTA_DATA(tb[IFLA_MASTER]), b1));   
  3. 165 165         }   
  4. 166 166 #endif   
  5.     167 #ifdef IFLA_OPERSTATE   
  6. 167 168         if (tb[IFLA_OPERSTATE]) {   
  7. 168 169                 static const char operstate_labels[] ALIGN1 =   
  8. 169 170                         “UNKNOWN/0”“NOTPRESENT/0”“DOWN/0”“LOWERLAYERDOWN/0”   
  9. …   …      
  10. 171 172                 printf(“state %s “, nth_string(operstate_labels,   
  11. 172 173                                         *(uint8_t *)RTA_DATA(tb[IFLA_OPERSTATE])));   
  12. 173 174         }   
  13.     175 #endif   
  14. 174 176         if (G_filter.showqueue)   
  15. 175 177                 print_queuelen((char*)RTA_DATA(tb[IFLA_IFNAME]));   
  16. 176 178    

 

networking/libiproute/iplink.c

 

  1. *  
  2.   274   274         return ipaddr_list_or_flush(argv, 0);   
  3.   275   275 }   
  4.   276   276    
  5.     277 #ifdef IFLA_LINKINFO   
  6.   277   278 #ifndef NLMSG_TAIL   
  7.   278   279 #define NLMSG_TAIL(nmsg) /   
  8.   279   280         ((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len)))   
  9.   …     …      
  10.   360   361                 return 2;   
  11.   361   362         return 0;   
  12.   362   363 }   
  13.     364 #endif   
  14.   363   365    
  15.   364   366 /* Return value becomes exitcode. It’s okay to not return at all */   
  16.   365   367 int do_iplink(char **argv)   
  17.   366   368 {   
  18.   367   369         static const char keywords[] ALIGN1 =   
  19.     370 #ifdef IFLA_LINKINFO   
  20.   368   371                 “add/0”“delete/0”“set/0”“show/0”“lst/0”“list/0”;   
  21.     372 #else   
  22.     373                 “set/0”“show/0”“lst/0”“list/0”;   
  23.     374 #endif   
  24.   369   375         if (*argv) {   
  25.   370   376                 smalluint key = index_in_substrings(keywords, *argv);   
  26.   371   377                 if (key > 5) /* invalid argument */   
  27.   372   378                         bb_error_msg_and_die(bb_msg_invalid_arg, *argv, applet_name);   
  28.   373   379                 argv++;   
  29.     380 #ifdef IFLA_LINKINFO   
  30.   374   381                 if (key <= 1) /* add/delete */   
  31.   375   382                         return do_change(argv, key ? RTM_DELLINK : RTM_NEWLINK);   
  32.   376   383                 else if (key == 2) /* set */   
  33.     384 #else   
  34.     385                 if (key == 0) /* set */   
  35.     386 #endif   
  36.   377   387                         return do_set(argv);   
  37.   378   388         }   
  38.   379   389         /* show, lst, list */   

 

完成后继续编译

执行 make install,终于在_install文件夹下生成了工具包

4、制作文件系统

可以先创建一个工作目录,如myroot,在工作目录下 创建以下目录:bin sbin dev etc lib home root usr var proc mnt tmp sys

执行 mkdir bin sbin dev etc lib home root usr var proc mnt tmp sys

在etc 下面要写两个文件fstab inittab 和一个文件夹init.d

 

(a) fstab 的内容是:

 

  1. proc /proc proc defaults 0 0  
  2. tmpfs /tmp tmpfs defaults 0 0  
  3. sysfs /sys sysfs defaults 0 0  
  4. tmpfs /dev tmpfs defaults 0 0  

 

(b) fstab 文件的作用

文 件/etc/fstab 存放的是系统中的文件系统信息。当正确的设置了该文件,则可以通过”mount /directoryname” 命令来加载一个文 件系统,每种文件系统都对应一个独立的行,每行中的字段都有空格或tab 键分开。同时fsck 、mount 、umount 的等命令都利用该程序。

inittab 的内容是:

 

  1. #/etc/inittab  
  2. ::sysinit:/etc/init.d/rcS  
  3. ::askfirst:-/bin/sh   
  4. ::ctrlaltdel:/sbin/reboot  
  5. ::shutdown:/bin/umount -a -r  

 

(c) init.d/rcS 文件的内容:

 

  1. #!/bin/sh  
  2. ifconfig eth0 192.168.1.17  
  3. mount -t tmpfs mdev /dev  
  4. mkdir /dev/pts  
  5. mount -t devpts devpts /dev/pts  
  6. mount -t sysfs sysfs /sys  
  7. mount -a  
  8. echo /sbin/mdev > /proc/sys/kernel/hotplug  
  9. mdev –s  
  10. echo leohui1988_busybox  

 

 

 

(d)在/dev 下建立设备节点:Console null

 

  1. mknod dev/console c 5 1  
  2. mknod dev/null c 1 3  

 

(e)将编译busybox生成的/bin和/sbin下的工具拷贝到myroot下的/bin和/sbin下

 

(f)使用mkyaffs2image制作yaffs文件系统镜像

./mkyaffs2image myroot rootfs.yaffs

 

将yaffs烧写至开发板,可在终端下看到leohui1988_busybox的输出,最基本的文件系统制作成功!

 

 

注意:

如果使用静态编译,那么后面我们移植到开发板的程序也必须静态编译,这样的话就比较占存储空间,为此可以将busybox进行动态编译,使用共享链接库来减小体积,同时也方便后面程序进行编译和移植。

动态编译步骤与以上类似,只是把 [ ] Build BusyBox as a static binary (no shared libs)这一项替换掉。其余步骤一样,完成后将bin和sbin拷贝到文件系统的bin,sbin下,然后将linuxrc这个链接文件也拷入文件系统根目录下,最初我没放linuxrc这个链接文件时,启动显示init错误。之后再将arm-linux交叉编译工具的lib(我的路径是/usr/local/arm/3.4.1/arm-linux/lib)库拷贝到文件系统lib下。制作成镜像烧写至flash,启动成功!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/22165.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信