作者:Vitamin C[抗坏血酸]
The Second Extended File System Internal Layout Ext2文件系统内部布局 Dave Poirier instinc@users.sf.net 翻译:Vitamin C[抗坏血酸] sing9806@sohu.com sing9806@yahoo.com.cn Copyright © 2001-2002 by Dave Poirier Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license can be acquired electronically from http://www.fsf.org/licenses/fdl.html or by writing to 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA (这是原文关于版权的说明,予原样保留。) 内容目录 关于本书 1. 磁盘组织 1.1. 超级块 1.1.1. s_inodes_count 1.1.2. s_blocks_count 1.1.3. s_r_blocks_count 1.1.4. s_free_blocks_count 1.1.5. s_free_inodes_count 1.1.6. s_first_data_block 1.1.7. s_log_block_size 1.1.8. s_log_frag_size 1.1.9. s_blocks_per_group 1.1.10. s_frags_per_group 1.1.11. s_inodes_per_group 1.1.12. s_mtime 1.1.13. s_wtime 1.1.14. s_mnt_count 1.1.15. s_max_mnt_count 1.1.16. s_magic 1.1.17. s_state 1.1.18. s_errors 1.1.19. s_minor_rev_level 1.1.20. s_lastcheck 1.1.21. s_checkinterval 1.1.22. s_creator_os 1.1.23. s_rev_level 1.1.24. s_def_resuid 1.1.25. s_def_resgid 1.1.26. s_first_ino 1.1.27. s_inode_size 1.1.28. s_block_group_nr 1.1.29. s_feature_compat 1.1.30. s_feature_incompat 1.1.31. s_feature_ro_compat 1.1.32. s_uuid 1.1.33. s_volume_name 1.1.34. s_last_mounted 1.1.35. s_algo_bitmap 1.2. 块组描述符 1.2.1. bg_block_bitmap 1.2.2. bg_inode_bitmap 1.2.3. bg_inode_table 1.2.4. bg_free_blocks_count 1.2.5. bg_free_inodes_count 1.2.6. bg_used_dirs_count 1.2.7. bg_pad 1.2.8. bg_reserved 1.3. 块位图 1.4. Inode 位图 1.5. Inode 表 1.5.1. i_mode 1.5.2. i_uid 1.5.3. i_size 1.5.4. i_atime 1.5.5. i_ctime 1.5.6. i_mtime 1.5.7. i_dtime 1.5.8. i_gid 1.5.9. i_links_count 1.5.10. i_blocks 1.5.11. i_flags 1.5.12. i_osd1 1.5.13. i_block 1.5.14. i_generation 1.5.15. i_file_acl 1.5.16. i_dir_acl 1.5.17. i_faddr 1.5.18. i_osd2 1.6. 数据块 2. 目录结构 2.1. 目录文件格式 2.1.1. inode 2.1.2. rec_len 2.1.3. name_len 2.1.4. file_type 2.1.5.name 2.2. 目录例子 2.3. 索引目录格式 2.3.1. 索引结构 2.3.2. 查找算法 2.3.3. 插入算法 2.3.4. 分解 2.3.5. Key 冲突 2.3.6. Hash 功能 2.3.7. 性能 3. Inode, 文件的标识符 3.1. Inode 编号 3.2. 定位Inode 结构 3.3. 定位Inode 表 4. 文件属性 4.1. 标准属性 4.1.1. SUID, SGID 和 -rwxrwxrwx 4.1.2. 文件大小 4.1.3. 属主与属组 4.2. 扩展属性 4.2.1. 属性块头部 4.2.2. 属性入口头部 4.3. 行为控制标记 4.3.1. EXT2_SECRM_FL – 安全删除 4.3.2. EXT2_UNRM_FL – 用于反删除的记录 4.3.3. EXT2_COMPR_FL – 压缩的文件 4.3.4. EXT2_SYNC_FL – 同步更新 4.3.5. EXT2_IMMUTABLE_FL – 不可变文件 4.3.6. EXT2_APPEND_FL – 只添加 4.3.7. EXT2_NODUMP_FL – 不可 Dump/删除 4.3.8. EXT2_NOATIME_FL – 不更新 .i_atime 4.3.9. EXT2_DIRTY_FL – 脏的 4.3.10. EXT2_COMPRBLK_FL – 压缩的块 4.3.11. EXT2_NOCOMPR_FL –Raw方式访问压缩的数据 4.3.12. EXT2_ECOMPR_FL – 压缩错误 4.3.13. EXT2_BTREE_FL - B-Tree 格式目录 4.3.14. EXT2_INDEX_FL - Hash 索引的目录 4.3.15. EXT2_IMAGIC_FL - 4.3.16. EXT2_JOURNAL_DATA_FL – 日志文件数据 4.3.17. EXT2_RESERVED_FL – 保留 A. 鸣谢 B.译者后记 表格列表 1-1. EXT2_ERRORS 值 1-2. EXT2_OS 值 1-3. EXT2 修订版本 1-4. EXT2_*_INO值 1-5. EXT2_S_I值 2-1. EXT2_FT值 4-1. 行为控制标记 图片列表 1-1. 磁盘的元数据布局 1-2. 20mb 分区元数据布局 1-3. 超级块结构 1-4. group_desc 结构 1-5. inode 结构 1-6. inode osd2 结构: Hurd 1-7. inode osd2 结构: Linux 1-8. inode osd2 结构: Masix 2-1. 目录入口 2-2. 目录数据布局例子 2-3. 索引目录的性能 3-1. inode计算例子 4-1. ext2_xattr_header 结构 4-2. ext2_xattr_header 结构 关于本书 本书的最新版本下载的URL:http://www.freesoftware.fsf.org/ext2-doc/ 本书的目的在于提供关于The Second Extended File System即Ext2文件系统的入门指南。本书假定熟悉关于文件系统的相关概念(如:文件,目录,分区等等)。 实现ext2的驱动程序并非一件易事,其最大的困难正好就是相关文档资料的缺乏。而目前网上所有关于ext2内部布局的文档资料只不过是作为Linux sourcesr的补充,并没有完整的关于ext2内部布局的文档资料。 本文档资料的目的正是为解决此问题而生,希望它能对有此需要的人有所帮助。 Unless otherwise stated, all values are stored in little endian byte order. Chapter 1. 磁盘组织 在使用The Second Extended File System首先要明确的是所有的元数据结构的大小均基于“块(block)”而不是“扇区(sector)”。块的大小是可变的,依赖于文件系统的大小。例如在一个软盘块的大小为1KB(2个扇区),而在一个10G的分区里块的大小通常为4KB或8KB(分别为8或16个扇区)。 每一个块可以进一步划分为“段(fragments)”,但我见过一个段的大小与块的大小不相匹配的文件系统。尽管常识告诉我段与块不相匹配是不合理的。 除了超级块(superblock)外,所有的元数据结构都以块为基准调整大小。这里有一点要注意,在安装任何其它的文件系统到软盘上时,inode表块(Inode Tabel Block)在块大小为4KB比在块大小为1KB的文件系统里可以容纳更多的入口,这是当访问这样的一个特殊的结构时需要注意的。 下步要明确的是文件系统还划分了“块组(block groups)”。在一张软盘里只使用一个块组包含文件系统里所有的块,但在一个10G的硬盘分区里将划分30个这样的包含有一定数量块的块组。 在每个块组的开始有多种多样的元数据结构描述彼此的位置,更重要的是,元数据结构定义了当前文件系统的状态。下面是在一张软盘的ext2文件系统的磁盘组织: Figure 1-1. 软盘的元数据布局 offset # of blocks description 偏移 块号 描述 -------- ----------- ----------- 0 1 boot record 引导记录 -- block group 0 – 块组 0 (1024 bytes) 1 superblock 超级块 2 1 group descriptors 块组描述符 3 1 block bitmap 块位图 4 1 inode bitmap inode位图 5 23 inode table inode 表 28 1412 data blocks 数据块 下面是一个20MB ext2文件系统的磁盘组织: Figure 1-2. 20mb 分区元数据布局 offset # of blocks description -------- ----------- ----------- 0 1 boot record -- block group 0 -- (1024 bytes) 1 superblock 2 1 group descriptors 3 1 block bitmap 4 1 inode bitmap 5 214 inode table 219 7974 data blocks -- block group 1 -- 8193 1 superblock backup 8194 1 group descriptors backup 8195 1 block bitmap 8196 1 inode bitmap 8197 214 inode table 8408 7974 data blocks -- block group 2 -- 16385 1 block bitmap 16386 1 inode bitmap 16387 214 inode table 16601 3879 data blocks 只要你了解磁盘基本的信息,磁盘的布局是可以预知的;块的大小,每个块组包含多少块,每个块组的inode数等这些信息是可以在超级块结构里找到或通过计算得到的。 没有超级块的信息,磁盘将不可用;所以只要磁盘上的空间允许,在磁盘上将有一个或多个超级块的备份。 块位图与inode位图用于识别哪些块和哪些inode入口是可用的。各种各样的文件将保存在数据块里。注意:在ext2里目录也被视为文件,在下面我们将详细对此进行描述。 为兼容不同的ext2实现,在不同结构里的一些因为特定的操作系统而有所差别的字段,将在适当的时候给予简要的说明。 1.1. 超级块 超级块这个结构里包含了磁盘里ext2 文件系统属性里最基本的信息。它的布局如下: Figure 1-3. 超级块结构 offset size description 偏移 大小 描述 ------- ------- ----------- 0 4 s_inodes_count 4 4 s_blocks_count 8 4 s_r_blocks_count< |