免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 549 | 回复: 0
打印 上一主题 下一主题

文件系统的制作 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-23 10:49 |只看该作者 |倒序浏览

                               
                               
                                               
                                               
                                               
                               
               
               
                               
                                                前言
                               
                                :
                               
                                               
                                               
                               
               
               
                                  文件系统的制作其实并没有想像中那么难。一个基本的文件系统应该包括:
                                busybox
                                (提供
                                shell
                                命令集)、配置文件(用来初始化和布局你的文件系统)、设备文件(如果是用
                                devfs
                                的话这个就免了)、必要的库文件系统(如果
                                busybox
                                是静态编译的话,那根本不用为
                                busybox
                                用到的库文件而烦。在我制作的文件系统里,只是为了用户程序和
                                qt
                                的运行才放置了一些库文件)。
                               
                                               
                                               
                               
               
               
                               
                                                 
                               
               
               
                               
                                                正文
                               
                                :
                               
                                               
                                               
                               
               
               
                               
                                                一、
                               
                                首先说一下
                                busybox
                                的配置和编译问题
                               
                                               
                                               
                               
               
               
                                其实搞好
                                busybox
                                后,可以说你的文件系统已经完成了一半了。
                                Busybox
                                之所以比较难编译,主要是
                                busybox
                                和交叉编译工具的版本搭配问题。在文坛上不乏因为
                                busybox
                                某些命令不能编译通过而烦的人,在这里我推荐一个搭配:
                                busybox-1.1.3+arm-linux-gcc-3.3.2
                                (在文坛上看到过有人说
                                busybox-1.0.1+arm-linux-gcc-3.4.1
                                也可以正常编译通过,你自己看着办吧)。
                               
                                               
                                               
                               
               
               
                                Busybox
                                的配置很简单,详细过程可以参考《基于
                                S3C2410
                                的
                                Linux
                                全线移植文档》的文件系统部分,我刚开始的时候就是按照这个来做出一个很简单的文件系统的。
                               
                                               
                                               
                               
               
               
                               
                                                 
                               
               
               
                                不过有一点要特别注意的
                                (shell
                                的配置问题
                                )
                                :
                               
                                               
                                               
                               
               
               
                               
                                                1、要这样配置:
                                               
                                                               
                                                                 
                                               
                                                │ │
                                               
                                                               
                                                                                               Shells  --->     
│       Choose your default shell (ash)  --->      
                                               
                               
               
               
                               
                                                2、如果是这样配置的话,虽然可以生成ash,但不能生成sh:
                                               
                                                               
                                                                 
                                               
                                                │ │       Choose your default shell (none)  --->                        │ │
                                               
                                                               
                                                                 
                                               
                                               
                                                                │ │   
  • ash  
                                                   
                                   
                   
                   
                                    另外,按照他的这种方法做出来的文件系统,运行的时候
                                    shell
                                    并不好有,没有历史记录、自动补全、删除字符的功能,下面介绍如何为它添加这些功能:
                                   
                                                   
                                                   
                                   
                   
                   
                                   
                                                                   Shells  --->
                   
                   
                                    ---   Bourne Shell Options                                       
                                    │
                                   
                                   
                                    │
                                   
                                                   
                                                   
                                   
                   
                   
                                   
                                                       [ ]   Hide message on interactive shell startup                  
                                    │
                                   
                                   
                                    │
                                   
                                                   
                                                   
                                   
                   
                   
                                   
                                                       [ ]   Standalone shell                                            
                                    │
                                   
                                   
                                    │
                                   
                                                   
                                                   
                                   
                   
                   
                                   
                                                      
  •    command line editing                                       
                                    │
                                   
                                   
                                    │
                                   
                                                   
                                                   
                                   
                   
                   
                                   
                                                      
  •      vi-style line editing commands                           
                                    │
                                   
                                   
                                    │
                                   
                                                   
                                                   
                                   
                   
                   
                                   
                                                     
                                   
                                      
                                   
                                                       (15)    history size                                             
                                    │
                                   
                                   
                                    │
                                   
                                                   
                                                   
                                   
                   
                   
                                   
                                                      
  •      history saving                                            
                                    │
                                   
                                   
                                    │
                                   
                                                   
                                                   
                                   
                   
                   
                                   
                                                      
  •      tab completion                                            
                                    │
                                   
                                   
                                    │
                                   
                                                   
                                                   
                                   
                   
                   
                                   
                                                      
  •        username completion                                    
                                    │
                                   
                                   
                                    │
                                   
                                                   
                                                   
                                   
                   
                   
                                   
                                                       [ ]     Fancy shell prompts
                   
                   
                                   
                                                     
                                   
                   
                   
                                    这是我自己试验出来的,网上没有看到过这方面的介绍,在此奉献给大家。
                                   
                                                   
                                                   
                                   
                   
                   
                                   
                                                     
                                   
                   
                   
                                   
                                                    二、
                                   
                                    再来说一下配置文件的问题
                                   
                                                   
                                                   
                                   
                   
                   
                                   
                                                     
                                   
                   
                   
                                    在文件系统中,配置文件主要存放在
                                    /etc
                                    目录里面。《基于
                                    S3C2410
                                    的
                                    Linux
                                    全线移植文档》里面介绍的文件系统由于需要加载文件系统的时候把
                                    /mnt/etc
                                    目录拷贝到
                                    /etc
                                    ,所以不得不使用
                                    /linuxrc
                                    脚本,不过如果是这样的话需要在内核传递参数里设置
                                    init=/linuxrc
                                    ,因为默认是启动
                                    /sbin/init
                                    初始化脚本的(
                                    busybox
                                    编译安装以后生成的
                                    linuxrc
                                    文件是指向
                                    /bin/busybox
                                    的符号文件,应该把它删掉,自己重写脚本)。在我做的文件系统里不采用这种方法,所以不用设置
                                    init=/linuxrc
                                    。
                                   
                                                   
                                                   
                                   
                   
                   
                                   
                                                     
                                   
                   
                   
                                    Busybox init
                                    的流程在《构建嵌入式
                                    linux
                                    系统》这本书里面有介绍,我在这简单的说一下:如果不采用
                                    linuxrc
                                    的话就会执行
                                    /sbin/init
                                    脚本(
                                    busybox init
                                    ),它会去分析
                                    /etc/inittab
                                    脚本(如果没有的话就使用它默认的来代替,一般没必要自己为它编写这个脚本,用它默认的就行),然后会执行
                                    /etc/init.d/rcS
                                    命令(在我制作的文件系统里就把配置都写入了这个文件)。
                                   
                                                   
                                                   
                                   
                   
                   
                                   
                                                     
                                   
                   
                   
                                    至于
                                    rcS
                                    这个目录的编写主要是安排哪些目录挂载哪些次级文件系统,比如
                                    /proc
                                    要挂载
                                    proc
                                    文件系统、
                                    /sys
                                    要挂载
                                    sysfs
                                    、
                                    /dev/shm
                                    要挂载
                                    tmpfs
                                    、
                                    /tmp
                                    要挂载
                                    ramfs
                                    等等。此外,还可以让内核重新挂载根文件系统也行,具体可以参考
                                    rcS
                                    这个脚本里面的内容,我的是参考友善的那个来写的。另外,可以在这个脚本里执行一些命令,比如设置
                                    ip
                                    地址、建立符号链接(我为
                                    usb
                                    设备的挂载特意建立了
                                    /dev/sda1
                                    的符号链接)、设置主机名等等。
                                    Busybox init
                                    还会调用
                                    /etc/profile
                                    来设置
                                    PATH
                                    ,具体请看文件。
                                   
                                                   
                                                   
                                   
                   
                   
                                   
                                                     
                                   
                   
                   
                                    在《构建嵌入式
                                    linux
                                    系统》提到了怎样建立和建立哪些设备文件,但因为
                                    devfs
                                    这个东西的存在,我们可以不再为这些设备文件而费心了。因为内核在申请设备的同时会向
                                    devfs
                                    申请相应的设备文件,然后
                                    devfs
                                    会帮我们在
                                    /dev
                                    目录建立相应的设备文件,做到内核使用多少设备就建立多少设备文件,不像以前那样要预先建立一大堆可以你不会用到的设备文件(不过从
                                   
                                                    2.6.12
                                   
                                    内核开始,这个
                                    devfs
                                    选项从内核配置中删除,好像是用
                                    udevfs
                                    之类来代替了,不过很多人还是喜欢用回
                                    devfs
                                    ,而且按现在看来起码它用得还挺不错的)。
                                   
                                                   
                                                   
                                   
                   
                   
                                   
                                                     
                                   
                   
                   
                                    好像没什么好讲了,至于
                                    /lib
                                    目录应该放哪些库文件,我也没有底。如果不运行应用程序,只是运行
                                    busybox
                                    的话根本不用放任何的库,因为我们的
                                    busybox
                                    是静态链接的还记得吧?我在自己的文件系统中存放了
                                    helloworld
                                    应用程序和模块,另外还有一个
                                    led
                                    模块,是用
                                    ioctl
                                    来控制
                                    led
                                    灯的亮和灭的,所以我才加载了一些库,而且是从原来友善的文件系统里面拷过来的。以后如果要运行
                                    qt
                                    的话,还要把
                                    qt
                                    用到的库文件也放进去,这样文件系统就变得挺大的了。
                                   
                                                   
                                                   
                                   
                   
                   
                                   
                                                     
                                   
                   
                   
                                   
                                                    总结
                                   
                                    :
                                   
                                                   
                                                   
                                   
                   
                   
                                    好了,一个简单的文件系统就是如此简单的就可以做出来。不过要做出一个合理的文件系统的话相信还有很多东西要注意,比如根文件系统各目录应该使用什么次级文件系统、配置文件的设计、选用哪些库文件、如何增加用户管理和网络功能
                                    (boa)
                                    等等。网上关于文件系统制作的介绍很少,不过有个不错的方法就是参考人家文件系统的做法来做,我就是参考友善文件系统的做法来做的。在这里提供一个下载文件系统的好地方,里面有很多的文件系统可以给你参考:
                                   
                                                   
    http://husaberg.toby-churchill.com/balloon/releases/v0.7/roots/
                                   
                                    。
                   
                   
                   

    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/63379/showart_504733.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP