linux源代码阅读笔记 linux文件系统(转)
linux文件系统:
操作系统的文件数据除了文件实际内容外,还有非常多的属性,如文件权限(rwx)与文件属性(所有者、群组、时间参数等)。
文件系统通常将这两部分数据存放在不同的块。权限属性放到 inode 中,实际数据放到 data block 中。
还有一个超级块(super block)会记录文件系统的整体信息,包括 inode 与block 的数量、使用量等。
inode:记录文件属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码;
block:实际记录文件的内容,若文件太大时会占用多个 block ;
super block:记录文件系统的整体信息,包括inode/block 的总量、使用量、剩余量,以及文件系统的格式与相关信息等。
每个inode与block都有编号,而每个文件系统都会占用一个inode,inode中有文件数据放置的block号码。我们可以找到文件的 inode,然后找出文件所放置数据的block号码,之后读出数据。这种数据访问方式成为索引式文件系统。这种文件系统一般不太需要经常进行磁盘碎片整 理。
而 U 盘等为FAT文件格式,每个block号码都记录在前一个block号码中,因此数据的读取性能较差,用久了得进行碎片整理。
linux的Ext2文件系统一开始就将 inode 与block规划好了,除非重新格式化(或者利用resize2fs等命令更改文件系统大小),否则 inode 与block 固定后就不再变动。
如果文件系统太大,将所有的inode 与 block 放在一起很难管理,因此Ext2文件系统在格式化的时候基本上是区分为多个块组(block group),每个块组都有独立的inode/block/super block系统。
data block (数据块)
Ext2 文件系统支持的block 有 1K,2K,4K三种。在格式化时 block已经固定,且每个block都有编号。但要注意,由于block大小不同,会导致该文件系统能够支持的最大磁盘容量与最大单一文件容量并不相同。
使用的block太小,则一个文件要用多两个block,inode 记录也会增加,降低读写性能。
若block太大,文件小的时候则会使剩余空间不能用了,会浪费资源。
inodetable (inode表格)
再说一下inode.inode记录的文件数据至少要包含以下内容:
该文件的访问模式;
该文件的所有者与所有组;
该文件的大小;
该文件的创建或者状态改变时间(ctime);
最近一次的读取时间(atime);
最近修改时间(mtime);
该文件真正内容的指向。
inode 还有一下特色:
每个inode大小均固定为 128bytes;
每个文件都会占用一个inode;
系统读文件时需要先找到 inode,并分析inode所记录的权限与用户是否符合,若符合才能够读取 block的内容。
但是有一个问题,需要记录的文件属性特别多,而且一个文件可能有很多很多block,而inode又太小(记录一个block要用4byte),怎么 办?linux的解决办法是:将inode记录block号码的区域定义为12个直接、一个间接、一个双间接与一个三间接记录区。总共可记录的block 数量为: 12+256+256*256+256*256*256(K)=16G 这只符合block大小为1K时的情况。
Superblock (超级块)
这里面记录文件系统的整体情况。比如文件系统的挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等。还有一个validbit数值,若此文件系统已经被挂载,validbit的值为 0 ,若未被挂载,则validbit值为 1 。
了解了文件系统的概念之后,当然是要查看这个文件系统,用下面的命令:
#dumpe2fs [-bh] 设备文件名
-b 列出保留为坏道的部分
-h 仅列出superblock的数据,不会列出其他的区段内容。
例如:
#dumpe2fs /dev/hdc2