据我了解,“稀疏文件”意味着文件可能有“间隙”,因此实际使用的数据可能小于逻辑文件大小。
Linux文件系统如何在磁盘上保存文件?我主要对 ext4 感兴趣。但:
- 可以保存文件吗不是按顺序在磁盘上?我的意思是,文件的一部分位于物理地址 X,下一部分位于物理地址 Y(不接近 X + 偏移量)。
- 我可以以某种方式控制文件顺序吗?
我想分配一个10GB的文件。我希望它在磁盘上是连续的,而不是在不同的偏移量之间划分。 - 不同类型之间的作用是否不同?
答案1
可以保存文件吗不是按顺序在磁盘上?我的意思是,文件的一部分位于物理地址 X 下,另一部分位于物理地址 Y 下,该地址不接近 X + 偏移量)。
是的;这称为文件碎片,并且并不罕见,尤其是对于较大的文件。大多数文件系统都会根据需要分配空间,或多或少按顺序分配,但它们无法猜测未来的行为 - 因此,如果您将 200MiB 写入文件,然后再添加 100MiB,则两组数据都将出现的可能性非零存储在磁盘的不同区域(基本上,在第一次写入之后和第二次写入之前发生的任何其他需要更多磁盘空间的写入都可能发生在两者之间)。如果文件系统接近满,情况通常会更糟:可能没有足够大的连续可用空间区域来容纳新文件,因此必须对其进行碎片化。
我可以以某种方式控制文件顺序吗?我想分配10GB的大文件。我希望它在磁盘中是连续的,而不是在不同的偏移量之间划分。
您可以在创建文件时告诉文件系统文件的目标大小;这将有助于文件系统以最佳方式存储它。许多现代文件系统使用一种称为延迟分配的技术,其中尽可能晚地计算新文件的磁盘布局,以在执行计算时最大化可用的信息。您可以通过使用来帮助此过程posix_fallocate(3)
函数告诉文件系统总共应该分配多少磁盘空间。现代文件系统将尝试按顺序执行此分配。
不同类型之间的作用是否不同?
不同的文件系统表现不同,是的。基于日志的文件系统(例如 NILFS2)不会以与基于扩展的文件系统(例如 Ext4)相同的方式分配存储,这只是变化的一个示例。
答案2
该命令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
如果您一次性写入文件,我的猜测是您的文件不会碎片化。
(1)的手册页fallocate
非常清楚:
fallocate
用于向文件预分配块。对于支持fallocate
系统调用的文件系统,可以通过分配块并将其标记为未初始化来快速完成,不需要对数据块进行 IO。这比通过用零填充来创建文件要快得多。从 Linux Kernel v2.6.31 开始,
fallocate
btrfs、ext4、ocfs2 和 xfs 文件系统支持系统调用。
是顺序的吗?系统将首先尝试按顺序分配块。如果不能,它不会警告您。
答案3
您提到了稀疏文件,其他答案都没有提到它们。
大多数文件并不稀疏。创建文件的最常见方法是将其从头到尾一次性写入。那里没有洞。
但是,您可以说“移动到位置 1,000,000,000,000 并在那里写入一个字节”。这将创建一个看起来有 etabyte 大的文件,但实际上仅在磁盘上使用(可能)4k。这是一个稀疏文件。
您可以对同一个文件执行多次此操作,从而将少量数据分散在广阔的空白中。
虽然这很有用,但有两个缺点。
首先是文件会出现碎片,这是你担心的。
第二是并非所有程序都能很好地处理这些文件。例如,某些备份软件会尝试备份空白,从而创建比必要的大得多的备份,可能也对于备份介质来说很大。
答案4
如果这只是一次性的事情,并且文件最初如何存储并不重要,只重要结果,那么您可以正常保存文件,然后运行操作系统的碎片整理程序。然后你可以检查这个答案如果您的文件是完整的,如果不是,请重复。这是最简单的方法,无需使用命令或外部程序,但它肯定不是最快的方法,因为它会对整个磁盘进行碎片整理。