解决方法
这个问题很难回答.也许正确答案可能在理论上是肯定的,但在实践中没有.
ext2 / ext3
说到ext2和ext3,超级块和inode结构被设计为允许块被分段. (参见:fs / ext2 / ext2.h和fs / ext3 / ext3.h)
fs / ext3 / ext3.h的简短片段在这里给出:
struct ext3_super_block { /*00*/ __le32 s_inodes_count; /* Inodes count */ __le32 s_blocks_count; /* Blocks count */ __le32 s_r_blocks_count; /* Reserved blocks count */ __le32 s_free_blocks_count; /* Free blocks count */ /*10*/ __le32 s_free_inodes_count; /* Free inodes count */ __le32 s_first_data_block; /* First Data Block */ __le32 s_log_block_size; /* Block size */ __le32 s_log_frag_size; /* Fragment size */ // ... struct ext3_inode { __le16 i_mode; /* File mode */ __le16 i_uid; /* Low 16 bits of Owner Uid */ // ... __le32 i_faddr; /* Fragment address */
虽然至少在Linux内核(直到版本3.13)中准备了块碎片,但从未实现,因此强制碎片大小等于块大小. (见:fs / ext3 / super.c)
if (blocksize != sbi->s_frag_size) { ext3_msg(sb,KERN_ERR,"error: fragsize %lu != blocksize %u (unsupported)",sbi->s_frag_size,blocksize); goto Failed_mount; }
Afaik GNU / Hurd也没有实现ext2 / 3文件系统的块碎片.最有可能没有操作系统,实现它.
尽管如此,在开始块级操作之前检查超级块中的s_log_frag_size可能不是一个坏主意,因为您将是安全的.
EXT4
随着ext4,故事变得不那么麻烦,因为ext4不再允许块碎片化.用于存储片段大小的超级块字段已被赋予新作业,并且用于存储片段地址(重命名为i_obso_faddr)的iode字段已在源中标记为已过时.
struct ext4_inode { __le16 i_mode; /* File mode */ __le16 i_uid; /* Low 16 bits of Owner Uid */ // ... __le32 i_obso_faddr; /* Obsoleted fragment address */