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