Ext2 文件系统的硬盘布局
__u32 s_checkinterval; /* max. time between checks */ __u32 s_creator_os; /* 可以忽略 */ __u32 s_rev_level; /* Revision level */ /*50*/ __u16 s_def_resuid; /* Default uid for reserved blocks */ __u16 s_def_resgid; /* Default gid for reserved blocks */ __u32 s_first_ino; /* First non-reserved inode */ __u16 s_inode_size; /* size of inode structure */ __u16 s_block_group_nr; /* block group # of this superblock */ __u32 s_feature_compat; /* compatible feature set */ /*60*/ __u32 s_feature_incompat; /* incompatible feature set */ __u32 s_feature_ro_compat; /* readonly-compatible feature set */ /*68*/ __u8 s_uuid[16]; /* 128-bit uuid for volume */ /*78*/ char s_volume_name[16]; /* volume name */ /*88*/ char s_last_mounted[64]; /* directory where last mounted */ /*C8*/ __u32 s_algorithm_usage_bitmap; /* 可以忽略 */ __u8 s_prealloc_blocks; /* 可以忽略 */ __u8 s_prealloc_dir_blocks; /* 可以忽略 */ __u16 s_padding1; /* 可以忽略 */ /*D0*/ __u8 s_journal_uuid[16]; /* uuid of journal superblock */ /*E0*/ __u32 s_journal_inum; /* 日志文件的 inode 号数 */ __u32 s_journal_dev; /* 日志文件的设备号 */ __u32 s_last_orphan; /* start of list of inodes to delete */ /*EC*/ __u32 s_reserved[197]; /* 可以忽略 */ };
我们可以看到,super block 一共有 1024 bytes 那么大。在 super block 中,我们第一个要关心的字段是 magic 签名,对于 ext2 和 ext3 文件系统来说,这个字段的值应该正好等于 0xEF53。如果不等的话,那么这个硬盘分区上肯定不是一个正常的 ext2 或 ext3 文件系统。从这里,我们也可以估计到,ext2 和 ext3 的兼容性一定是很强的,不然的话,Linux 内核的开发者应该会为 ext3 文件系统另选一个 magic 签名才对。
在 super block 中另一个重要的字段是 s_log_block_size。从这个字段,我们可以得出真正的 block 的大小。我们把真正 block 的大小记作 B,B = 1 << (s_log_block_size + 10),单位是 bytes。举例来说,如果这个字段是 0,那么 block 的大小就是 1024 bytes,这正好就是最小的 block 大小;如果这个字段是 2,那么 block 大小就是 4096 bytes。从这里我们就得到了 block 的大小这一非常重要的数据。 本新闻共 6页,当前在第 3页 1 2 3 4 5 6 |