zoukankan      html  css  js  c++  java
  • linux根文件系统制作之busybox编译和系统构建【转】

    转自:http://blog.chinaunix.net/uid-29401328-id-5019660.html

    介绍完相关文件后我们开始构建文件系统,涉及到的文件等到具体用到的时候再讲。

    一、编译busybox

    首先下载busybox源码,编译busybox,得到一些初始化文件及我们需要的各种命令。关于busybox的作用请百度,这里不详细讲。
    我下载的是busybox-1.23.1,解压之后进入到顶层目录。

    1.修改顶层Makefile

    把CROSS_COMPILE和ARCH修改成你自己的交叉编译器和硬件平台,如:
    CROSS_COMPILE = arm-none-linux-gnueabi-
    ARCH = arm

    2.make menuconfig,修改下面的选项,不然会编译出错

    Busybox Settings  --->
        Build Options  --->
            [*]Build shared libbusybox
            [ ]   Produce a binary for each applet, linked against libbusybox
            [ ]   Produce additional busybox binary linked against libbusybox

    Busybox Settings  --->
        Installation Options ("make install" behavior)  --->
            (/nfsdir/tools/rootfs) BusyBox installation prefix      // 编译生成文件的存放路径
            
    其他都保持默认

    关于需要注意的一些选项说明如下:
    Busybox Settings  --->
        Build Options  --->
            [ ] Build BusyBox as a static binary (no shared libs) (NEW)
    这个意思是运行busybox才动态链接库,busybox需要的库要我们提供

    Busybox Settings  --->
        Installation Options ("make install" behavior)  --->
            What kind of applet links to install (as soft-links)  --->
    设置busybox生成后各种命令均为指向busybox主程序的软链接

    Busybox Settings  --->
        Busybox Library Tuning  --->
            (255) History size 
            [*]   History saving (NEW)   // 支持历史记录
            [*]   Tab completion (NEW)   // 支持Tab补全操作

    选项Applets就是将busybox支持的几百个命令分门别类,我们可以在各个门类下选择想要的命令。

    3.make

    最后出现下面的信息,make成功
      CC      util-linux/volume_id/xfs.o
      AR      util-linux/volume_id/lib.a
      LINK    busybox_unstripped
    Trying libraries: crypt m
     Library crypt is not needed, excluding it
     Library m is needed, can't exclude it (yet)
    Final link with: m
    libbusybox: 0_lib/libbusybox.so.1.23.1
      DOC     busybox.pod
      DOC     BusyBox.txt
      DOC     busybox.1
      DOC     BusyBox.html

    4.make install

    出现下面的信息安装成功
    --------------------------------------------------
    You will probably need to make your busybox binary
    setuid root to ensure all configured applets will
    work properly.
    --------------------------------------------------


    至此busubox的安装就完成了,现在查看/nfsdir/tools/rootfs文件夹,会发现多了下面几个文件:
    bin  linuxrc  sbin  usr

    可以在bin目录查看,busybox只有970K



    二、正式构建根文件系统

    1.创建所需文件夹(根据FHS标准)
    mkdir dev etc home lib media mnt opt proc sys tmp var root

    2.添加相应的库

    需要添加的库是从编译busybox所使用的交叉编译工具里拷贝的,但交叉编译工具里的库文件很多,不必全部拷贝。
    那么我们怎么知道哪些库是需要的呢?

    可以用一下方法确定
    [root@localhost bin]# arm-linux-readelf -d busybox 

    Dynamic section at offset 0xf16b4 contains 25 entries:
      Tag        Type                         Name/Value
     0x00000001 (NEEDED)                     Shared library: [libm.so.6]
     0x00000001 (NEEDED)                     Shared library: [libc.so.6]

    而ld-linux.so.3属于固有需要的库,所以busybox至少需要三个库:ld-linux.so.3、libm.so.6、libc.so.6

    下面要睁大眼睛了,上面的库都是链接文件,不要把链接文件拷进去了,真正的文件没拷贝
    [root@localhost lib]# ls -l libc.so.6 
    lrwxrwxrwx 1 root root 11 Apr 23 21:13 libc.so.6 -> libc-2.8.so
         
    [root@localhost lib]# ls -l libm.so.6 
    lrwxrwxrwx 1 root root 11 Apr 23 21:13 libm.so.6 -> libm-2.8.so

    [root@localhost lib]# ls -l ld-linux.so.3 
    lrwxrwxrwx 1 root root 9 Apr 23 21:13 ld-linux.so.3 -> ld-2.8.so

    所以要把ld-linux.so.3、libm.so.6、libc.so.6和libc-2.8.so、libm-2.8.so、ld-2.8.so都拷贝到/lib下。
    但是上面的这几个库只是busybox运行所需要的库,这个时候系统虽然可以启动,但会出现下面的打印信息:
    feed_wdg: error while loading shared libraries: libgcc_s.so.1: cannot open shared object file: No such file or directory

    这个意思是由于缺少libgcc_s.so.1库,导致看门狗程序启动不了,然后看到开发板过以后重启了,所以要想正常运行还需要拷贝libgcc_s.so和libgcc_s.so.1

    但是实际使用的时候要一个一个去查看嘛,这样太麻烦了,所以一般把正常需要的库都拷贝到/lib下,这样也不会太大,包括:
    ld-linux:动态链接库,必需
    libc: 标准c函数库,必需
    libm: 数学库,一般需要
    libdl: 用于动态装载共享库,较少用到
    libcrypt: 加密附加库,需要认证的程序用到,较少用
    libpthread: POSIX线程库,一般需要

    3.添加配置文件(即/etc下的文件)

    这里对照我们之前的分析步骤

    a.首先是inittab文件,内容如下:
    # /etc/inittab
    ::sysinit:/etc/init.d/rcS
    console::askfirst:-/bin/sh
    ::once:/usr/sbin/telnetd -l /bin/login
    ::ctrlaltdel:/sbin/reboot
    ::shutdown:/bin/umount -a -r

    b.添加init.d/rcS文件,内容如下:
    #!/bin/sh

    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    export PATH

    #
    #       Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
    #

    mount -a
    mkdir -p /dev/pts
    mount -t devpts devpts /dev/pts
    echo /sbin/mdev > /proc/sys/kernel/hotplug
    mdev -s
    mkdir -p /var/lock

    hwclock -s
    feed_wdg &

    ifconfig lo 127.0.0.1
    ifconfig eth0 192.168.2.99

    /bin/hostname -F /etc/HOSTNAME

    c.添加HOSTNAME文件,内容就是代表主机名,可以随意定,如:
    Blue

    d.添加fstab文件:
    #device         mount-point     type    options         dump    fsck order
    proc            /proc           proc    defaults                0       0
    tmpfs           /tmp            tmpfs   defaults                0       0
    sysfs           /sys            sysfs   defaults                0       0
    tmpfs           /dev            tmpfs   defaults                0       0
    var             /dev            tmpfs   defaults                0       0
    ramfs           /dev            ramfs   defaults                0       0

    e.根据inittab文件的内容console::askfirst:-/bin/sh,
    在启动脚本etc/init.d/rcS执行完后将在终端启动一个shell。Shell启动过程中会根据文件/etc/profile配置登陆环境。
    所以需要添加profile文件,内容如下:
    USER="`id -un`"
    LOGNAME=$USER
    PS1='[u@h W]# '      # 这个显示的是命令行下的主机名和用户名格式,如:[root@Blue etc]#
    PATH=$PATH

    HOSTNAME=`/bin/hostname`

    export USER LOGNAME PS1 PATH

    f.如果要配置正确的用户,必须具有两个文件:group和passwd

    group内容如下:
    root:x:0:root

    passwd内容如下:
    root::0:0:root:/:/bin/sh

    具体什么意义请百度

    到此/etc配置完毕,包含如下:
    HOSTNAME  fstab     group     init.d    inittab   passwd    profile

    4.在/dev/下创建设备节点:
    mknod console c 5 1
    mknod null c 1 3

    对于我的系统不创建也可以,原因参见上篇博文


    三、制作yaffs2文件系统

    进入到/nfsdir/tools/(根文件系统的上次目录)

    [root@localhost tools]# mkyaffs2image rootfs root.bin  // mkyaffs2image工具是交叉编译工具自带的

    生成的root.bin镜像可直接拷贝到nand flash的文件系统分区,接下来就可以直接启动了



    上面只是制作了一个最简单的文件系统,实际可以根据自己的需要添加启动程序、丰富自己的配置及功能等

  • 相关阅读:
    通过静态广播监听网络变化,在通过回调通知
    支付宝九宫格
    toolBar
    QQ发送位置(高德地图)
    聊天消息 左右item
    Scrollview 嵌套 RecyclerView 及在Android 5.1版本滑动时 惯性消失问题
    判断软键盘是否弹出 并且隐藏
    Solve Longest Path Problem in linear time
    Why longest path problem doesn't have optimal substructure?
    [leetcode] Reorder List
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/5688100.html
Copyright © 2011-2022 走看看