荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: ykwch.bbs@bbs.cqupt.edu.cn (心蓝), 信区: Linux
标  题: About ext3 journaling 1
发信站: 幽幽黄桷兰 (Wed Dec 25 15:26:24 2002)
转信站: SZU!news.tiaozhan.com!news.happynet.org!CQUPT

 这个post对我自己来说,目的有两个:一,有经验的,可以帮我检验一下
理解,没经验的,这可以作为一个入门级的文档;二,希望有兴趣的,能和我
一起做移植的工作。

    EXT3,是在EXT2上设计的,可以说是 EXT2 + Journal(日志)。Journal
是为提高可靠性而设计的一个特殊的文件(确切说来也可以不是文件)。基本
过程是,把对文件系统操作划分为一个个事务,使用Journal记录这些事务,
然后再实际执行他们。这样,即使由于当机,导致事务没有完成,也可以根据
日志,快速的把文件系统恢复到一个正确的状态。可以看出以上所说的基本原
理、术语,都数据库相类似的。
====================================
文件系统特点
    文件系统保存两类数据:元数据(meta-data)和用户数据。元数据即分区
特征、目录结构、文件属性。
    UNIX环境中有字符、区块两类设备,通常文件系统是存储在块设备中。保
存这些数据的基本单元是block (区块),它通常是实际磁盘上 sector 大小的
2的幂次倍。创建、删除和修改文件等动作的最终结果,都是体现在对区块的
修改。

比如ext2分区中建立一个文件,需要完成这几步,(未必按照这个顺序)
 a.分配inode,
 b.需要找到他所在目录的inode,向他的数据中加入新的目录项,
 c.分配文件所需的数据块。
 d.修改分配inode的数据
(如果这些操作没有一起完成,那么你的磁盘上的文件系统就有点小问题了。)

显然这里至少修改了:
1(superblock)+1(inode-bitmap) + 1(inode-table)+ 1(block-bitmap)
这四个块。这也意味着,有了这四个块的正确数据,就足够把这个操作恢复了。
===================================
缓存特点
    缓存对文件系统显然是绝对不能少的,Unix的缓存的基本特征它以虚拟块为
单位。即,读取文件时,由文件文件系统计算出给定文件位置所对应的块号,根
据这个号码再向缓存管理模块请求这个块的数据。(插一句:还有另一种策略,
让缓存和文件偏移量相对应。也就是说,每个内核中的文件控制块(和物理文件
一一对应的数据结构)保存独立的缓存映射表,根据这个表可以直接从文件位置
(偏移量)找到数据,不需要文件系统的计算。这是NT的Cache Manager采取的
策略。)
    这种结构使得journal层纪录的东西可以大大简化。它只要记住被修改的块
的编号和数据,就可以完成恢复。这个设计很妙,好处是journal层和文件系统
的耦合很小。其结果:
    文件系统的恢复可以不需要具体文件系统代码的参与。文件系统只需要说:
journal层,你给我检查xxx分区,有错的话就恢复它。而Journal层有足够的信
息完成它。如果journal层中记录的是文件的操作:
  如"创建大小为xxx,属性为yyyy的 /xyz/xxx 文件",
恢复的时候,没有文件系统代码的帮助,journal层没办法完成。两边代码都少
了。
   不同的文件系统都有可能使用一个journal层。道理很简单,对吧。
===================================
Journal记录的数据
        Journal提供两种记录模式,一种只记录元数据,另一种记录所有写入的数
据。第一眼看到,你就会感觉"第二种方式很可能慢"。的确,按照设计者自己
的说法,性能差不多减半,因为数据要写到journal和实际文件两个地方,即写
了两次。同时,第一种方式有可能会产生意料之外的问题。因为既然Journal只
记录了元数据,那么就只能保证元数据的一致性,但是用户数据就…,所以用户
可能会看到原来的数据,甚至看到原本属于其它文件的数据(可能的安全漏洞哦,
不过这个问题的对策设计者自己也有说)。
    不过我自己总是在想,有没有避免第二种方式中写入两次的办法?如果有,
那就可以放弃第一种办法。你有什么想法?
==================================
对外接口
   有了上面的概念,自然就该转到接口定义了。Jbd提供给文件系统层的一个
包含transaction概念的接口。比如创建文件时,ext3告诉jbd,开始事务;需
要修改inode-bitmap时,告诉jbd,我要修改一个和inode-bitmap所在块对应的
缓存;做完了,告诉jbd,事务结束。
    这个东西现在好像文档还是很少(至少98年,ext3就应该在开发过程中了)
关于接口,比我刚才说的稍详细的文档在:
Documentation/DocBook/journal-api.tmpl
(make之前的,起始位置自然是你的linux源文件的目录)
==================================
实现。。。

   头大的问题,其实让我看jbd的实现的原始动机是移植ext3,在看ext3时又
发现还有个jbd。事情常常就是这样在以出人意料的方式连接在一起,对于我
这样的初学者来说。

(to be continued)

--
爱在生活的点点滴滴
爱在生命的分分秒秒

我爱蓝水晶
※ 来源:·幽幽黄桷兰 bbs.cqupt.edu.cn·[FROM: BelovedGirl]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店