Chinaunix首页 | 论坛 | 博客
  • 博客访问: 420670
  • 博文数量: 117
  • 博客积分: 5235
  • 博客等级: 大校
  • 技术积分: 1775
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-12 15:51
文章分类

全部博文(117)

文章存档

2012年(9)

2011年(2)

2010年(21)

2009年(13)

2008年(72)

我的朋友

分类: LINUX

2008-10-16 13:26:48

前段时间将2.6.14内核移植到了2410平台,在这个过程中文件系统也遇到了一些问题,主要是有关于BusyBox的问题,下面总结一下我的编译经验,希望可以后面的人一些参考,不对的地方也敬请指教。
    busybox是一个集成了一百多个最常用linux命令和工具的软件,他甚至还集成了一个http服务器和一个telnet服务器,而所有这一切功能却 只有区区1M左右的大小.我们平时用的那些linux命令就好比是分立式的电子元件,而busybox就好比是一个集成电路,把常用的工具和命令集成压缩 在一个可执行文件里,功能基本不变,而大小却小很多倍,在嵌入式linux应用中,busybox有非常广的应用,另外,大多数linux发行版的安装程 序中都有busybox的身影,安装linux的时候案ctrl+alt+F2就能得到一个控制台,而这个控制台中的所有命令都是指向busybox的链 接.
       我用的BusyBox版本是busybox-1.1.3,大家可以先到网上下载一个。
       其实BusyBox编译并不是很难,主要是它要跟交叉编译器的搭配以及配置的问题。下面是一些必需要设置的选项:
    Busybox Settings  ---> 
         General Configuration  --->  
               
  •  Support for devfs
             Build Options  --->
                
  •  Build BusyBox as a static binary (no shared libs)  
                 这个最好选上,因上这样子编译出来的busyBox才是可以独立运行的,否则的话需要将它用到的一些库文件放到文件系统的lib目录中。
              │
  •  Do you want to build BusyBox with a Cross Compiler?              │ │  
              │ │(/HOME/toolchains/gcc-4.0.2-glibc-2.3.5/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu│
              上面是我的交叉编译器的路径,你要根据你具体的情况来设置。
           Installation Options  ---> 
                
  •  Don't use /usr   
        这样子编译出来的busybox才不会安装到你主机的/usr目录下。一定要选上。
       --Applets下面是需要编译进busybox的功能选项,其他的可以根据需要自选,但是不要太贪心.
        最后执行make,make install,在$/busybox-1.1.3下会产生一个busybox可执行文件,以及生成一个_install目录,里面有三个目录:bin, lib,sbin以及一个linuxrc脚本文件。其中在/bin目录下有很多的常用命令的链接,例如ls,mount,cat等,这些都是指向 busybox中相应功能的链接,我们也可以手动建立指向busybox的链接,不同的链接名完成不同的功能.例如:   
      最常用的用法是建立指向busybox的链接,不同的链接名完成不同的功能.
      #ln -s busybox ls
      #ln -s busybox rm
      #ln -s busybox mkdir
      然后分别运行这三个链接:
      #./ls
      #./rm
      #./mkdir
      就可以分别完成了ls rm 和mkdir命令的功能.虽然他们都指向同一个可执行程序busybox
      但是只要链接名不同,完成的功能就不同,busybox就是这么的神奇.
            我们也可以这样来用:
      #busybox ls
      他的功能就相当运行ls命令
        好了,这样一个具有基本功能的busybox已经基本编译好了,把它放到文件系统(我的是cramfs)中后,重新编译文件系统,下载到板子上运行发现无 法使用退格,命令保存等功能,后来参照了luofuchong大侠的文章,发现要在busybox中作如下的设置即可:                                                                                                                                              Shells  --->  
                     Choose your default shell (ash)  --->                                                                                                                                            (X) ash 
                     ---   Bourne Shell Options 
                     
  •    command line editing       
                     
  •      vi-style line editing commands 
                    (15)    history size                                              │ │  
      │ │   
  •      history saving                                            │ │  
      │ │   
  •      tab completion                                            │ │  
      │ │   
  •        username completion 
            这样配置编译之后,就可以使用上下键来选择命令,以及使用退格键了。     


    ************************************************************************************************************************************************
    ARM-Linux平台的Busybox交叉编译
              什么是Busybox呢? 
              从名字上直接理解,Busybox是一个“繁忙的盒子”,其实,Busybox可以理解为一个Linux的命令集合,我们在进行Linux操作时所需要的常用命令,都可以在Busybox里找到,但Busybox又不是简单的将所有的命令集合在一起,它采用了一种非常巧妙的方式,即“使用一个程序完成所有的事”。 
              平时我们用ls、vi等命令,都要用到glibc的相关调用,所以如果每个命令都静态链接这些调用,每个命令都会很大,因此在通常的发行版中,都会动态链接glibc,可是glibc的动态库本身就很大,这在PC+Linux平时上还可以接受,但在嵌入式系统中,这就太大了,而且又不是所有的库函数都使用。 
               一般采用两种解决办法,一种是裁剪glibc,另一种就是Busybox的办法,即把ls、vi等程序的main函数改一下名,全部链接在一起,然后静态链接glibc,这样,只有需要的调用才会链接进来,整个Busybox程序可能都比glibc的动态库小。
                因此,Busybox的工作原理是根据文件名来决定用户想调用的是那个程序,例如,如果你的busybox程序的文件名是ls,运行的就是ls,是vi,就运行vi。  
              下面介绍一下ARM-Linux平台的Busybox-1.00交叉编译与使用步骤:
             1. 编译Busybox 
             将文件busybox-1.00.tar.gz拷贝到Linux服务的/home/work目录,执行如下命令解压文件: 
                       #tar xzvf AT91RM9200-busybox-1.00.tar.gz 
            当文件解压完成以后,会自动生成busybox-1.00目录,进入该目录,并执行如下命令进行编译: 
                       #make clean ;清除旧的编译文件 
                       #make menuconfig 
             执行该命令以后,进入配置主菜单。 
             首先进入菜单Build Options,选择“Do you want to build BusyBox with a Cross Compiler?”选项,并在“Cross Compiler prefix”栏中输入交叉编译器安装的位置,如/usr/local/arm/2.95.3/bin/arm-linux-,注意最后是arm-linux-,不能加其他字符或空格。 
              然后在“Any extra CFLAGS options for the compiler”栏中输入需要匹配的arm-linux系统源码目录中头文件所在的位置,如“/home/works/linux-2.4.27/include”,然后退出返回主菜单。 
              再根据系统需要,进入所需命令工具所在的子菜单中,选择相应的命令项。如需要“insmod”命令,就在“Linux Module Utilities”子菜单中选中。 
              选择完成所需的全部命令后,保存配置文件退出,并执行如下命令进行编译: 
                       #make 
                       #make install 
              当命令执行完毕以后,会在当前目录中会生成“_install”目录,进入该目录,可以看到其中有四个子目录:bin、linuxrc、sbin和usr。 
             2. 将编译结果加入ramdisk 
             在/home/work目录下新建一个临时目录tmp,执行如下命令,将原有的ramdisk.gz解压并挂载到该目录下: 
                       # gunzip ramdisk.gz 
                       # mkdir tmp 
                       # mount -o loop ramdisk tmp 
            然后执行如下命令,将_isntall目录中的文件拷贝到tmp目录,覆盖ramdisk中的原有文件: 
                        # cp  -af  /home/work/busybox-1.00/_install/* /home/work/tmp 
            拷贝完毕以后,使用系统提供的映像文件制作工具mkfs.jffs2,生成jffs2映像文件,命令如下: 
                      # ./mkfs.jffs2  -d  ./tmp  -o  jffs2.img 
    然后执行如下命令,卸载并压缩ramdisk.gz: 
                     # umount /home/work/tmp 
                     # gzip ramdisk 
    当以上操作全部完成以后,即可生成新的ramdisk.gz和jffs2.img文件。 
    注意:以上的部分操作步骤可能需要超级用户的权限。
  • 阅读(1337) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~