由于某些原因,我希望ext4 文件系统中的所有文件都不会碎片化。遗憾的是e4defrag
(此处建议:如何对 ext4 文件系统进行碎片整理)无法对多个文件进行碎片整理。我有什么选择?
文件系统中已经包含所有文件(不能以任何方式更改它们)并且几乎已满。有几个空闲块(根据df -h
:434M available of 85G and 80G used)可以用作缓冲区。我不需要在碎片整理时挂载文件系统。此外,我还有其他文件系统可用,有足够的空间用作缓冲区。
我的一个想法是将文件移动到其他文件系统,然后以某种方式将它们复制回来告诉文件系统连续存储它们。
[编辑]
我刚刚发现我不能依赖e4defrag
输出。它将具有多个范围的文件计为碎片,同时它知道这些范围是连续的:
$ sudo filefrag file.file
file.file: 1 extent found
$ sudo e4defrag -vc file.file
e4defrag 1.45.5 (07-Jan-2020)
<File>
[ext 1]: start 22388736: logical 0: len 32768
[ext 2]: start 22421504: logical 32768: len 32768
[ext 3]: start 22454272: logical 65536: len 32768
[ext 4]: start 22487040: logical 98304: len 27962
Total/best extents 4/1
Average size per extent 126266 KB
Fragmentation score 0
[0-30 no problem: 31-55 a little bit fragmented: 56- needs defrag]
This file (file.file) does not need defragmentation.
Done.
尽管有合理的理由进行碎片整理,但没有人要求每个文件都进行碎片整理并且是连续的。任何人可能希望对每个文件进行碎片整理的主要原因与 OCPD 相关,这完全是浪费时间,因为文件系统在挂载 rw 后不久将再次“碎片化”。
在那种情况下,您可能无法对每个文件进行碎片整理,因为 Linux 碎片整理程序往往在文件级别工作,并且您不一定有足够的连续可用空间来对每个文件进行碎片整理。
那是你最可行的选择。但是,具体的文件分配是由文件系统驱动决定的。
Linux 文件系统开发人员并没有给予碎片整理与 Windows 开发人员相同的优先级。所以问题不在于它在技术上是不可能的,而是没有人费心编写任何程序来这样做。
然后使用专为 ro 使用而设计的文件系统,如 squashfs。所有文件都将进行碎片整理、连续甚至压缩。
如果您的某些文件很大,那么在不重新格式化文件系统的情况下对它们进行碎片整理在技术上是不可能的。
任何ext4 文件系统都由一系列块组组成。默认情况下,每个块组的长度为 128 MiB。
每个块组以一堆文件系统元数据(超级块、组描述符、分配位图和 inode 表)开始,然后是属于该块组的文件使用的实际数据块。这意味着文件系统元数据大部分均匀地分布在整个设备上。
然而,由于可选
flex_bg
功能,多个块组可以聚合在一起成为一个更大的块组。mke2fs
自 2008 年左右以来,默认情况下一直在创建文件系统,将 16 个块组打包在一起。假设您在使用 mkfs 选项创建文件系统时没有更改它-G
,那么您的文件系统可能会分成 2-GiB 弹性组。除非您的所有文件都明显小于 2 GiB,否则您将不可避免地遇到这样一种情况,即下一个要存储的文件必须分散在两个或更多(弹性)块组中。当然,如果您的任何文件大于(弹性)块组中的可用数据块,这肯定会发生。
为了实现您的目标,您可能必须使用比默认值 16 更高的
-G
选项设置重新格式化文件系统,以使文件系统使用真正大的 flex 块组。回到 DOS 6 之前,对 FAT 分区进行碎片整理的通常建议是:
我从来没有尝试过这个,因为 MS-DOS 6 在碎片整理成为我的问题之前就已经问世了(带有它包含的碎片整理实用程序)。