我正在阅读有关 ext4 文件系统的信息,它支持压缩、加密和一个称为范围用于节省磁盘空间。什么是盘区以及它们如何有效地节省磁盘空间?
答案1
范围减少了跟踪大文件的数据块所需的元数据量。我们的想法不是存储组成文件的每个单独块的列表,而是仅存储每个连续块范围的第一个和最后一个块的地址。这些连续范围的数据块(以及代表它们的数字对)被称为范围。
文件的前几个数据块的地址存储在 inode 中,但由于 inode 的大小是固定的,因此这只适用于小文件。在 ext2 或 ext3 中,大文件需要使用间接块存储不适合 inode 本身的块地址列表的其余部分。也就是说,索引节点包含一个块的地址,该块本身包含一个块列表。这些被称为间接块。使用范围时通常不需要这些额外的块,因为存储范围需要恒定的空间量,无论它描述的块范围有多大。
一个非常碎片化的文件可能仍然需要额外的元数据块(ext4 称之为范围节点)来存储一长串范围,但通常仍然比其他情况下需要的要少得多。
不过,与文件大小相比,元数据大小的减少通常相当小。范围的主要动机是为了提高性能(通过减少碎片并减少要读写的元数据块),而不是节省空间本身。
答案2
从http://ext2read.blogspot.ch/2010/03/how-ext4-extents-work-earlier-ext2-and.html:
早期的 Ext2 和 Ext3 对文件大小有限制。它使用 32 位块号来访问数据块。因此,文件的最大大小限制为 2^32 * 块大小(例如 4k**)= 16TB*。此外,大文件的访问时间很慢,因为必须经过大量间接寻址。Ext4 文件系统可以支持非常大的文件,它有 48 位来寻址一个块。它还使用范围来存储数据,因此大文件的访问时间更快。
数据块的信息存储在inode结构的i_data中。在没有盘区的系统中,前 12 个条目包含前 12 个数据块的块号。然后它包含间接块的块号。该块包含指向数据的块号数组。类似地,还有双重间接块和三重间接块。因此,如果我们需要从一个非常大的文件中获取数据,我们需要通过这些间接的方式。