文件是否按顺序保存在磁盘上?

hud*_*dac 24 linux filesystems io hard-disk

据我了解,“稀疏文件”意味着文件可能有“间隙”,因此实际使用的数据可能小于逻辑文件大小。

Linux 文件系统如何在磁盘上保存文件?我主要对ext4感兴趣。但:

  1. 文件可以按顺序保存在磁盘上吗?我的意思是,文件的一部分位于物理地址 X,下一部分位于物理地址 Y,它不接近 X + 偏移量)。
  2. 我可以以某种方式控制文件顺序吗?
    我想分配一个 10GB 的文件。我希望它在磁盘上是连续的,而不是在不同的偏移量之间划分。
  3. 它在不同类型之间的作用是否不同?

Ste*_*itt 41

文件可以按顺序保存在磁盘上吗?我的意思是,文件的一部分位于物理地址 X 下,另一部分位于不接近 X + 偏移量的物理地址 Y 下)。

是的; 这被称为文件碎片并且并不少见,尤其是对于较大的文件。大多数文件系统会根据需要或多或少地按顺序分配空间,但它们无法猜测未来的行为——因此,如果您将 200MiB 写入文件,然后再添加 100MiB,则两组数据都有非零的可能性存储在磁盘的不同区域(基本上,任何其他需要更多磁盘空间的写入,发生在第一次写入之后和第二次之前,可能介于两者之间)。如果文件系统接近满,情况通常会更糟:可能没有足够大的连续可用空间区域来容纳新文件,因此必须对其进行碎片化。

我可以以某种方式控制文件顺序吗?我想分配 10GB 的大文件。我希望它在磁盘中是连续的,而不是在不同的偏移量之间划分。

你可以在文件系统创建时告诉文件系统你的文件的目标大小;这将有助于文件系统以最佳方式存储它。许多现代文件系统使用一种称为延迟分配的技术,其中尽可能晚地计算新文件的磁盘布局,以在执行计算时最大化可用信息。您可以通过使用该posix_fallocate(3)函数告诉文件系统总共应该分配多少磁盘空间来帮助此过程。现代文件系统将尝试按顺序执行此分配。

它在不同类型之间的作用是否不同?

不同的文件系统表现不同,是的。基于日志的文件系统(例如 NILFS2)与基于扩展的文件系统(例如 Ext4)的存储分配方式不同,这只是变化的一个示例。

  • 它不能保证顺序分配,这只是一个提示。但是,如果您正在编写 10GiB 文件,则绝对应该使用它! (6认同)
  • 基本上所有比 FAT 更复杂的文件系统——这可以追溯到最初的伯克利 UFS——都会有意地分解大文件并将它们分散到多个“分配组”中;这有助于他们最大限度地减少磁盘的_整体_碎片。_可能_有一种方法可以调整它的工作方式,但是很有可能您必须从头开始重新创建文件系统才能做到这一点,并且可能没有办法将其完全关闭。 (6认同)
  • @hudac 不可能在所有情况下都保证顺序性(请参阅驱动器接近满的情况),老实说,SSD 的兴起比以前更重要(对于那些至少可以负担得起的人) )。 (2认同)

Vou*_*uze 18

该命令filefrag将告诉您文件在设备上的物理存储方式:

# filefrag -v /var/log/messages.1 
Filesystem type is: ef53
File size of /var/log/messages.1 is 41733 (11 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0  2130567               1 
   1       1 15907576  2130568      1 
   2       2 15910400 15907577      1 
   3       3 15902720 15910401      7 
   4      10  2838546 15902727      1 eof
/var/log/messages.1: 5 extents found
Run Code Online (Sandbox Code Playgroud)

如果您一次性编写文件,我的猜测是您的文件不会碎片化。

fallocate(1)的手册页非常清楚:

fallocate 用于将块预分配给文件。对于支持fallocate系统调用的文件系统,这是通过分配块并将它们标记为未初始化来快速完成的,不需要对数据块进行 IO。这比通过用零填充文件来创建文件要快得多。

从 Linux Kernel v2.6.31 开始,fallocatebtrfs、ext4、ocfs2 和 xfs 文件系统支持系统调用。

是连续的吗?系统将首先尝试按顺序分配块。如果它不能,它不会警告你。

  • EF53 是 ext2、ext3 和 ext4 的“SUPER_MAGIC”编号。在内核源代码中的“include/uapi/linux/magic.h”中查找每个文件系统的所有幻数。 (2认同)

Sti*_*mer 6

您提到了稀疏文件,而其他答案都没有提到它们。

大多数文件并不稀疏。创建文件最常见的方法是从头到尾一口气写完。那里没有洞。

但是,您可以说“移动到位置 1,000,000,000,000 并在那里写入一个字节”。这将创建一个看起来像一个 etabyte 大的文件,但实际上只在磁盘上使用(可能)4k。这是一个稀疏文件。

您可以对同一个文件多次执行此操作,而将少量数据分散在巨大的空白处。

虽然这很有用,但有两个缺点。

首先是文件会碎片化,这就是你所担心的。

第二个是并非所有程序都能很好地处理这些文件。例如,一些备份软件会尝试备份空的内容,从而创建一个比需要大得多的备份,对于备份介质来说可能太大了。