根文件系统制作详解

什么是根文件系统

       linux最顶层的目录"/"被称作根目录,与Windows上的目录结构有较大的不同。系统中只有一个根目录,路径是“/”,而其它的分区只是挂载在根目录中的一个文件夹。系统加载linux内核后,就会挂在一个存储设备到根目录。存在与这个设备中的文件系统被称为根文件系统。所有的系统命令、系统配置及其他文件系统的挂载点都位于这个根文件系统中。

       根文件系统通常存放于内存和 Flash 中,或是基于网络的文件系统。根文件系统中存放了嵌入式系统使用的所有应用程序、库以及其他需要用到的服务。

        根文件系统顶层目录结构图。

       

  通常的linux系统会包含以上目录,但嵌入式系统中需要精简化根文件系统,可忽略下列目录.

  

为什么需要根文件系统
(1)init进程的应用程序在根文件系统上
(2)根文件系统提供了根目录/
(3)内核启动后的应用层配置(etc目录)在根文件系统上。几乎可以认为:发行版=内核+rootfs
(4)shell命令程序在根文件系统上。譬如ls、cd等命令

总结:一套linux体系,只有内核本身是不能工作的,必须要rootfs(上的etc目录下的配置文件、/bin /sbin等目录下的shell命令,还有/lib目录下的库文件等···)相配合才能工作。


扫描二维码关注公众号,回复: 1505860 查看本文章
根文件系统的制作过程

      1).通过busybox工具,生成/bin、/sbin、linuxrc、/usr/bin、/usr/sbin.

      2).使用交叉编译工具链,构建/lib目录.

      3).创建其他空目录.

      4).配置etc目录,并初始化/dev目录.

      5).利用工具制作根文件系统映像文件.


制作根文件系统 
通过使用busybox工具制作几个重要的文件,和可执行文件目录.

http://www.busybox.net/ 下载busybox源代码.
tar xjvf busybox-x.x.x.tar.bz2解包
修改Makefile: 

                ARCH   ?=

                CROSS_COMPILE   ?=

                根据自己的开发环境进行配置.  

make menuconfig配置busybox.

        

        Settings部分,主要编译和安装busybox的一些选项。这里主要需要配置:

        1].Build Options -- Build BusyBox as a static binary (no shared libs),表示编译busybox时,是否静态链接C库。我们选择动态链接C库。 

        2].Installation Options -- Applets links (as soft-links) -- (X) as soft-links,表示安装busybox时,将各个命令安装为指向busybox的软链接还是硬链接。我们选择软链接。

        3].Installation Options -- (/work/nfs_root/fs_mini3) BusyBox installation prefix,表示busybox的安装位置。我们选择/work/nfs_root/fs_mini3  

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

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

        1].选中Networking Utilities -- httpd下的Enable -u <user> option,以启用http服务器的功能allows the server to run as a specific user 

         5) 编译安装 : make ; make install .

          安装完后在_install就可以看到bin/、sbin/、目录下的命令了.

    

        

构建lib/库

        lib 目录是存放应用程序所需要的库文件,我们还需要根据应用程序需要拷贝相应的库文件。

        下面是lib库的分类:

1].目标文件,*.o,用于gcc链接可执行文件.
2].libtool库文件(.la),在链接库文件时这些文件会被用到,比如他们列出了当前库文件所依赖的其它库文件,程序运行时无需这些文件.
3].gconv目录,里面是各种链接脚本,在编译应用程序时,他们用于指定程序的运行地址,各段的位置等
4].静态库文件(.a),例如libm.a,libc.a  
5].动态库文件 (.so、.so.[0-9]*).  
6].动态链接库加载器ld-2.3.6.so、ld-linux.so.2  

7].其它目录及文件  

        很显然,第1、2、3、4、7类文件和目录是不需要拷贝的。  由于动态链接的应用程序本身并不含有它所调用的C库函数的代码,因此执行时需要动态链接库加载器来为它加载相应的C库文件,所以第6类文件是需要拷贝的。  除此之外,第5类文件当然要拷贝。但第5类文件的大小也相当大。

        那有必要全部拷贝吗,其实,需要哪些库完全取决于要运行的应用程序使用了哪些库函数。如果我们只制作最简单的系统,那么我们只需要运行busybox这一个应用程序即可

        通过交叉编译工具readelf可查看我们的busybox应用依赖了哪些库文件.

                       

         可以看到busybox只用到了2个库,所以我们只需要拷贝这三个库:通用C库(libc)、数学库(libm)、动态链接库加载器(ld).

         我们将这些库拷贝进lib/  注意下文件的符号链接.



  

配置etc目录并初始化dev目录.

         1].init进程简介:

          init是Linux系统操作中不可缺少的程序之一,它是一个由内核启动的第一个用户级进程。
     内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。

          /etc目录存放的是系统程序的主配置文件,因此需要哪些配置文件取决于要运行哪些系统程序,所以我们至少要手工编写init的主配置文件inittab。

          系统启动,Linux的内核被载入之后,机器就把控制权转交给内核,linux的内核启动之后,做了一些工作,然后找到根文件系统里面的init程序,并执行它,BusyBox的init进程会依次进行以下工作:

·为init设置信号处理过程

·初始化控制台

·剖析/etc/inittab文件

·执行系统初始化命令行,缺省情况下会使用/etc/init.d/rcS

·执行所有导致init暂停的inittab命令(动作类型:wait)

·执行所有仅执行一次的inittab(动作类型:once)

         

    2].inittab脚本

         inittab文件中每一行的格式如下所示:(busybox的根目录下的example文件夹下有详尽的inittab文件范例)     

 <id>:<runlevels>:<action>:<process>

     <id>:子进程使用的控制台(标准输入、标准输出、标准错误设备)

     <runlevels>: 1到6,表示不同的六个级别

                  init 0 是停机的意思。也就是说可以用这个命令关机。可以相当于shutdown -P now这个命令,就是用这个命令关机的话,终端不会弹出任何提示消息,直接就关机了。 
                  init 1 单用户模式。很多情况下忘了登陆密码或者root密码就在单用户模式下修改。 
                  init 2 多用户,没有 NFS。不知道什么意思,表示没有用过这个命令。 
                  init 3 完全多用户模式。这个经常用,就是文本模式~~~ 
                  init 4 未使用,保留。 
                  init 5 图形界面 
                  init 6 重启命令。相当于shutdown -r now。

     <action>:init如何控制子进程。

动作 说明
sysinit 系统启动后最先执行,  只执行一次,init进程等待它结果才继续执行其他动作.
wait 系统执行完sysinit进程后执行,只执行一次,init进程等待它结束后才继续执行其他动作 
once 系统执行完wait进程后执行,init进程不会等待它结束.
respawn    启动玩once进程后执行,init进程监测其子进程退出时,重新启动它.  
askfist 启动完respawn进程后执行, 与respawn类似,不过init进程先输出"Please press Enter to activate this console".等用户输入回车后才启动子进程.
shutdown      当系统关机或重启时执行.
restart Busybox中配置了CONFIG_FEATURE_USE_INITTAB,并且init进程接收到SIGUP信号时执行,现重新读取,解析/etc/inittab,在重新执行restart程序.
ctrlaltdel 当按下ctrl+alt+del组合键时执行.


            <process>:可以是要执行的脚本,也可以是程序。

   3]. inittab样例
        ::sysinit:/etc/init.d/rcS
        ::respawn:/sbin/getty  115200  tty1
        tty2::askfirst:-/bin/sh
        tty3::askfirst:-/bin/sh
        ::restart:/sbin/init
        ::ctrlaltdel:/bin/umount -a -r


        这个inittab执行下列动作

     ·将/etc/init.d/rcS设置成系统的初始化文件
     ·在115200 bps的虚拟终端tty1上启动一个登陆会话 (注意getty的用法)
     ·在虚拟终端tty2和tty3上启动askfirst动作的shell
     · 如果init重新启动,将/sbin/init设置成它会执行的程序

     ·告诉init,在系统关机的时候执行umount命令卸载所有文件系统,并且在卸载失败时用只读模式冲新安装以保护文件系统。

rcS脚本.

       这是一个脚本文件,可以在里面添加想自动执行的命令。下面第三个图为rcS脚本 :

      mount -a 自动gua载fstab中的文件系统,fstab文件如下.

      

      接着echo打印提示,  最后搜索启动目录init.d/下S[0-9]开头的服务脚本. 如 S80network 里面可以 进行网络配置  ifconfig lo 127.0.0.1.

      

      

    

初始化dev/目录

        这个脚本 写在我们rcS脚本启动的 S00devs 里面了 ,

        

     工具制作jyafss2映像.

         mkfs.jffs2 -d rootfs -l -e 0x10000 -o rootfs_hi3516a_64k.jffs2 

          -d 目录  -l  小端模式 , -e 指定擦除块大小 . -o 输出映像文件名 .

          最后烧写完成根文件系统的制作 .

猜你喜欢

转载自blog.csdn.net/qq_17308321/article/details/79624536