挂载一个文件系统中最重要的数据结构有以下3个:
1. file_system_type 要挂载的文件系统类型。
2. super_block其中有怎样获取该文件系统相关数据的方法。
3. vfsmount 这个数据结构起到被挂载文件系统和挂载点文件系统的枢纽所用
这几个数据结构的关系,请着重看下图的红色椭圆形区域:
如果要挂载一个文件系统需要做的工作:
1.查找相应的文件系统类型,such as ext2 ext3 or ntfs or yaffs2 or rootfs etc.
2.查找相应的挂载点,方法:一路摸索,顺藤摸瓜。找到其dentry和inode.
3.生成一个vfsmount,这个数据结构是挂载点目录以及正在挂载的这个文件系统的根目录(依据的数据结构是:mnt_mountpoing和mnt_root)的枢纽(非常重要),并将这个vfsmount放在到hashtable中。这个hashtable的hash值运算依据的是挂载点目录以及挂载点inode.除了挂载到hashtable中外,还要链到父挂载点的子链表中。
放在hashtable的原因是,将来在lookup其内的目录或者文件时,需要根据挂载点的目录和挂载点的inode取hash值快速得到vfsmount。
4.主要的工作完成后,还需要把正在挂载的这个文件系统的根目录的inode和dentry取出来放在内存中,其中dentry的值还要赋给vfsmount的mnt_root.
当然这个第4步骤和第3步骤可能会有混合,主要是为了给vfsmount->mnt_root赋值,所以,需要取该文件系统的根目录。
『贰』 操作系统的内核与文件系统是什么关系
一、什么是文件系统
文件系统指文件存在的物理空间,linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。
Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。这种机制有利于用户和操作系统的交互。
每个实际文件系统从操作系统和系统服务中分离出来,它们之间通过一个接口层:虚拟文件系统或VFS来通讯。VFS使得Linux可以支持多个不同的文件系统,每个表示一个VFS 的通用接口。由于软件将Linux 文件系统的所有细节进行了转换,所以Linux核心的其它部分及系统中运行的程序将看到统一的文件系统。Linux 的虚拟文件系统允许用户同时能透明地安装许多不同的文件系统。
在Linux文件系统中,EXT2文件系统、虚拟文件系统、/proc文件系统是三个具有代表性的文件系统。
二、什么是根文件系统
根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载(mount)的第一个文件系统,内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。我们要明白文件系统和内核是完全独立的两个部分。在嵌入式中移植的内核下载到开发板上,是没有办法真正的启动Linux操作系统的,会出现无法加载文件系统的错误。
那么根文件系统在系统启动中到底是什么时候挂载的呢?先将/dev/ram0挂载,而后执行/linuxrc.等其执行完后。切换根目录,再挂载具体的根文件系统.根文件系统执行完之后,也就是到了Start_kernel()函数的最后,执行init的进程,也就第一个用户进程。对系统进行各种初始化的操作。
根文件系统之所以在前面加一个”根“,说明它是加载其它文件系统的”根“,既然是根的话,那么如果没有这个根,其它的文件系统也就没有办法进行加载的。它包含系统引导和使其他文件系统得以挂载(mount)所必要的文件。根文件系统包括Linux启动时所必须的目录和关键性的文件,例如Linux启动时都需要有init目录下的相关文件,在 Linux挂载分区时Linux一定会找/etc/fstab这个挂载文件等,根文件系统中还包括了许多的应用程序bin目录等,任何包括这些Linux 系统启动所必须的文件都可以成为根文件系统。Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。成功之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件系统。在 Linux 中将一个文件系统与一个存储设备关联起来的过程称为挂载(mount)。使用 mount 命令将一个文件系统附着到当前文件系统层次结构中(根)。在执行挂装时,要提供文件系统类型、文件系统和一个挂装点。根文件系统被挂载到根目录下“/”上后,在根目录下就有根文件系统的各个目录,文件:/bin /sbin /mnt等,再将其他分区挂接到/mnt目录上,/mnt目录下就有这个分区的各个目录,文件。
三、什么是内核
Linux内核就像人的心脏,灵魂,指挥中心。内核是一个操作系统的核心,它负责管理系统的进程,内存,设备驱动程序,文件和网络系统,决定着系统的性能和稳定性。内核以独占的方式执行最底层任务,保证系统正常运行。协调多个并发进程,管理进程使用的内存,使它们相互之间不产生冲突,满足进程访问磁盘的请求等.
操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。但是没有软件来操作和控制它,自身是不能工作的。完成这个控制工作的软件就称为操作系统,在Linux的术语中被称为“内核”,也可以称为“核心”。Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。
四.内核与文件系统的关系
技术上说Linux是一个内核。“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。一个内核不是一套完整的操作系统。一套基于Linux内核的完整操作系统叫作Linux操作系统,或是GNU/Linux。
文件系统是kernel的一部分。文件系统实现了系统上存储介质和其他资源的交互。kernel tree中的fs目录都是关于文件系统的,可以说它是kernel的一个大子系统。
嵌入式系统在flash中分配了存放内核、根文件系统的区域。bootloader加载了内核,内核启动,加载文件系统,进入Linux系统。
整个嵌入式系统而言,可以分为三个部分1.uboot 2.kernel 3.文件系统。其中kernel中以VFS去支持各种文件系统,如yaffs,ext3,cramfs等等。yaffs/yaffs2是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。在内核中以VFS来屏蔽各种文件系统的接口不同,以VFS向kernel提供一个统一的接口。如打开一个文件时统一使用open,写时采用write,而不用去考虑是那种文件系统,也不用去考虑文件系统是如何将数据写入物理介质的。其中 kernel中的配置,只是让VFS支持这种接口。
『叁』 什么是根文件系统
问题一:什么是根文件系统 Linux、UNIX操作系统中,mount(挂接)在 / 目录(也就是根目录)上的磁盘分区,叫做根文件系统。(也有人叫:root分区、root文件系统)
问题二:什么是根文件系统 根文件系统首先是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。
问题三:什么是根文件系统 根文件系统首先是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。
Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。成功之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件系统。
在Linux中,必须要有一个根文件系统的概念。根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载(mount)的第一个文件系统,内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。
mount是Linux下的一个命令,它可以将分区挂接到Linux的一个文件夹下,从而将分区和该目录联系起来,因此我们只要访问这个文件夹,就相当于访问该分区了。 目前mount已经不仅仅局限于Linux了。在Windows系统下的应用也越来越广了,多用在虚拟光驱类软件上,比如Clone CD,Daemon tool,WinMount等。
根文件系统在系统启动中到底是什么时候挂载的呢?先将/dev/ram0挂载,而后执行/linuxrc.等其执行完后。切换根目录,再挂载具体的根文件系统.根文件系统执行完之后,也就是到了Start_kernel()函数的最后,执行init的进程,也就第一个用户进程。对系统进行各种初始化的操作。
根文件系统之所以在前面加一个”根“,说明它是加载其它文件系统的”根“,既然是根的话,那么如果没有这个根,其它的文件系统也就没有办法进行加载的。它包含系统引导和使其他文件系统得以挂载(mount)所必要的文件。
问题四:什么是根文件系统 下面是从Undertanding the linux kernel 3rd摘录的 12.4. Filesystem Handling Like every traditional Unix system, Linux makes use of a system 's root filesystem : it is the filesystem that is directly mounted by the kernel ring the booting phase and that holds the system initialization scripts and the most essential system programs. Other filesystems can be mountedeither by the initialization scripts or directly by the userson directories of already mounted filesystems. Being a tree of directories, every filesystem has its own root directory. The directory on which a filesystem is mounted is called the mount point. A mounted filesystem is a child of the mounted filesystem to which the mount point directory belongs. For instance, the /proc virtual filesystem is a child of the system 's root filesystem (and the system 's root filesystem is the parent of /proc). The root directory of a mounted filesystem hides the content of the mount point directory of the parent filesystem, as well as the whole subtree of the parent filesystem below the mount point.简单的来说,我认为根文件系统就是一种目录结构,那么根文件系统和普通的文件系统有什么区别呢?我认为根文件系统就是要包括Linux启动时所 必须的目录和关键性的文件,例如Linux启动时都需要有init目录下的相关文件,在Linux挂载分区时Linux一定会找/etc/fstab这个 挂载文件等,根文件系统中还包括了许多的应用程序bin目录等,任何包括这些Linux系统启动所必须的文件都可以成为根文件系统。 Linux支持多种文件系统类型,在嵌入式上常用的有:ROMFS,JFFS2,NFS,CRAMFS,YAFFS等等。在Linux系统中是通过mount命令来挂载不同的文件系统。在ARM Linux中常用的文件系统的配置:RAM Disk Driver + EXT2;MTD Driver + JFFS2/YAFFS;NFS;uclinux中常见的文件系统配置为:Blkmem Driver + ROMFS(支持 Nor ......>>
问题五:什么是根文件系统 是文件系统根目录么?就是你分区之后的盘符的首层路径。如:C:/这类的。
问题六:根文件系统的文件系统 (1)jffs2JFFS嵌入式系统文件系统最早是由瑞典 Axis munications公司基于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 Systemyaffs/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:pressed ROM File SystemCramfs是Linux的创始人 Linus Torvalds参与开发的一种只读的压缩文件系统。它也基于MTD驱动程序。在cramfs文件系统中,每一页(4KB)被单独压缩,可以随机页访问,其压缩比高达2:1,为嵌入式系统节省大量的Flash存储空间,使系统可通过更低容量的FLASH存储相同的文件,从而降低系统成本。Cramfs文件系统以压缩方式存储,在运行时解压缩,所以不支持应用程序以XIP方式运行,所有的应用程序要求被拷到RAM里去运行,但这并不代表比 Ramfs需求的RAM空间要大一点,因为Cramfs是采用分页压缩的方式存放档案,在读取档案时,不会一下子就耗用过多的内存空间,只针对目前实际读取的部分分配内存,尚没有读取的部分不分配内存空间,当我们读取的档案不在内存时,Cramfs文件系统自动计算压缩后的资料所存的位置,再即时解压缩到 RAM中。另外,它的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性。由于以上特性,Cramfs在嵌入式系统中应用广泛。但是它的只读属性同时又是它的一大缺陷,使得用户无法对其内容对进扩充。Cramfs映像通常是放在Flash中......>>
问题七:Linux 根文件系统 为什么 重要 没有根,也就没法向上长成树;当然,Linux里的文件系统一般是一棵倒着的树。
既然根对一棵真树那么重要,在Linux里也可以类推了。
根文件系统是其他文件的最终挂载点,没有根文件系统,就像一棵被砍成七零八落的树,乱七八糟了。。。
问题八:什么是linux根文件系统移植 linux文件系统格式挺复杂多样的,如ext、ext2、ext3、ext4、jsf、 、xfs、ReiserFS等。 一般情况下,linux根分区文件系统多数用ext3、ext4,安装时你可以选择。
问题九:Linux内核中有文件系统模块, 那它和根文件系统什么关系哦? linux内核是linux的真实的操作系统,所有的操作系统的相关功能都是由用户接口程序传递到内核由内核来完成的。
linux文件系统是指linux操作系统对整个系统中的所有的数据、文件的管理的一种实现方式。
简单点说:像windows它的文件系统是NTFS文件系统或者FAT文件系统,通过这种方式将windows的各种文件保存在磁盘上,用于存储和访问了。
而linux系统则使用ext这种文件系统来实现。
问题十:Linux 根文件系统 为什么 重要 没有根,也就没法向上长成树;当然,Linux里的文件系统一般是一棵倒着的树。 既然根对一棵真树那么重要,在Linux里也可以类推了。 根文件系统是其他文件的最终挂载点,没有根文件系统,就像一棵被砍成七零八落的树,乱七八糟了。。。如果你还有什么不懂的就去看看《Linux就该这么学》这本书。
『肆』 U-Boot中使用tftp下载文件出现错误TFTPerror:'Accessviol
在进行U-Boot中使用tftp下载文件的操作时,用户遇到了一个问题:在加载根文件系统rootfs-combo.yaffs2到内存时,出现错误提示TFTPerror:'Access violation' (2)。该用户通过制作工具mkyaffs2image生成了rootfs-combo.yaffs2文件,将其拷贝到主机服务器的tftp目录。然而,在U-Boot加载过程中,该错误频繁出现,阻止了正常加载过程。
为了解决问题,用户采取了一系列步骤。首先,确认了使用的mkyaffs2image工具版本与之前相同,并进行了逐字节比较以排除工具版本差异的可能性。接着,从错误代码TFTP error: 'Access violation' (2)中推断可能与文件权限相关。在查看/tftpboot目录下rootfs-combo.yaffs2文件的属性后,发现其权限为600,而用户并不理解为何mkyaffs2image会生成这样的文件权限。
进一步分析后,用户将rootfs-combo.yaffs2文件的权限更改为666,并在U-Boot中重新尝试加载根文件系统,成功解决了问题,使根文件系统能够正常加载到内存。至此,用户的问题得到解决。
『伍』 请问Linux与嵌入式Linux区别是什么谢谢
Linux
Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、台式计算机、大型机和超级计算机。Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
Linux以它的高效性和灵活性著称,Linux模块化的设计结构,使得它既能在价格昂贵的工作站上运行,也能够在廉价的PC机上实现全部的Unix特性,具有多任务、多用户的能力。Linux是在GNU公共许可权限下免费获得的,是一个符合POSIX标准的操作系统。
嵌入式Linux
嵌入式Linux系统就是利用Linux其自身的许多特点,把它应用到嵌入式系统里。随着微处理器的产生,价格低廉、结构小巧的CPU和外设连接提供了稳定可靠的硬件架构,那么限制嵌入式系统发展的瓶颈就突出表现在了软件方面。尽管从八十年代末开始,陆续出现了一些嵌入式操作系统,比如著名的有:Vxwork、pSOS、Neculeus和WindowsCE。
Linux做嵌入式的优势:首先,Linux是开放源代码的,不存在黑箱技术,遍布全球的众多Linux爱好者又是Linux开发者的强大技术支持;其次,Linux的内核小、效率高,内核的更新速度很快;最后,Linux是免费的OS,在价格上极具竞争力。
Linux和嵌入式Linux有什么区别?
硬件平台:嵌入式Linux一般是Mips,ARM平台;桌面Linux一般是X86平台。
根文件系统:嵌入式Linux一般用UBIFS,yaffs2,jffs2;桌面Linux一般用ext3。
shell不同:嵌入式Linux一般用busybox,桌面Linux一般用bash。
『陆』 怎么将在linux下压制的yaffs2格式的.img还原
为了在虚拟机Ubuntu中挂载nfs成功,期间遇到了很多的问题。今天挂载成功后,才觉得那些问题中有很多都是可以避免的。但也许从另一个角度来讲,也是在锻炼自己的能力。先说一说主要的步骤,然后我就说说要挂载成功的几个关键地方吧,你挂载不成功,很有可能就是这几个关键地方没有做好。
首先第一步就是要为开发板烧写uboot和kernel。
1.先将SD卡格式化为FAT32格式。将启动代码固化到SD卡中。
能出现的问题:1 volume erro之类的。
解决方法:重新插拔SD卡,某些情况下可能要换一张SD卡试一试。
2.下载Uboot到nandflash中并设置Uboot工作参数。注意的就是串口和波特率要设置对。
可能出现的问题:
1.ARNING: OEMMultiBINNotify: Invalid BIN region descriptor(s).
Don't support raw image
解决方法:这种情况请注意选这从USB Port-->UBOOT-->UBOOT”,注意是选Uboot,而不是选transmit。
2.无法将uboot写进nandflash
解决方法:请一直按着ENTER键,直到OK出现。(这一般是nand erase没有干净,一定要等到OK出现。如果不出现,说明没有擦除干净)
3.烧写Kernel。
可能出现的问题一般同上面的2,注意我说的几点即可。
4.安装根文件系统,也是非常重要的一步。如果你要安装yaffs2文件,这其中又会涉及要挂在NFS。
假设我们要安装的是yaffs2文件。
首先第一步:安装NFS
『柒』 如何制作CRAMFS + YAFFS2文件系统的相关推荐
如何制作CRAMFS + YAFFS2文件系统
1.文件系统简述
随着32位CPU价格不断下跌,片上存储设备的容量相比越来越大,越来越多的嵌入式系统开始应用各种嵌入式操作系统。一般在嵌入式领域,只要应用到操作系统的必然会需要一个,甚至是多个文件系统。所谓文件系统,实际上就是在一个具体的存储设备上任何文件的组织和目录。这个设备可能是各种RAM、NAND FLASH、NOR FLASH等DOC设备,还有以NAND FLASH 为基础的各种存储卡等[1]。目前,针对不同的设备和应用有很多文件系统可供选择,例如EXT2、TEMPFS、RAMDISK、CRAMFS、JFFS1/2、YAFFS1/2、XFS等。除此之外,还有很多供应商提供的商用文件系统。
选择文件系统,要根据具体应用的需求。一般,首先要考虑的就是可靠性,健壮性和增强的需求。如果是像工控这样的不需经常更新控制程序的应用来说,我们选择CARAMFS这样的只读文件系统已经足够了,而且它还可以带来的另外一个好处就是CRAMFS的压缩率高达50%,可以大大节省我们的存储空间。但是如果是像涉及到数据采集这类需要保存数据的应用来说,只读的文件系统就很难满足应用系统的需求,我们可以选择JFFS或者YAFFS这样的可读写的文件系统。不过在实际应用中,需要考虑的因素还应该更多。
2.文件系统的实现
2.1文件系统的选择
在本文涉及的应用中,根文件系统并不需要频繁的更改,但是却涉及到一些数据的存取。考虑到的存储设备是NAND FLASH,所以在根文件系统格式的选择上可以用压缩率比较高的CRAMFS,而在根文件系统下挂载一个可读写的YAFFS2文件系统。
YAFFS2(Yet Another nandFlash FileSytem2)是专门针对NAND设备的一种文件系统。YAFFS2类似于JFFS/JFFS2文件系统,与YAFFS2不同的是JFFSS1/2文件系统最初是针对NOR FLASH的应用场合设计的。而YAFFS2针对NAND FLASH的特点采用增强的碎片回收和均衡磨损技术,大大提高了读写速度,延长了存储设备的使用寿命[2],可以更好的支持大容量的NAND FLASH芯片。而且在断电可靠性上,YAFFS2的优势更加明显[3]。
2.2建立根文件系统
Linux内核启动以后,根据参数linux_cmd_line的指示跳转到根文件系统的地址,完成文件系统的初始化和挂载任务。根文件系统的建立可以借助各种开发套件来完成,也可以完全由自己搭建一个。这里介绍如何通过开发套件的帮助来完成基本的根文件系统。Busybox是由Bruce Perens发起的一项计划,该计划最初的目的是协助Debian发行套件建立安装磁盘。由于Busybox小巧但功能不失强大,所以在嵌入式系统中有很广的应用。下载Busybox稳定版(www.busybox.net),解压后直接make menuconfig 进入Busybox配置菜单,这个界面根内核差不多。在Applets下面选择你需要命令,然后退出保存, 执行make , make install。在Busybox的目录下就会生成_install目录,这个目录就包含了将要配置的命令的工具包。把这个目录拷贝到工作目录,更名为rootfs, 这个目录就是要建立的根文件系统的雏形——但是它还不能工作,需要进一步的完善。
在rootfs/下,首先在/rootfs/dev下建立必须的设备文件。关于设备的建立,可以参考Filesystem Hierarchy Standard来确定需要的哪些设备文件(http://www.pathname.com/fhs/)。下一步就是完成/rootfs/etc这个目录下的3个比较重要的文件inittab,fstab,init.d/rcS(或者是rc.d/rc.sysinit,这个由inittab决定)。下面给出可供参考的样例:
Inittab文件
#System initialization .
::sysinit:/etc/init.d/rcS
::askfirst:/bin/sh
::restart:/sbin/init
::shutdown:/bin/umount –a –r
::shutdown:/sbin/swapoff –a
Fstab文件
none /proc proc defaults 0 0
tmpfs /temp tmfs defaults 0 0
fstab指定了设备的挂载点。要了解关于fstab文件的格式以及详细信息,可以参考
http://www.tuxfiles.org/linuxhelp/fstab.html
Init.d/rcS文件
#!/bin/sh
Mount –o remount, rw /
/bin/mount –a
>/etc/mtab
Echo “messages”
Hostname “hostname”
在这个脚本中,还可以定义内核的其他一些动作,这在后面挂载YAFFS2文件系统中显得非常有用。
最后,加入需要的链接库文件就可以了。通常这部分会比较麻烦,因为你并不知道你的应用具体需要哪些库文件,可以通过两种途径解决这个问题:一是利用工具readelf来找出应用程序依存哪些链接库;二是参考linux相关计划网站上的提供的文件系统,来确定需要的链接库文件[4]。
2.3制作YAFFS2文件系统
根文件系统做好后,可以通过NFS(http://nfs.sourceforge.net/nfs-howto/)来测试文件系统是否可行,但是最后我们还是要把这个文件系统烧进目标板。
可以有两种方式来应用YAFFS2文件系统,一是CRAMFS+YAFFS2的组合,一种是纯YAFFS2文件系统格式。由于在笔者的应用中,内核和根文件系统并不需要频繁更新,所以从节省存储空间和保护根文件系统的角度来考虑,我们选用CRAMFS这样的高压缩率、只读文件系统,而应用程序,用户空间使用YAFFS2文件系统格式。
对于CRAMFS,可以直接用mkcramfs /rootfs ~/root.img来制作cramfs镜像,/rootfs是前面建立的根文件系统目录,~/root.img指定做好镜像的保存目录。由于YAFFS2文件系统当初设计就是针对nand设备的,在笔者的应用中,文件系统是在NANDFLASH中启动,因此要使用YAFFS2文件系统,就必须先在内核添加NAND设备驱动[5],并修改arch\arm\mach-s3c2410\devs.c文件,增加nand flash分区。一般情况下bootloader, kernel, root 三个分区是必须的,也有的加了param分区来保存内核参数,user分区来作为用户空间的,但是也可以不要。
在www.aleph.co.uk下载YAFFS2(GPL)源码,解压后在YAFFS2目录下执行
patch-ker.sh ~/Linux2.6.14.2
~/Linux2.6.14.2是内核的路径,笔者的内核是2.6.14.2。patch后在内核的fs目录下就会生成yaffs2目录,这样内核就已经得到YAFFS2的支持了。
接下来make menuconfig ,配置内核时在
Device Drivers->
Memory Technology Device (MTD)->
下选中MTD Partitioning Surpport,这样我们的分区信息才有效。在
File System->
Miscellaneous filesystems->下配置YAFFS2如下:
<>EFS file system support(read only) (EXPERIMENTAL)
<*>YAFFS2 file system support
— 512 byte / page devices
[*]Lets Yaffs do its own ECC
[*]Use the same ecc byte order as Steven Hill’s nand_ecc.c
— 2048 byte (or larger) / page devices
[*]Autoselect yaffs2 format
[*]Disable lazy loading
[*]Turn off wide tnodes
[*]Turn off debug chunk erase check
[*]Cache short names in RAM
<>Jounalling Flash File System (JFFS) support
保存配置,退出,执行make。Make结束后就得到了一个具备挂载yaffs2文件系统能力的内核镜像。
在bootloader源文件中,将nand flash分成几个分区,前面提到的devs.c文件里的分区也必须与bootloader的分区一致,因为bootloader指定了内核和文件系统的地址,最后启动时也会到相应的地址寻找指令。在我们的应用中,将flash分成bootloader, param, kernel, root, user。其中root用来挂载CRAMFS根文件系统,user分区挂载YAFFS2文件系统。
在YAFFS2源文件的utils目录下,执行make就可以生成 mkyaffs2image工具,执行
./mkyaffs2image (要制作yaffs2的目录) (目标镜像)
生成yaffs2文件系统,不过因为前面根文件系统是CRAMFS格式,YAFFS2可以作为模块来加载,这样更加方便,更加灵活。加载模块也可以在后面给出的脚本中定义。
最后一步就是要让内核在启动后挂载文件系统,挂载文件系统有两种方式:手动和自动挂载。在实际应用中当然是要系统在无需人工干预的情况下自动挂载文件系统。在Debian系统中,初始化脚本是/etc/init.d/rcS,在Rad Hat中是/etc/rc.d/rc.sysinit。这里面包含了装入文件系统,设置时间,打开交换分区,得到主机名等等内容。回顾前面给出的Inittab和init.d/rcS文件就知道,系统的Init进程是如何动作的。对照前面的rcS文件这里给出一个更加详细的并给出注释。
#! /bin/sh //busybox提供的SHELL
PATH=/sbin:/bin:/usr/sbin:/usr/bin //设置系统路径
runlevel=S //运行级别
prevlevel=N
umask 022 //缺省访问权限为022
export PATH runlevel prevlevel
/bin/mount -f -t cramfs -o remount,ro /dev/mtdblock/3 /
//cramfs作为根文件系统挂到第四个分区下,即root分区。
/sbin/insmod -f /lib/yaffs2.ko //加载yaffs2模块
/sbin/mount -t yaffs2 /dev/mtdblock/4 /usr //yaffs2挂到第五个分区,作为/usr
/sbin/mount -t proc none /proc //mount命令由busybox提供
/sbin/mount -t tmpfs none /root //挂载tmpfs到指定目录,下同
/sbin/mount -t tmpfs none /tmp
/sbin/mount -t tmpfs none /var
/sbin/mkdir -p /var/lib //创建目录
/sbin/mkdir -p /var/run
/sbin/mkdir -p /var/log
/etc/rc.d/init.d/leds start //初试用户程序leds
/sbin/ifconfig lo 127.0.0.1 //指定lo设备的IP地址为127.0.0.1
#/sbin/ifconfig eth0 192.168.0.2
/sbin/hostname -F /etc/sysconfig/HOSTNAME //指定主机名文件路径.
将文件系统烧进目标板对应分区,boot,即可运行。至此,目标板可以通过/usr进行读写文件,目标板完成对yaffs2的支持。
3.结束语
YAFFS2可靠的掉电保护和高效率的读写以及对nand存储设备的保护等优势使得它在越来越多的嵌入式系统中取得应用。在本文的应用中,YAFFS2在Linux下表现了良好的性能。