|
3 详细的布局情况
3.1 Super Block
所谓 ext2 文件系统的 super block,就是硬盘分区开头(开头的第一个 byte 是 byte 0)从 byte 1024 开始往后的一部分数据。由于 block size 最小是 1024 bytes,所以 super block 可能是在 block 1 中(此时 block 的大小正好是 1024 bytes),也可能是在 block 0 中。
硬盘分区上 ext3 文件系统的 super block 的详细情况如下。其中 __u32 是表示 unsigned 不带符号的 32 bits 的数据类型,其余类推。这是 Linux 内核中所用到的数据类型,如果是开发用户空间(user-space)的程序,可以根据具体计算机平台的情况,用 unsigned long 等等来代替。下面列表中关于 fragments 的部分可以忽略,Linux 上的 ext3 文件系统并没有实现 fragments 这个特性。另外要注意,ext3 文件系统在硬盘分区上的数据是按照 Intel 的 Little-endian 格式存放的,如果是在 PC 以外的平台上开发 ext3 相关的程序,要特别注意这一点。如果只是在 PC 上做开发,倒不用特别注意。
struct ext3_super_block {/*00*/ __u32 s_inodes_count; /* inodes 计数 */ __u32 s_blocks_count; /* blocks 计数 */ __u32 s_r_blocks_count; /* 保留的 blocks 计数 */ __u32 s_free_blocks_count; /* 空闲的 blocks 计数 *//*10*/ __u32 s_free_inodes_count; /* 空闲的 inodes 计数 */ __u32 s_first_data_block; /* 第一个数据 block */ __u32 s_log_block_size; /* block 的大小 */ __s32 s_log_frag_size; /* 可以忽略 *//*20*/ __u32 s_blocks_per_group; /* 每 block group 的 block 数量 */ __u32 s_frags_per_group; /* 可以忽略 */ __u32 s_inodes_per_group; /* 每 block group 的 inode 数量 */ __u32 s_mtime; /* Mount time *//*30*/ __u32 s_wtime; /* Write time */ __u16 s_mnt_count; /* Mount count */ __s16 s_max_mnt_count; /* Maximal mount count */ __u16 s_magic; /* Magic 签名 */ __u16 s_state; /* File system state */ __u16 s_errors; /* Behaviour when detecting errors */ __u16 s_minor_rev_level; /* minor revision level *//*40*/ __u32 s_lastcheck; /* time of last check */ __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]; /* 可以忽略 */}; 上一篇:ext2文件系统下恢复误删除的文件 下一篇:Linux文件系统的反删除方法 |