zoukankan      html  css  js  c++  java
  • 根文件系统的构建与分析(四)之瑞士军刀busybox生成系统基本命令

    根文件系统的构建与分析(四)

    转载请注明 http://blog.csdn.net/jianchi88   Author:Lotte   邮箱:baihaowen08@126.com

            ls /bin,ls /sbin,这些目录下存储的主要是常用命令的二进制文件,如ls、cp、rm等。如果要自己编写这几百个常用命令的源程序,好在我们有嵌入式Linux系统的瑞士军刀——busybox,事情就简单很多,他集合了许多系统基本命令,这些命令都是链接到busybox这个程序。

    一、BusyBox介绍

    • Busybox是一个开源的软件项目,其官方网站是:http://www.busybox.net
    • Busybox集成了一百多个最常用的Linux命令程序和工具;
    • Busybox  程序的体积非常之小,很适合嵌入式系统;

    • Busybox 提供的程序包括:
    –具有shell功能,如csh
    –提供一个迷你的vi编辑器
    –提供系统不可或缺的/sbin/init程序
    –其他的系统基本命令,如:ls,mkdir,ifconfig等。

    二、编译/安装busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目录及其命令

    1、下载源码

    从官网(http://www.busybox.net/downloads/)上下载最新的版本:busybox-1.20.1.tar.bz2 28-May-2012 00:51 2.1M

    2、解压源码。

    [cpp] view plain?
    1. [root@localhost opt]# tar xvjf busybox-1.20.1.tar.bz2   

    3、进入源码修改Makefile

    [cpp] view plain?
    1. 164 CROSS_COMPILE ?=  

    改成

    [cpp] view plain?
    1. 164 CROSS_COMPILE ?= arm-linux-  

     

    [cpp] view plain?
    1. 190 ARCH ?= $(SUBARCH)  

    改成

    [cpp] view plain?
    1. 190 ARCH ?= arm  

    4、make menuconfig配置busybox


    1)Busybox Settings   ==》  Build Options    ==》 Build BusyBox as a static binary (no shared libs),表示编译busybox时,是否静态链接C库。我们选择动态链接C库(默认动态)。

    2)Busybox Settings   ==》 Installation Options   ==》 What kind of applet links to install (as soft-links) ,表示安装busybox时,将各个命令安装为指向busybox的软链接还是硬链接。我们选择软链接(默认软链接)。

    3)Busybox Settings   ==》 Installation Options   ==》 (/opt/build_rootfs) BusyBox installation prefix,表示busybox的安装位置。我们选择/opt/build_rootfs

    4)Busybox Settings   ==》 Busybox Library Tuning。保留Command line editing以支持命令行编辑;保留History size以支持记忆历史命令;选中Tab completion和Username completion以支持命令自动补全

    选项Applets,他将busybox的支持的几百个命令分门别类。我们只要在各个门类下选择想要的命令即可。这里我们基本保持默认设置。

    5)选中Networking Utilities — httpd下的Enable -u <user> option,以启用http服务器的功能allows the server to run as a specific user(默认选上)

    更多的选项大家可以摸索一下,常用的它都默认了。

    推出Exit后保存配置文件

    5、编译busybox

    make

    可能因为我的交叉编译工具链是4.1.2,所以提示错误,mtdmtd-user.h 没有那个文件或目录

    解决:

    [cpp] view plain?
    1. [root@localhost busybox-1.20.1]# cp /usr/include/mtd/ ./include/mtd/ -a  

    接着make,又出现缺少mtdubi-user.h ,我从u-boot源码里拷贝一个过来。

    [cpp] view plain?
    1. [root@localhost busybox-1.20.1]# cp /opt/u-boot-2009.11/include/mtd/ubi-user.h ./include/mtd  

    6、安装busybox

    make install

    因为上一篇《根文件系统的构建与分析(三)之根文件目录及最简/dev目录》已经在/opt/build_rootfs建了根文件目录和拷贝了动态库在/lib和建了设备节点在/dev,为了更清晰看到busybox安装到根文件系统的有什么东西,我先搞一个空目录让它安装,看看会多了什么出来!我做的是把原来的/opt/build_rootfs目录备份,再清空之前的/opt/build_rootfs。

     

    安装完成后,可以看到在/opt/build_rootfs目录下生成了bin、sbin、usr/bin、usr/sbin目录,其下包含了我们常用的命令,这些命令都是指向bin/busybox的软链接,而busybox本身的大小也只有900K:

    [cpp] view plain?
    1. [root@localhost build_rootfs]# ls -l  
    2. 总计 28  
    3. drwxr-xr-x 2 root root 4096 06-26 02:10 bin  
    4. lrwxrwxrwx 1 root root   11 06-26 02:10 linuxrc -> bin/busybox  
    5. drwxr-xr-x 2 root root 4096 06-26 02:10 sbin  
    6. drwxr-xr-x 4 root root 4096 06-26 02:10 u)  

    还记得之前讲过bootloader传到内核的参数init=linuxrc吗,linuxrc就是内核启动的第一个进程,它链接到busybox。如果没有它也行,因为/sbin/init可以代替。

    [cpp] view plain?
    1. [root@localhost build_rootfs]# ls -l /sbin/init  
    2. -rwxr-xr-x 1 root root 38652 2008-09-18 /sbin/init  
    [cpp] view plain?
    1. [root@localhost build_rootfs]# ls -sh bin -l  
    2. 总计 1.3M  
    3. 4.0K lrwxrwxrwx 1 root root    7 06-26 02:10 addgroup -> busybox  
    4. 4.0K lrwxrwxrwx 1 root root    7 06-26 02:10 adduser -> busybox  
    5. 4.0K lrwxrwxrwx 1 root root    7 06-26 02:10 ash -> busybox  
    6. 4.0K lrwxrwxrwx 1 root root    7 06-26 02:10 base64 -> busybox  
    7. 916K -rwxr-xr-x 1 root root 908K 06-26 02:10 busybox  
    8. 4.0K lrwxrwxrwx 1 root root    7 06-26 02:10 cat -> busybox  
    9. 4.0K lrwxrwxrwx 1 root root    7 06-26 02:10 catv -> busybox  
    10. 4.0K lrwxrwxrwx 1 root root    7 06-26 02:10 chattr -> busyb  

    看见bin命令的大小为1.3M,命令都是链接到busybox的,而busybox的大小仅为908k,十分娇小,集合多系统命令于一身,不愧为瑞士军刀。

    PS:假如是旧版本,如1.16.0,可以不要usr这个目录,只要配置make menuconfig,Busybox setting  ---->    Installation Options  ---->  [*] don’t use /usr(新版本没这个选项),这样可以节省空间。

    7、小结

    至此,我们用busybox生成系统基本命令和系统不可或缺的/sbin/init程序和linuxrc。

    其中/sbin/init是默认的,如果bootloader不传init=linuxrc,内核配置也不填上参数init=linuxrc,这个init就会被执行。
  • 相关阅读:
    从小到大全排列
    众数-摩尔投票法
    链表复制
    2019.8.29刷题统计
    2019.8.28刷题统计
    2019.8.27刷题统计
    2019.8.26
    2019.8.25刷题统计
    2019.8.24
    2019.8.23刷题统计
  • 原文地址:https://www.cnblogs.com/alan666/p/8312468.html
Copyright © 2011-2022 走看看