我正在编码一些块级操作,并且我想确保不要对其他文件进行猛烈抨击。在ext2/3/4文件系统上,可以在同一块中存储多个文件吗?我的第一个直觉是拒绝,但我想向社区询问。

最佳答案

这个问题很难回答。也许正确的答案在理论上可能是肯定的,但实际上不是。

ext2/ext3

说到ext2和ext3, super 块和inode结构被设计为允许块被分段。 (请参阅:fs/ext2/ext2.hfs/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文件系统的块碎片。很有可能没有操作系统可以实现它。

但是,在安全起见,在开始块级操作之前检查 super 块中的s_log_frag_size可能不是一个坏主意。

ext4

有了ext4,wohle的故事就不再那么麻烦了,因为ext4不再允许块碎片。用于存储片段大小的 super 块字段已被赋予新的工作,并且用于存储片段地址的iode字段(重命名为i_obso_faddr)在源中已被标记为过时。
struct ext4_inode {
    __le16  i_mode;     /* File mode */
    __le16  i_uid;      /* Low 16 bits of Owner Uid */
// ...
    __le32  i_obso_faddr;   /* Obsoleted fragment address */

关于可以在同一块中存储多个文件吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30133149/

10-12 02:38