📄 ext3日志系统.txt
字号:
any problems, send mails to sindybear@163.com
相关文件
/fs/jbd/*.c
日志系统较为复杂。
ext3文件系统中,又一个全局的journal,这个日志结构代表了ext3文件系统中所有的状态。例如当前的
事务(transaction)状况,磁盘上的日志区当前的状况等。
在ext3文件系统中,只有一个运行状态的transaction,这个事务连接到journal->j_running_transaction域中
在这个事务的存在时间段内,所有的进程对这个文件系统的更改的信息都要加入到这个事务中去,由这个事务
统一写到磁盘上去。
ext3文件系统中,每一个进程的进程结构current中都有一个域journal_info,存储的就是这个进程对文件系统
的更改。这种更改都使用一个handle_t结构进行表示。
这些结构的关系如下
task1
jorunal_info--->handle-----------------|
|
|
task2 |
journal_info--->hanlde-----------------|
|
…… |
|
taskN \|/
journal_info--->handle----------------------->transaction------>journal
*****************************日志的磁盘结构**********************************
jbd的日志组织结构如下。
|<----superblock----->|<---------------------数据区-------------------------->|
|<--(1)-->|<---(2)--->|<---(1)--->|<--(4)-->|<--若干4-->|<--(5)-->|<--若干5-->|
|<-------(3)--------->|<------------descriptor--------->|
(1)journal_header_t
(2)super block中的一些数据,包括s_first,s_maxlen,s_start
(3)journal_superblock_s
(4)journal_block_tag_t
(5)meta data数据,也就是实际的数据。
其实ext3论文里的将日志区的数据分为三种,一个是header,一个是descriptor,一个是meta-data,
在实际的操作中,实际上前两个是不分的。他们和起来通常叫做descriptor。
如图所示,一个header后面跟随着若干的tag,这个tag其实就是论文中所指的的descriptor。
也就是保存源数据在原始磁盘的位置。这些tag和这个header就放在一个设备块中。这个设备块
后面跟随着若干的meta-data数据块,他们就是被更改过的元数据。具体的个数是由descriptor
块中的tag数目来决定的,最大不可能超过一个设备块所能包含的tag数目。一个tag对应一个meta-data
如果一个transaction包含的meta-data太多,不能用一个descriptor包含,那么系统就会生成一个
新的header + tag组成descriptor来进行映射。
每一个header的最前端都有一个magic数,这个数字就是用来描述一个descriptor的开始,但是如果有
数据块的最前面的数字恰好和这个magic相同怎么办。当检测到这个情况的时候,就要把这个数据块
最前面的一个work设置为0。并且在descriptor中进行标记。这样就解决了冲突问题。
*************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -