busybox如何安装(wii安装说明)

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

大家好,又见面了,我是你们的朋友全栈君。

转自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如何安装(wii安装说明)

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

busybox如何安装(wii安装说明)

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

busybox如何安装(wii安装说明)

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

busybox如何安装(wii安装说明)

(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如何安装(wii安装说明)

(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如何安装(wii安装说明)

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://javaforall.net/128628.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 云计算与大数据技术应用 第四章课后答案_云计算原理与实践

    云计算与大数据技术应用 第四章课后答案_云计算原理与实践数据中心数据中心的概念数据中心,顾名思义就是数据的中心,是处理和存储海量数据的地方,英文全称为DataCenter。用专业的名词解释,数据中心是全球协作的特定设备网络,用来在internet网络基础设施上传递、加速、展示、计算、存储数据信息。尽管数据中心听起来神秘高大上,但按照最简单直接的理解,数据中心实际上就是我们个人电脑的扩大版,你的家用电脑就是你个人的数据中心。一般来讲,数据中心主要有几大部分构成:机房(建筑物本身)、供配电系统、制冷系统、网络设备、服务器设备、存储设备等。那数据中心的这些构成模

    2022年10月5日
    3
  • 目标检测—利用labelimg制作自己的深度学习目标检测数据集

    目标检测—利用labelimg制作自己的深度学习目标检测数据集看了网上的xml转txt的博客很多上来就给代码,关于怎么用都不说,有的也用不了,所以这里自己写了一份代码

    2022年6月15日
    46
  • 基于Android点餐系统的设计与实现

    基于Android点餐系统的设计与实现该APP是一个包含前端用户点餐App和后端餐厅管理网页的系统,主要实现菜品相关的修改和展示、个人信息的管理、点餐预约等。

    2022年6月19日
    26
  • java中 数组声明,java数组声明格式

    java中 数组声明,java数组声明格式java声明动态数组,java对象数组详解,java中声明数组,java数组声明格式Java中数组的声明一维数组的声明:在Java中,数组是独立的对象,有自身的方法,不是变量的集合。数组的声明:类型标识符数组名[]或者类型标识符[]……一维数组一维数组可以存放上千万个数据,并且这些数据的类型是完全相同的,使用java数组,必须经过两个步骤,声明数组和分…

    2022年6月2日
    37
  • kali不能使用arpspoof命令_kali不能使用arpspoof命令_ARP欺骗工具arpspoof的用法「建议收藏」

    kali不能使用arpspoof命令_kali不能使用arpspoof命令_ARP欺骗工具arpspoof的用法「建议收藏」arpspoof是一个好用的ARP欺骗工具,Kalilinux中自带了该工具,在ubuntu中,安装它只需运行命令:sudoapt-getinstalldsniff安装完成后,输入命令:manarpspoof可以查看使用手册,2.4版本的手册内容如下(自己翻译的,非官方):名字arpspoof-截获交换局域网中的数据包用法arpspoof[-iinterface][-cow…

    2022年10月6日
    3
  • redis客户端连接(error) NOAUTH Authentication required「建议收藏」

    redis客户端连接(error) NOAUTH Authentication required「建议收藏」redis客户端连接成功,但是操作报异常——(error)NOAUTHAuthenticationrequired错误的含义是说你没有认证,说明没有使用密码连接查看密码:进入redis的安装目录(是安装目录的),查看redis.config文件viredis.config打开配置文件后,输入#requirepassfoobared(快速定位的命令)然后回车红框里的就是密码使用密码连接.

    2022年5月2日
    70

发表回复

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

关注全栈程序员社区公众号