Linux文件系统的制作和分析初步

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Linux根文件系统FrancHE文件系统是基于被划分的存储设备上的逻辑上单位上的一种定义文件的命名、存储、组织及取出的方法。如果一个Linux没有根文件系统,它是不能被正确的启动的。因此,我们需要为Linux创建根文件系统,我们将其创建在K9S1208NANDFLASH上。Linux文件系统的发展和类型Linux根文件系统的内容Busybox(嵌入式系统的瑞士军刀)制作Linux根文件系统的方法Cramfs简介VFS(VirtualFileSystem)文件系统Ext2文件系统Linux文件系统编程基础以下指的都是在物理设备上存在的,用于管理文件(节点)的文件系统,区别于虚拟文件系统(VFS):Extfs是第一个专门为Linux设计的文件系统类型,叫做扩展文件系统。它在1992年4月完成,为Linux的发展做出了重要的贡献。但因为在性能和兼容性上存在许多缺陷,现在已经很少使用了。Ext2fs是为解决ext文件系统的缺陷而设计的可扩展的高性能的文件系统,又被称为二级扩展文件系统。它是在1993年发布的,设计者是ReyCard。ext2是Linux文件系统类型中使用最多的格式。Ext3文件系统是直接从Ext2文件系统发展而来。目前Ext3文件系统已经非常稳定可靠,它完全兼容Ext2文件系统,用户可以平滑地过渡到一个日志功能健全的文件系统。Ext3日志文件系统的思想就是对文件系统进行的任何高级修改都分两步进行。首先,把待写块的一个副本存放在日志中;其次,当发往日志的I/O数据传送完成时(即数据提交到日志),块就写入文件系统。当发往文件系统的I/O数据传送终止时(即数据提交给文件系统),日志中的块副本就被丢弃。(提高了可靠性)JFS由IBM公司开发,最初出现在AIX操作系统之上,它提供了基于日志的字节级、面向事务的高性能文件系统。它具有可伸缩性和健壮性,与非日志文件系统相比,它的优点是其快速重启能力:JFS能够在几秒或几分钟内就把文件系统恢复到一致状态。JFS是完全64位的文件系统。所有JFS文件系统结构化字段都是64位大小。这允许JFS同时支持大文件和大分区。JFFS2是一个开放源码的项目。它是在闪存上使用非常广泛的读/写文件系统,在嵌入式系统中被普遍的应用。Msdos:msdos是在Dos、Windows和某些OS/2操作系统上使用的一种文件系统,其名称采用“8+3”的形式,即8个字符的文件名加上3个字符的扩展名。iso9660:标准CDROM文件系统,通用的RockRidge增强系统,允许长文件名。Vfat:vfat是Windows9x和WindowsNT/2000下使用的一种Dos文件系统,其在Dos文件系统的基础上增加了对长文件名的支持。Nfs:Sun公司推出的网络文件系统,允许多台计算机之间共享同一文件系统,易于从所有这些计算机上存取文件。Smb:smb是一种支持Windowsforworkgroups、WindowsNT和LanManager的基于SMB协议的网络文件系统。Proc:proc是Linux系统中作为一种伪文件系统出现的,它用来作为连接内核数据结构的界面。NTFS:微软WindowsNT内核的系列操作系统支持的、一个特别为网络和磁盘配额、文件加密等管理安全特性设计的磁盘格式。Cramfs:它是一种只读的闪存文件系统。在本课中,我们重点将讲述如下文件系统的制作和使用:VFS,cramfs,ext2Linux的根文件系统可能包括如下目录(或更多的目录):(1)/bin(binary):包含着所有的标准命令和应用程序;(2)/dev(device):包含外设的文件接口,在Linux下,文件和设备采用同种地方法访问的,系统上的每个设备都在/dev里有一个对应的设备文件;(3)/etc(etcetera):这个目录包含着系统设置文件和其他的系统文件,例如/etc/fstab(filesystemtable)记录了启动时要mount的filesystem;(4)/home:存放用户主目录;(5)/lib(library):存放系统最基本的库文件(6)/mnt:用户临时挂载文件系统的地方;(7)/proc:linux提供的一个虚拟系统,系统启动时在内存中产生,用户可以直接通过访问这些文件来获得系统信息;(8)/root:超级用户主目录;(9)/sbin:这个目录存放着系统管理程序,如fsck、mount等;(10)/tmp(temporary):存放不同的程序执行时产生的临时文件;(11)/usr(user):存放用户应用程序和文件。(12)/var:该目录中包含经常变化的文件,例如打印机,邮件,新闻等的脱机文件。Linux遵循文件系统科学分类标准(FilesystemHierarchyStandard,FHS),一个定义许多文件和目录的名字和位置的标准,该项标准可以在找到,FHS也是用来组织Linux和Unix文件的方法,它使用Linux文件系统布局实现了标准化采用BusyBox是缩小根文件系统的好办法,因为其中提供了系统的许多基本指令但是其体积很小。众所周知,瑞士军刀以其小巧轻便、功能众多而闻名世界,成为各国军人的必备工具,并广泛应用于民间,而BusyBox也被称为嵌入式Linux领域的瑞士军刀。此地址可以下载BusyBox:,当前最新版本为1.1.3。编译好busybox后,将其放入/bin目录,若要使用其中的命令,只需要建立link,如:ln-s./busyboxlsln-s./busyboxmkdir我们将使用busybox1.1.1创建根文件系统的过程我们将使用“制作busybox的过程”作为一个课堂练习。在这个课堂练习中,我们将使用工具建立两个根文件系统,一个是cramfs,一个是ext2。BusyBox代码的简要分析在我们的系统中,busybox的入口函数是:busybox.c:main(),他将解析链表得到要执行的入口函数的名称和地址。BusyBox代码的简要分析在我们的系统中,init的入口函数是:init_main,它将作如下操作console_init();//挂接串口if(device_open(console,O_RDWR|O_NOCTTY)==0){set_term(0);close(0);}//打开串口chdir(“/”);//改变目录到“/”message(MAYBE_CONSOLE|LOG,“initstarted:%s”,bb_msg_full_version);//打出运行到这里的标志接下来,程序将进入parse_inittab()1)这个函数将会安装各种突发事件的处理函数(action)。2)所有的signal的处理过程是这样的,假设系统发一个SIGUSR2,系统自动回调用halt_signal,函数halt_signal调用shutdown_system,函数shutdown_system调用run_actions(SHUTDOWN),而这个SHUTDOWN在前面已经安装过了:new_init_action(SHUTDOWN,“/bin/umount-a-r”,“”)。3)signal的自动触发需要signals_Init在内核中的预先调用,我们在初始化内核时调用过了。cramfs是一个压缩式的文件系统,它并不需要一次性地将文件系统中的所有内容都解压缩到内存之中,而只是在系统需要访问某个位置的数据的时侯,马上计算出该数据在cramfs中的位置,将其实时地解压缩到内存之中,然后通过对内存的访问来获取文件系统中需要读取的数据。cramfs中的解压缩以及解压缩之后的内存中数据存放位置都是由cramfs文件系统本身进行维护的,用户并不需要了解具体的实现过程,因此这种方式增强了透明度,对开发人员来说,既方便,又节省了存储空间。cramfs拥有以下一些特性:采用实时解压缩方式,但解压缩的时侯有延迟。cramfs的数据都是经过处理、打包的,对其进先写操作有一定困难。所以cramfs不支持写操作,这个特性刚好适合嵌入式应用中使用Flash存储文件系统的场合。在cramfs中,文件最大不能超过16MB。支持组标识(gid),但是mkcramfs只将gid的低8位保存下来,因此只有这8位是有效的。支持硬链接。但是cramfs并没有完全处理好,硬链接的文件属性中,链接数仍然为1.cramfs的目录中,没有“.”和“..”这两项。因此,cramfs中的目录的链接数通常也仅有一个。cramfs中,不会保存文件的时间戳(timestamps)信息。当然,正在使用的文件由于inode保存在内存中,因此其时间可以暂时地变更为最新时间,但是不会保存到cramfs文件系统中去。当前版本的cramfs只支持PAGE_CACHE_SIZE为4096的内核。因此,如果发现cramfs不能正常读写的时侯,可以检查一下内核的参数设置。使用cramfs:可以从下载cramfs-1.1.tar.gz。然后执行tarzxvfcramfs-1.1.tar.gz进入解包之后生成cramfs-1.1目录,执行编译命令:make编译完成之后,会生成mkcramfs和cramfsck两个工具,其中cramfsck工具是用来创建cramfs文件系统的,而mkcramfs工具则用来进行cramfs文件系统的释放以及检查。在我们的smdk2410的板子上,只要使用:mkcramfsrootroot.cramfs就可以创建cramfs格式的文件系统了。VFS概述我们将从/init/main.c中的start_kernel函数开始分析:start_kernel-vfs_caches_init(mempages)-inode_init(mempages)和mnt_init(mempages)这里有两个重要概念inode和block。Inode基本上是指索引节点(通常将会链接成hash表,以方便查找),block一般是具体的物理存储块(可以是内存或者flash)。inode_init将初始化一个文件系统的hash访问表Mnt_init最终将调用do_kern_mount(rootfs,0,rootfs,NULL)对于这个函数:它主要是要挂载根文件系统,主要的工作如下:1)调用alloc_vfsmnt()函数在内存里申请了一块该类型的内存空间(structvfsmount*mnt),并初始化其部分成员变量。2)调用get_sb_nodev()函数在内存中分配一个超级块结构(structsuper_block)sb,并初始化其部分成员变量,将成员s_instances插入到rootfs文件系统类型结构中的fs_supers指向的双向链表中。3)在get_sb_bdev函数中,调用rootfs文件系统中的read_super函数指针调用rootfs_read_super函数。4)rootfs_read_super()函数在内存中分配了一个inode结构(structinode)inode,并初始化其部分成员变量,其中比较重要的有i_op、i_fop和i_sb。注意这里的inode就是根目录(/)的管理信息。以上操作将使得将来通过文件系统调用对VFS发起的文件操作等指令将被rootfs文件系统中相应的函数接口所接管。5)rootfs_read_super()函数在分配和初始化了inode结构之后,会调用d_alloc_root()函数来为VFS的目录树建立起关键的根目录(/)(structdentry)dentry,并将dentry中的d_sb指针指向sb,d_inode指针指向inode。6)将mnt中的mnt_sb指针指向sb,mnt_root和mnt_mountpoint指针指向den

1 / 85
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功