Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 可以在同一块中存储多个文件吗?_C_File_Filesystems - Fatal编程技术网

C 可以在同一块中存储多个文件吗?

C 可以在同一块中存储多个文件吗?,c,file,filesystems,C,File,Filesystems,我正在编写一些块级操作,我想确保我不会对其他文件进行攻击。在ext2/3/4文件系统上,可以在同一块中存储多个文件吗?我的第一反应是说不行,但我想和社区核实一下。这个问题很难回答。也许正确的答案在理论上是肯定的,但在实践中是否定的 ext2/ext3 说到ext2和ext3,superblock和inode结构被设计为允许块被分段。(参见:fs/ext2/ext2.h和fs/ext3/ext3.h) 下面给出了fs/ext3/ext3.h的简短片段: struct ext3_super_bloc

我正在编写一些块级操作,我想确保我不会对其他文件进行攻击。在ext2/3/4文件系统上,可以在同一块中存储多个文件吗?我的第一反应是说不行,但我想和社区核实一下。

这个问题很难回答。也许正确的答案在理论上是肯定的,但在实践中是否定的

ext2/ext3 说到ext2和ext3,superblock和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

Afaik GNU/Hurd也不实现ext2/3文件系统的块分段。最有可能的是,周围将没有实现它的操作系统

尽管如此,在开始块级操作之前,检查superblock中的
s\u log\u frag\u size
可能不是一个坏主意,因为这样做是安全的

ext4 有了ext4,wohle的故事就不那么麻烦了,因为ext4不再允许块碎片。用于存储片段大小的superblock字段已被赋予一个新作业,用于存储片段地址(重命名为
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 */

一些文件系统能够将一个块分割成更小的子块(我特别记得在Uni的基本操作系统课程中,有人教过BSD的FFS具有这种能力)。但是,不知道ext*文件系统的具体情况。在*inx操作系统上使用的ext*文件系统分配一个完整的块(通常是4096个可用字节),即使它们只需要新块的1个字节。因此,简单的答案是否定的。也就是说,一块磁盘上只能保存一个文件。(但是,您可能希望查看归档,因为归档只是通过一个标头分隔一系列程序,因此允许每个块有多个程序。
struct ext4_inode {
    __le16  i_mode;     /* File mode */
    __le16  i_uid;      /* Low 16 bits of Owner Uid */
// ...
    __le32  i_obso_faddr;   /* Obsoleted fragment address */