我想全部由于某些原因,ext4 文件系统中的文件没有碎片化。遗憾的是e4defrag
(此处建议:如何对 ext4 文件系统进行碎片整理) 无法对多个文件进行碎片整理。我有什么替代方案?
文件系统中已经包含所有文件(它们不会以任何方式更改),并且几乎已满。有几个空闲块(根据df -h
:85G 中 434M 可用,已使用 80G)可用作缓冲区。我在碎片整理时不需要挂载文件系统。此外,我还有其他可用的文件系统,有足够的空间可用作缓冲区。
我的一个想法是将文件移动到其他文件系统,然后以某种方式将它们复制回来,告诉文件系统将它们连续存储。
[编辑]
我刚刚发现我不能依赖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.
答案1
我希望 ext4 文件系统中的所有文件不会因为某些原因而产生碎片。
虽然进行碎片整理有正当理由,但不需要每一个文件要进行碎片整理且连续。任何人想要对每个文件进行碎片整理的主要原因都与 OCPD 有关,这完全是浪费时间,因为文件系统在挂载 rw 后不久就会再次变得“碎片化”。
文件系统...几乎已满...
在这种情况下,您可能无法对每个文件进行碎片整理,因为 Linux 碎片整理程序倾向于在文件级别工作,并且您不一定有足够的连续可用空间来对每个文件进行碎片整理。
我的一个想法是将文件移动到其他文件系统,然后将它们复制回来......
这是最可行的选择。但是,具体的文件分配由文件系统驱动程序决定。
要重新排序块,只需有一个空闲块作为缓冲区即可。
Linux 文件系统开发人员没有像 Windows 开发人员那样优先考虑碎片整理。因此,问题不在于它在技术上不可能,而是没有人愿意编写任何程序来做到这一点。
碎片整理后,fs 可能会被设置为 ro。
然后使用专为 ro 使用而设计的文件系统,例如 squashfs。所有文件都将进行碎片整理、连续,甚至压缩。
答案2
如果您的某些文件很大,那么在不重新构建文件系统的情况下对所有文件进行碎片整理在技术上可能是不可能实现的。
任何ext4 文件系统由一系列块组组成。默认情况下,每个块组的长度为 128 MiB。
每个块组以一堆文件系统元数据(超级块、组描述符、分配位图和 inode 表)开头,后面是属于该块组的文件使用的实际数据块。这意味着文件系统元数据几乎均匀地分散在整个设备上。
但是,由于可选flex_bg
功能,可以将多个块组聚合在一起形成一个更大的块组。mke2fs
自 2008 年以来,默认创建文件系统时将 16 个块组打包在一起。假设您在使用-G
mkfs 选项创建文件系统时没有更改这一点,那么您的文件系统可能会被拆分成 2 GiB 的弹性组。
除非您的所有文件都明显小于 2 GiB,否则您将不可避免地遇到这种情况:下一个要存储的文件必须分散在两个或多个 (flex) 块组中。当然,如果您的任何文件大于 (flex) 块组中的可用数据块,则肯定会发生这种情况。
为了实现您的目标,您很可能必须使用-G
比默认值 16 高得多的选项设置来重新格式化文件系统,以使文件系统使用真正大的弹性块组。
答案3
在 DOS 6 之前,对 FAT 分区进行碎片整理的通常建议是:
- 将文件从分区复制到其他分区;
- 擦拭分区;
- 在空分区上重新创建目录结构;并且
- 将文件复制回来。
我从未尝试过这样做,因为 MS-DOS 6 推出时(附带碎片整理实用程序),碎片整理对我来说才成为问题。