Ext4文件系统架构分析(三) ——目录哈希、扩展属性与日志
2014-05-19 21:40
1361 查看
struct dx_root
Htree的内部节点: struct dx_node
Htree 树根和节点中都存在的 Hash map: struct dx_entry
可以在两个地方找到扩展属性:一是在一个inode项结尾到下一个inode项开头的地方;二是inode.i_file_acl指向 的数据块之中,到3.0为止,这个数据块中不包含指向第二个扩展属性数据块的指针。理论上可以将每个属性值存储到一个单独的数据块中,但是3.0内核为止仍然没有这样做。
当扩展属性不存储在一个inode之后的时候,就会有一个头部ext4_xattr_ibody_header
扩展属性数据块的开头是ext4_xattr _header
紧跟在ext4_xattr_ibody_header或者ext4_xattr _header后面的是结构数组 struct ext4_xattr_entry
扩展属性值可以紧跟在ext4_xattr_entry项表后面。考虑4 bytes对齐。扩展属性值从扩展属性数据块的末尾开始向ext4_xattr _header / ext4_xattr_entry表的方向增长。当发生溢出时,溢出的部分放到一个单独的磁盘数据块上。
从性能方面考虑,Ext4默认直接将文件系统元数据写到日志。因而不能保证文件数据块的一致性。
日志的inode为8。日志inode的前68 bytes复制了ext4 超级块。日志文件在文件系统中是普通文件,但是隐藏不可见。日志文件通常消耗一个完整的块组,可以通过mke2fs将日志文件放在磁盘的中间。
Ext4和Ocfs2都使用JBD2。
一个事务以描述符和一些数据或者block revocation链表开始。一个结束的事务总是以一个提交块结束。如果没有提交记录(或者校验和不匹配),事务在日志重演的时候将被丢弃。
日志数据块tags具有如下格式:由数据结构struct journal_block_tag_s表示,可以是8,12,24或38bytes。
Htree的内部节点: struct dx_node
Htree 树根和节点中都存在的 Hash map: struct dx_entry
1.20 扩展属性EA
扩展属性(xattrs)通常存储在磁盘上的一个单独的数据块中,通过inode.i_file_acl*引用。扩展属性的第一应用是存储文件的ACL以及其他安全数据(selinux)。使用user_xattr挂载选项就可为用户存储以“user”开头的所有扩展属性。这样的限制在3.0内核中已经消失。可以在两个地方找到扩展属性:一是在一个inode项结尾到下一个inode项开头的地方;二是inode.i_file_acl指向 的数据块之中,到3.0为止,这个数据块中不包含指向第二个扩展属性数据块的指针。理论上可以将每个属性值存储到一个单独的数据块中,但是3.0内核为止仍然没有这样做。
当扩展属性不存储在一个inode之后的时候,就会有一个头部ext4_xattr_ibody_header
扩展属性数据块的开头是ext4_xattr _header
紧跟在ext4_xattr_ibody_header或者ext4_xattr _header后面的是结构数组 struct ext4_xattr_entry
扩展属性值可以紧跟在ext4_xattr_entry项表后面。考虑4 bytes对齐。扩展属性值从扩展属性数据块的末尾开始向ext4_xattr _header / ext4_xattr_entry表的方向增长。当发生溢出时,溢出的部分放到一个单独的磁盘数据块上。
1.21 日志(JBD2)
文件系统在磁盘上保留一段小的连续区域(默认128MB),作为尽可能需要快速写入磁盘的“重要”数据的存放地。一旦该重要数据事务完全写到磁盘,将其从磁盘写缓存中刷出。被提交的数据一份记录也被写到日志。一段时间后,日志在擦除提交记录前将事务写到它们在磁盘上的最终位置(可能包含大量的寻道或者大量的读-写-擦除)。从性能方面考虑,Ext4默认直接将文件系统元数据写到日志。因而不能保证文件数据块的一致性。
日志的inode为8。日志inode的前68 bytes复制了ext4 超级块。日志文件在文件系统中是普通文件,但是隐藏不可见。日志文件通常消耗一个完整的块组,可以通过mke2fs将日志文件放在磁盘的中间。
Ext4和Ocfs2都使用JBD2。
1.21.1 布局
日志布局一个事务以描述符和一些数据或者block revocation链表开始。一个结束的事务总是以一个提交块结束。如果没有提交记录(或者校验和不匹配),事务在日志重演的时候将被丢弃。
1.21.2 数据块头部
日志中的每个数据块的开头都是一个12 bytes的数据结构 struct journal_header_s1.21.3 超级块
日志的超级块比Ext4的超级块简单。保存在日志的超级块中是日志的关键数据。日志超级块使用数据结构struct journal_superblock_s表示,大小为1024 bytes。1.21.4 描述数据块Descriptor Block
Descriptor Block包含一个日志数据块tags的数组,这些tags描述了日志中接下来的数据块的最终位置。日志数据块tags具有如下格式:由数据结构struct journal_block_tag_s表示,可以是8,12,24或38bytes。
1.21.5 数据块Data Block
存放的是通过日志写到磁盘的数据块。但是如果数据块的前4 bytes与jbd2的魔数匹配,那么这些4 bytes用0代替,并且在Descriptor Block中设置escaped。相关文章推荐
- F2FS文件系统架构与原理分析(四)——F2FS的目录结构与目录哈希
- F2FS文件系统架构与原理分析(四)——F2FS的目录结构与目录哈希
- Ext4文件系统一之架构分析
- Ext4文件系统架构分析(二)
- Ext4文件系统二之架构分析
- Ext4文件系统架构分析(三)
- Ext4文件系统架构分析(一)
- Ext4文件系统架构分析(一)
- Ext4文件系统架构分析(一)
- Ext4文件系统架构分析(二)
- Ext4文件系统架构分析(一)
- Ext4文件系统架构分析(二)
- Hadoop源码分析笔记(十二):名字节点--文件系统目录树
- linux文件系统的系统分析--(六)sysfs下目录的创建
- Linux 文件系统剖析:剖析 ext4 了解第 4 个扩展文件系统
- Hadoop日志文件分析系统
- 人人网数据服务平台:基于日志分析的数据系统架构-严岩
- 如何查看linux系统下的各种日志文件 linux 系统日志的分析大全
- linux文件系统的系统分析--(九)sysfs下属性文件的读写
- GlusterFS之文件系统扩展属性