我正在对一些块级操作进行编码,并且我想确保不要对其他文件进行重击。在ext2 / 3/4文件系统上,可以在同一块中存储多个文件吗?我的第一个直觉是拒绝,但我想向社区询问。
这个问题很难回答。也许正确的答案在理论上可能是肯定的,但实际上不是。
说到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,wohle的故事就不再那么麻烦了,因为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 */
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句