【文件管理】超级块super_block

来源:互联网 发布:梦里花落知多少小说下载 编辑:程序博客网 时间:2024/05/01 07:00

在super_block数据结构中,有个union枚举,对于EXT2,将super_block中的union解释为一个ext2_sb_info;


(1)super_block是内存中的数据结构,其内容通常但并不总是来自具体设备上特定文件系统的超级块;而对于EXT2来说,设备上的超级块ext2_super_block结构;

(2)在ext2_read_super()中,参数sb指向super_block,在调用这个函数之前对该结构已经作了一些初始化,如s_dev表示已经持有具体设备的设备号;但是结构的大部分内容都还是没有设置的,这里要正是从设备上读入超级块并根据其内容设置这个super_block;另一个data,是因文件系统而异的,对于EXT2文件系统它是指向一个表示安装可选项的字符串,slient表示在读超级块的过程中是否详细的报告出错信息;首先是确定设备上记录块的大小,EXT2文件系统的记录块大小一般是1K字节,但是为了提高读写效率,一般采用2K字节或4K字节;预设是BLOCK_SIZE,但是内核中有一个以主设备号为下标的指针数组hardsect_size[],通过次设备号为下标,就可得到该设备的记录块大小;还要通过set_blocksize来进行回写;parse_options是用来分析可选字符串并根据其内容设置一些变量;每种文件系统都有自己的parse_options(),所以这些函数都是静态的,其作用域只是在同一个文件;

(3)超级块通常是设备上的1号记录块(即第二个记录块),所以sb_block_size设置为1,在记录块大小为BLOCK_SIZE的设备上其逻辑块号logic_sb_block;但是在记录块大于BLOCK_SIZE的设备上,由于超级块的大小仍然为BLOCK_SIZE,就要通过计算来确定其所在的记录块以及块内位移,此时超级块只是记录块的一部分了;然后就可以通过bread()来读取超级块到内存了;然后根据读入的超级块重新更新数据,然后还要重新读,主要是为了让缓冲区包含整个记录块,而不只是超级块;在EXT2中,将超级块和所有的块组描述符结构重复于每个块组;


(4)超级块的内容可以通过/sbin/tune2fs -l /dev/hda2来显示的,这个设备上的记录块数是1540097,大约1.5G字节;每个块组的大小为8192,所以块组大小为1540097/8192=188个块组,第一个记录块为引导块;每一个块组有2056个索引节点;所以总共有2056*188=386528个索引节点;记录块大小为1K,可容纳8个索引块。每一个块组有2056/8=257个索引节点,还有7296个数据块,1个超级块,6个块组描述符,1个记录块位图,1个索引节点位图;其中77011的记录块是保留的;一个块记录块描述结构为32B,188*(1K/32B)=6;


(5)在ext2_read_super()中,超级块只是反映了文件系统的组织和管理信息,而不涉及到该文件系统具体的内容;设备上的根目录才是罚款这个文件系统的钥匙;文件系统中的每一个文件,包括目录,都有一个索引节点,其节点号必然存在于该文件的所在的目录项之中,唯有根目录的索引节点号是固定的;即EXT2_ROOT_INO,即2号索引节点;通过iget()来将这个节点读入内存黄总,并为之建立inode数据结构;再通过d_alloc_root()在内存中建立起一个dentry数据结构,并使super_block中指针s_root指向这个dentry结构;

(6)最后调用ext2_setup_super()设置一些与管理有关的信息,包括此次安装的时间及递增安装次数,当安装次数达到某个最大值时,就应该对这个文件系统运行e2fsck加以检验;由于每安装一次,都要将次超级块的缓冲区标记成脏;

0 0