操作系统: 03 2011存档

前几次开发中,研究了一下硬盘的layout,看到ext2下的目录都是把自己的子文件的信息——更准确的说是ext2_dir_entry结构——放在自己的data block里(当然,可能是多个data block),存放顺序就是创建这些子文件的顺序。
前天李勇同学点拨,才知道从ext3开始,还多了一个"dir_index"特征(默认的),启用后,ext3_dir_entry(目录下的文件名信息)将以类似btree的形式存放在目录的data block里,其中用于排序的是子文件信息的hash值。
ext3, dir_index

如上图。目录inode的第一个data block(标注为index_block)里是由一堆dx_dentry结构组成的,这个data block还有个struct dx_root作为头部。
在我的实验里,一个目录里创建了1000个文件,且文件系统的block size是1024字节,此时目录的index_block里有22个dx_entry结构,这22个dx_entry是按照其第一个成员变量——hash来排序的,而第二个成员变量——block分别指向22个磁盘块,这些被指的磁盘块里才放着ext3_dir_entry结构。这个index_block就相当与btree里的索引节点,而被指向的磁盘块就相当于btree里的叶子节点

对于非dir_index的ext3文件系统,在目录里寻找某个文件名只能是顺序遍历,一旦文件数多了速度就会很慢;而在使用了dir_index后,就能迅速定位到在哪一个磁盘块了。可惜,在定位到某个磁盘块以后,只能是遍历这个磁盘块里的所有ext3_dir_entry了。


====== 2011.3.21 ======

1. 一个目录刚创建或目录里文件数很少的时候,并不采用dir_index(从inode的i_flags字段也可以看出这一点),当目录下的文件数越来越多,其ext2_dir_entry结构占用超过一个block后,才会将该目录变为dir_index
2. 即使是dir_index,一个目录下可放的文件数也不是无限的,从我们的实验来看,对于一个block size为4K的文件系统,如果用户的文件名很大(我们的实验是100个字节),一个目录下也就最多放500万个文件,超过这一限制,内核就会狂报"dir index full“的错误。因为dir_index在设计上就最多只允许两层索引节点加一层叶子节点。


====== 2011.5.19 ======

1. 不管在ext3还是在ext4,dir_index都只允许两层索引,也就是说,inode指向一个存满了dx_entry的block,其中某个dx_entry指向另一个存满了dx_entry的block,这第二层的dx_entry就只能指向一个存ext3_dir_entry的block,不能再指向一个存dx_entry的block ...... 但愿我说明白了。
2. 从coly同学那里新学到的:随着目录下文件的增加,这个dir_index的tree会保持平衡,但是如果删除目录下的文件,这个tree不会再作 rebalance 操作(也许是怕代码太复杂),tree有可能会慢慢变得“歪”起来。

重装rhel5后,忘记了root密码,于是想进入single user模式,文章 http://titanictom.blog.163.com/blog/static/1329184420105134027785/介绍的最清楚(还有截图),但是,我直接在kernel那一行后面加入“ single”,却无法成功。
反反复复试了几次,终于知道了:要删除 “console=tty0 console=ttyS1,57600“ 这些rhel5自带的启动项,直接在root=xxx后面跟上single,就像这样:

kernel /vmlinuz-2.6.18-238.el5 ro root=LABEL=/ single

便可以顺利进入single user mode,改root密码了。