操作系统: 01 2011存档

ext2文件的硬盘layout,看 http://learn.akae.cn/media/ch29s02.html 这篇文章,用od直接看ext2文件系统的二进制信息,最清楚了(当然,看kernel代码也行,但看静态的还是直观一些),文章帮了大忙,可惜不知道作者是谁。

不是每个Group都有super block、group descriptor的,比如一个磁盘划了8个Group,只有Group 0/1/3/5/7 这5个Group是有这两项的,如果Group数更多,那么另有挑选算法。其中super block只占一个block(所以不能创建block小于1k的ext2文件系统,因为太小了super block放不下),group descriptor占一个或多个block。

block bitmap、inode bitmap、inode table是每个Group都有的。

为了支持resize功能(即ext2文件系统可以动态增大)用了一个叫Reserved GDT的结构,它其实就是一个大文件,有自己的inode,自己的data block(包括各个间接块),它占着的位置是group descriptor后面的一些block,这样,如果文件系统动态增大,Reserved GDT就正好腾出一部分空间让group descriptor往下扩展。我刚开始不知道Reserved GDT时用od看二进制layout时还颇为迷惑了一阵——这个巨大且内容跨Group的文件是谁弄的?

ext2文件系统里,软链接其实就是把完整的目录信息放到了inode里,如果这个目录信息大于60个字节(因为inode的长度128个字节也很紧张),就只能让inode指向一个单独分配的block(跟普通文件类似),在此block里面放目录信息。

ext2文件系统还支持“xattr",这个据说是Mac OS里的文件系统最早支持的,后来被NTFS和ext2等学到了。其实就是让inode里的i_file_acl成员为一个block号,这个block里存放着xattr信息(xattr的存放结构参考http://lxr.linux.no/linux+v2.6.26.8/fs/ext2/xattr.c),由于最多就这么一个block,所以ext2里针对一个文件的xattr数量有限制,超过就报错。

ext3文件系统里的super block里有一个成员s_journal_inum,存放着作为journal的文件的inode号,通过这个号就能在inode table里找到对应的inode了。

ext4文件系统开始引入了一种不同于”间接块“的存放结构,叫extent,文章 http://www.ibm.com/developerworks/cn/linux/l-cn-filesrc5/ 有清楚的图示,不过这个图是指比较大的文件了,当文件较小时,ext4_inode里ext4_extent_header后面直接放ext4_extent。从inode里的成员i_flags可以看出此inode是否使用了extent结构(i_flags & EXT4_EXTENTS_FL)。