【问题标题】:Can multiple files be stored in the same block?多个文件可以存储在同一个块中吗?
【发布时间】:2015-05-08 21:29:50
【问题描述】:

我正在编写一些块级操作,并且我想确保我不会抨击其他文件。在 ext2/3/4 文件系统上,可以将多个文件存储在同一个块中吗?我的第一反应是拒绝,但我想咨询社区。​​p>

【问题讨论】:

  • 一些文件系统有能力将一个块分割成更小的子块(我特别记得在 Uni 的基本 OS 课程中被教导过 BSD 的 FFS 具有这种能力)。不过,不知道具体的 ext* 文件系统。
  • 在 *inx 操作系统上使用的 ext* 文件系统分配一个完整的块(通常是 4096 个可用字节),即使它们只需要新块的 1 个字节。所以,简单的答案是否定的。 IE。一块磁盘上只能保存一个文件。 (但是,您可能希望查看归档,因为它只是通过标题分隔一系列程序,因此允许每个块有多个程序。

标签: c file filesystems


【解决方案1】:

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

ext2 / ext3

就 ext2 和 ext3 而言,超级块和 inode 结构旨在允许块被分段。 (参见:fs/ext2/ext2.hfs/ext3/ext3.h

fs/ext3/ext3.h 的短 sn-p 在这里给出:

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 不再允许块碎片。用于存储片段大小的 superblock 字段已被赋予新的工作,用于存储片段地址的 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 */

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多