zoukankan      html  css  js  c++  java
  • Tiny210v2( S5PV210 )平台下创建基本根文件系统

    转自Tiny210v2( S5PV210 )平台下创建基本根文件系统


    0. 概要介绍

    =========================================================
    根文件系统的建立,可以有多种方式。
    * 直接利用开发板供应商提供的根文件系统;
    * 利用开源社区的发行版,比如debian/ubuntu for arm;
    * 利用meego/tizen/moblin/android提供的根文件系统;
    * 自己建立。

    其中最方便的还是利用别人已经完成的成果,避免重新发明轮子。
    但如果别人已有的成果不能满足自己需求,或者想要体验一下根文件系统如何建立的话,还是需要自己来实践一下。

    在这里记录一下我建立最小根文件系统的过程,以防忘记。
    这个方法不一定是正统方法,只是一个可行的实践,如果大家有其他方式,欢迎讨论。

    最小根文件系统是为了开发板上电以后能够登录shell,并且有最基本的命令工具集。
    想要建立一个和PC类似环境的最小根文件系统的话,可以参考 linux from scratch 的实践过程:
    www.linuxfromscratch.org 中的 LFS 以及 CLFS 部分。

    Linux内核启动完成以后,需要执行 init 这个命令,这是User Space 里面的第一个进程。
    init 可以由 sysvinit 提供,也可以由 upstart 提供,当然也可以由  busybox 提供。

    在我环境里面,为了让根文件系统更小,采用了 busybox 作为解决方案。
    busybox 包含了基本系统中所需要的大部分命令支持,只不过这些命令是重新实现的,尽量兼容于原有软件,对于命令参数也可能不完全支持。

    如果将 busybox 编译成 static 的话。最小根文件系统只使用 busybox 就可以了。这个根据开发需要决定。
    在我的环境里面,busybox 是链接到 C library 上的。

    因此,最小根文件系统只依赖于两个部分: C library 和 busybox。

    1. 创建C library

    =========================================================
    C library 如果不想重新编译的话,最好是使用 toolchain 已经做成的,
    因为如果你用这个toolchain进行交叉编译的话,所有编译完的软件都是依赖于 toolchain中的 C library的。
    为了保持一致性,建议直接使用toolchain中的 C library。

    toolchain就是交叉编译工具集, 可以使用开发板提供商提供的。可以自己制作一个。
    为了针对 S5PV210 这个 coretex-a8 进行优化,我利用 crosstool-ng 制作了一个针对 armv7a 硬件浮点neon 运算优化的toolchain。
    并且利用了 linaro 项目中的 gcc 和 gdb 。利用这个toolchain 编译出来的二进制文件,全部都是针对 armv7a neon 的。

    制作 toolchain 的方法,可以参考之前写的帖子:
    http://www.arm9home.net/read.php?tid-27480.html

    但距离写那个帖子已经有一段时间了,配置稍微有一些变化。你可以参考附件中的 crosstool-ng 的配置文件自己试一试。

    另外,如果想要 sysroot 目录中,没有 libexec 这个目录,可以修改 glibc-eglibc.sh-common 这个文件,添加  --libexecdir=/usr/lib 参数。
    在我的系统中,这个文件位于: /usr/lib/ct-ng.hg+unknown-20130103.094521/scripts/build/libc :
    351     CT_DoExecLog CFG                                                
    352     BUILD_CC="${CT_BUILD}-gcc"                                      
    353     CFLAGS="${glibc_cflags}"                                        
    354     CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}"
    355     AR=${CT_TARGET}-ar                                              
    356     RANLIB=${CT_TARGET}-ranlib                                      
    357     "${CONFIG_SHELL}"                                              
    358     "${src_dir}/configure"                                          
    359         --prefix=/usr                                              
    360         --libexecdir=/usr/lib                                      
    361         --build=${CT_BUILD}                                        
    362         --host=${CT_TARGET}                                        
    363         --cache-file="$(pwd)/config.cache"                          
    364         --without-cvs                                              
    365         --disable-profile                                          
    366         --without-gd                                                
    367         --with-headers="${CT_HEADERS_DIR}"                          
    368         "${extra_config[@]}"                                        
    369         "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[@]}"

    在我的配置文件中,交叉编译环境会安装到 /opt/linaro-gcc473-eglibc216-armv7a-neon 目录中,
    而 /opt/linaro-gcc473-eglibc216-armv7a-neon/arm-unknown-linux-gnueabi/sysroot 这个目录中的内容,
    就是编译上层软件所需要的运行库和开发库的集合,什么 .so 啊, .h 文件啊,全部都在这里。

    在我的开发环境PC中, 目标环境的根目录位于 /opt/S5PV210/rootfs ,将 sysroot 的文件全部拷贝过来:
    sudo cp -R /opt/linaro-gcc473-eglibc216-armv7a-neon/arm-unknown-linux-gnueabi/sysroot  /opt/S5PV210/rootsf 

    至此,C library 已经完成了。

    2. 创建基本工具集(busybox)

    =========================================================
    需要注意的是: 这个 C library 包含了开发环境,那些 头文件/ .o  文件等,有一些是运行时不需要的。
    我还不清楚哪些不需要,删除不许要的文件,能够节约一些磁盘空间。

    下一步就是利用 busybox 生成常用工具。

    busybox 的源代码,是直接利用光盘中的 busybox-1.17.2-20101120.tgz 。这个使用网上更加新的源代码应该也没有问题。
    我在配置 busybox 的时候,配置其不使用 /usr 目录,是因为安装其他软件包的时候,全部安装到 /usr 目录下,
    这样可以将基本文件系统和软件开发栈隔离开。这个需要依据你自己的设计决定。

    busybox 解压完成后,可以通过 make menuconfig 进行配置。
    配置完成后,保存会生成 .config 配置文件。然后 make 编译busybox。

    在配置文件中,可以设定安装到的目录,这个目录就是 make install 的安装目录。
    配置项为:  CONFIG_PREFIX="/opt/S5PV210/rootfs"
    我将其设置为 /opt/S5PV210/rootfs 是为了避免再次拷贝。

    你也可以参考我的配置文件: busybox_config ,将其拷贝为 .config 然后直接make编译得到二进制文件。

    3. 创建必要的系统配置文件

    =========================================================
    现在还剩下对根文件系统进行一些配置。
    建立必要的目录:
    install -d /opt/S5PV210/rootfs/dev
    install -d /opt/S5PV210/rootfs/etc
    install -d /opt/S5PV210/rootfs/home
    install -d /opt/S5PV210/rootfs/proc
    install -d /opt/S5PV210/rootfs/root
    install -d /opt/S5PV210/rootfs/run
    install -d /opt/S5PV210/rootfs/sys
    install -d /opt/S5PV210/rootfs/var
    install -d /opt/S5PV210/rootfs/tmp
    install -d /opt/S5PV210/rootfs/etc/init.d
    install -d /opt/S5PV210/rootfs/etc/rc.d
    install -d /opt/S5PV210/rootfs/var/lib
    install -d /opt/S5PV210/rootfs/var/spool
    install -d /opt/S5PV210/rootfs/var/lock
    install -d /opt/S5PV210/rootfs/var/log
    install -d /opt/S5PV210/rootfs/run/lock
    ln -s  ../run /opt/S5PV210/rootfs/var/run
    ln -s  ../run/lock /opt/S5PV210/rootfs/var/lock

    在 /opt/S5PV210/rootfs 中的 etc 目录下创建必要的系统配置文件:
    这几个文件可以参考开发板提供上提供的根文件系统的配置文件,也可以参考开发PC上的配置文件。
    其中最重要的文件是 rcS ,这个是 init 程序读取的配置文件。
    懒得自己写了,直接从 友善提供的根文件系统拷贝过来。
    group
    host.conf
    localtime
    mdev.conf
    passwd
    profile
    init.d/rcS
    rc.d/init.d/netd

    在 /opt/S5PV210/rootfs 中的 dev 目录下创建必要的设备文件:
    sudo mknod console    c 5 1
    sudo mknod null       c 1 3
    sudo mknod loop0      b 7 0

    4. 做成根文件系统Image

    =========================================================
    现在,基本的根文件系统已经做成,理论上已经可以启动了。
    你可以参考下面的帖子,让开发板从远程挂载 根文件系统。
    http://www.arm9home.net/read.php?tid-27737.html

    或者做成 ROMFS/CRAMFS/YAFFS 格式的镜像文件下载到 flash 中。
    做成yaffs镜像文件的工具在光盘的 mktools-20120518.tar.gz 文件中。
    对于 yaffs 镜像文件的做成,可以使用如下命令:
    cd /opt/S5PV210/rootfs
    mkyaffs2image-mlc2 ../rootfs.img
  • 相关阅读:
    ## 序列化和反序列化
    C#小型资源管理器
    codeforces #310 div1 B
    codeforces #310 div1 A
    BZOJ 1030 文本生成器
    BZOJ 2806 cheat
    BZOJ 2553 禁忌
    BZOJ 4199 品酒大会
    codeforces #309 div1 D
    codeforces #309 div1 C
  • 原文地址:https://www.cnblogs.com/noble/p/4144238.html
Copyright © 2011-2022 走看看