根文件系统(二)

14 篇文章 2 订阅

根文件系统怎么挂接的?

       我们常常说内核起来之后会第一个挂接根文件系统,这个根文件系统就是我们制作的吗?其实。。。并不是!

       仔细想一想,我们自己制作的根文件系统放在哪???在存储介质上,flash、硬盘、u盘等,那么我们怎么去访问它呢?我们平常读取存储介质中的文件,需要使用文件系统通过挂载点(mount /dev/xxx /mnt)才能获取介质中文件,同样,挂接我们自己做的根文件系统也要这样做,其根因是VFS,我们无法直接去读取介质中文件。

       通过上面所述,就知道了矛盾的地方,我们想要挂载自己制作的根文件系统,就必须通过文件系统和挂载点,但是内核起来的时候可没有文件系统,所以就出现了rootfs!kernel启动时,它把rootfs作为它的第一个文件系统挂载(注意:这里的rootfs是真名!!!不是root filesystem的缩写)。rootfs是一个特殊的tmpfs,这个不能被删除或者是unmounted,它是由系统创建的,不存储在介质中!

       rootfs被挂载后建立、并且挂载于自己超级块(包括目录项dentry和i节点inod)对应的目录项,设置了系统current根目录和根文件系统、pwd的目录和文件系统,这时已经可以访问存储介质了。

       然后就解压内核尾部附加的CPIO归档文件或initrd指定的gzip压缩CPIO归档文件到rootfs。每个内核都会执行这一步,但是默认那个压缩档是空的(内核未开启支持initramfs,文件路径也为空,iniitrd也未指定),所以也就没有往rootfs内添加任何东西。

       接着kernel会尝试在rootfs去找寻/init,一旦找到init并执行,kernel也就完成了启动工作,然后便是刚刚执行的init程序接管了接下来的工作。如果kernel没法调用"/init"程序,就会回过头去按照标准的做法解析参数“root=”,试图找到另一个file system然后挂载它。

所以可以将内核挂载文件系统的过程总结如下:

        (1)内核挂载特殊的rootfs。

        (2)将内核尾部 附加的CPIO归档文件或initrd设置的gz压缩CPIO归档文件 释放到rootfs,然后在rootfs找init程序,如果存在则执行init程序,那么rootfs就是最后的根文件系统

        (3)如果不存在,则会去解析“root=”参数,找到并挂载存储介质中的根文件系统到rootfs的/root目录,并将系统current的根目录切换为/root、系统current的根文件系统切换为磁盘文件系统。

        注意:一般而言,rootfs特殊文件系统没有被卸载,它只是隐藏在基于磁盘的根文件系统下了。

根文件系统分类

       根据存储设备的硬件特性、系统需求,不同的文件系统类型有不同的应用场合,以下是分配图:

 

(1)基于flash的文件系统

1) jffs2

        JFFS文件系统最早是由瑞典Axis Communications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2是RedHat公司基于JFFS开发的闪存文件系统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所以JFFS2也可以用在Linux, uCLinux中。

        Jffs2: 日志闪存文件系统版本2 (Journalling Flash FileSystem v2)

        主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。

        目前jffs3正在开发中。关于jffs系列文件系统的使用详细文档,可参考MTD补丁包中mtd-jffs-HOWTO.txt。

        jffsx不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致jffs为维护日志节点所占用的内存空间迅速增大,另外,jffsx文件系统在挂载时需要扫描整个FLASH的内容,以找出所有的日志节点,建立文件结构,对于大容量的NAND闪存会耗费大量时间。

2) yaffs:Yet Another Flash File System

        yaffs/yaffs2是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。与jffs2相比,它减少了一些功能(例如不支持数据压缩),所以速度更快,挂载时间很短,对内存的占用较小。另外,它还是跨平台的文件系统,除了Linux和eCos,还支持WinCE, pSOS和ThreadX等。

        yaffs/yaffs2自带NAND芯片的驱动,并且为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD与VFS,直接对文件系统操作。当然,yaffs也可与MTD驱动程序配合使用。

        yaffs与yaffs2的主要区别在于,前者仅支持小页(512 Bytes) NAND闪存,后者则可支持大页(2KB) NAND闪存。同时,yaffs2在内存空间占用、垃圾回收速度、读/写速度等方面均有大幅提升。

3) Cramfs:Compressed ROM File System

        Cramfs是Linux的创始人 Linus Torvalds参与开发的一种只读的压缩文件系统。它也基于MTD驱动程序。

        在cramfs文件系统中,每一页(4KB)被单独压缩,可以随机页访问,其压缩比高达2:1,为嵌入式系统节省大量的Flash存储空间,使系统可通过更低容量的FLASH存储相同的文件,从而降低系统成本。

        Cramfs文件系统以压缩方式存储,在运行时解压缩,所以不支持应用程序以XIP方式运行,所有的应用程序要求被拷到RAM里去运行,但这并不代表比Ramfs需求的RAM空间要大一点,因为Cramfs是采用分页压缩的方式存放档案,在读取档案时,不会一下子就耗用过多的内存空间,只针对目前实际读取的部分分配内存,尚没有读取的部分不分配内存空间,当我们读取的档案不在内存时,Cramfs文件系统自动计算压缩后的资料所存的位置,再即时解压缩到RAM中。

        另外,它的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性。

        由于以上特性,Cramfs在嵌入式系统中应用广泛。但是它的只读属性同时又是它的一大缺陷,使得用户无法对其内容对进扩充。Cramfs映像通常是放在Flash中,但是也能放在别的文件系统里,使用loopback 设备可以把它安装别的文件系统里。

4)Romfs

        传统型的Romfs文件系统是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存,按顺序存放数据,因而支持应用程序以 XIP(eXecute In Place,片内运行)方式运行,在系统运行时,节省RAM空间。uClinux系统通常采用Romfs文件系统。

        其他文件系统:fat/fat32也可用于实际嵌入式系统的扩展存储器(例如PDA, Smartphone, 数码相机等的SD卡),这主要是为了更好的与最流行的Windows桌面操作系统相兼容。ext2也可以作为嵌入式Linux的文件系统,不过将它用于 FLASH闪存会有诸多弊端。

(2)基于RAM的文件系统

1)Ramdisk

        Ramdisk是将一部分固定大小的内存当作分区来使用。它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性能。(若ramdisk没有满,已被占用的额外的内存也不能用来做其它事,若ramdisk满了,但其它仍有闲置的内存,也必须重新格式化后才能扩展使用)

        在Linux的启动阶段,initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存。

2)Initramfs

        基于RAM的文件系统-Initramfs 出现在2.6内核中,它类似于tmpfs,是一种基于内存的文件系统,它的使用不需要创建内存块设备。增加文件到ramfs(或增大原有的文件)会自动配置更多的内存,并删除或截去文件以释放内存。

        以上两种文件系统均可以附加到内核尾部或 initrd 指定加载,它们会在特殊的rootfs加载后释放到rootfs。

它们的缺点是当系统重新引导时会丢失所有数。

(3)基于nfs的文件系统

        NFS是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值