ext4 文件系统需要进行碎片整理吗?

Ben*_*ebe 61 defragment filesystems ext4

ext4文件系统需要进行碎片整理?如果是这样,我如何对它们进行碎片整理?

如果没有,您能否简单解释一下为什么不需要对它们进行碎片整理?

pnu*_*uts 39

ext4文件系统需要进行碎片整理?

是的(但很少)。

如果是这样,我如何对它们进行碎片整理?

从分区复制所有文件,从分区中删除文件,然后将文件复制回分区。当您将文件复制回磁盘时,文件系统将智能地分配文件。

如果没有,您能否简单解释一下为什么不需要对它们进行碎片整理?

ext4比仅仅将新文件添加到下一个可用空间更智能。Linux 文件系统不是将多个文件彼此靠近放置在硬盘上,而是将不同的文件分散在整个磁盘上,从而在它们之间留下大量可用空间。当文件被编辑并需要增长时,通常有足够的可用空间供文件增长。如果确实发生碎片,文件系统将尝试移动文件以减少正常使用中的碎片,而无需碎片整理实用程序。

感谢@Green Reaper 的评论,我的注意力被吸引到了e4defrag 上

  • 指向您复制/粘贴的源的链接永远不会受到伤害......;) http://www.howtogeek.com/115229/ (16认同)
  • 名为 e4defrag 的工具可用于对 ext4 进行碎片整理。它由大多数发行版上的 e2fsprogs 提供。[ext4 也尽量避免碎片化](https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Block_and_Inode_Allocation_Policy),但并不总是成功。 (4认同)

小智 25

我已经使用 ext4 分区一年多了。我经常用完空间,将大量文件移入移出等等......这些东西对碎​​片化不利,昨天我第一次检查了碎片,只有 2 个文件(不是 %,只有两个文件)被碎片化.

在使用了大约一年并有更多可用空间的 Windows 分区上,我有 95% 的碎片。

所以不,您真的不需要对 ext4 进行碎片整理,如果您想确定,请为 ext4 保留默认可用空间(默认为 5%,可以通过 更改ex2tunefs -m X)。

  • 如果你有一个使用 `extent` 选项创建的 ext4 文件系统(这是最近发行版的默认设置),你可以使用 `e4defrag -c /path/to/check` 检查它的碎片,并在不卸载的情况下使用 ` e4defrag /path/to/check`。但是,如果您有足够的可用空间,则不需要这样做。 (14认同)
  • 你如何检查碎片? (2认同)

Art*_*nov 6

这是 2022 年的更新

碎片的发生有多种原因:

  • 当操作系统无法智能管理文件时
  • 没有足够的连续空间来写入文件
  • 当多个应用程序同时向磁盘写入不同的文件时

进行碎片整理的原因

为什么需要对文件进行碎片整理?在 HDD 上,需要这样做才能更快地访问文件或将它们移动到提供更高速度的磁盘区域(盘片的外侧)。然而,还有另一件重要的事情很多人没有意识到:当文件碎片化时,当您有意或无意地删除它们时,将无法恢复它们,因为碎片太多,无法理解它们需要按什么顺序重新组合。ext4 的正常扇区大小为 4K,因此 1GB 文件理论上最多可以有 262144 个片段。在人们说这永远不会发生之前,我的服务器上,我们的程序员以大致相同的速度同时写入两个 MySQL 文件,因此生成的文件严重碎片化,它们的读取速度远低于 1MB/秒,而大约为 200MB/秒对于“普通”文件。

至于 SSD,几乎没有理由进行碎片整理,但也有理由不这样做,因为 SSD 的擦除/写入周期数量有限。但这仍然需要写入大量数据,因为现代 SSD 具有相当大的备用区域来缓解这个问题。

在数据恢复方面存在问题。如果您启用了discard挂载选项,则删除的文件将永远消失,因此无论它们之前是否进行过碎片整理都没关系,您无法以物理方式恢复它们。

如果您选择不使用此选项,而是依靠每周一次的工作来完成此任务 ( fstrim),那么碎片整理就有意义。

找出碎片量

我真的怀疑之前的评论是否诚实地描述了 ext4 的碎片程度。在某些情况下,它可以并且会产生大量文件碎片,某些应用程序(例如 systemd-journald)故意这样做。

您可以运行e2fsck来检查分区碎片的严重程度。在已安装的分区上,这会产生大量错误,请忽略它们:

sudo e2fsck -n -v -f /dev/partition
Run Code Online (Sandbox Code Playgroud)

实际上正在整理碎片

为了对 ext4 进行碎片整理,我编写了一个需要在 root/sudo 下运行的脚本 - 您可以在此处获取它。它将对除正在运行的应用程序的二进制文件之外的所有内容进行碎片整理 - 您可能需要事先退出它们。它需要一个参数来运行 - 一个路径,例如

sudo defrag /
Run Code Online (Sandbox Code Playgroud)

该脚本仅对给定分区上的文件进行碎片整理。如果您已经挂载了分区,则直接指定它们,即sudo defrag /mnt/archive. 它也可能不会对您的交换文件进行碎片整理,因此sudo swapoff -a有必要在它之前运行。

这不会对目录进行碎片整理,目录也会变得碎片化。为此,您需要在未安装的分区上运行 e2fsck:

sudo e2fsck -D -f -v -C 0 -n /dev/partition
Run Code Online (Sandbox Code Playgroud)

有时卸载分区变得非常困难,请使用任何实时 Linux 发行版,例如System Rescue

可用空间碎片整理问题

ext4 的最大问题是它只能对单个文件进行碎片整理,因此您无法进行碎片整理或创建连续的可用空间(为此您需要使用不同的文件系统,例如 XFS)。完全有可能拥有大量可用空间但无法对相对较小的文件进行碎片整理。

例如,我的 Fedora 根 FS 有 20GB 空间,占用的空间不到 7GB,但我无法对一些重量小于 200MB 的二进制文件和库(chrome、libxul.so)进行碎片整理。原因?一般的 Linux 发行版包含大量文件(我的安装超过 30K,甚至不是 Gnome/KDE),当您将这些文件分布在分区上时,不会有那么多“漏洞”,并且有大量可用空间。

结论/TLDR

  • 如果您有硬盘,您可能需要对其进行碎片整理
  • 如果您有 SSD,通常不需要对其进行碎片整理,除非您想增加成功恢复已删除文件的机会
  • 如果您想对文件系统进行完全碎片整理,则需要不同的文件系统,例如 XFS。