如何让ext3转ext4支持e4defrag?

otu*_*tus 5 ext4 ext3 defrag

我有两个非常旧的 ext3 文件系统,并且很长一段时间内都已满 99%,导致碎片化。此外,它们还用于运行具有动态磁盘映像和其他碎片化工作负载的 VM。

我最近使用此处的说明将文件系统转换为 ext4 ,特别是通过运行:

# tune2fs -O extents,uninit_bg,dir_index /dev/DEV
# e2fsck -fDC0 /dev/DEV
Run Code Online (Sandbox Code Playgroud)

但是,文件系统仍然不支持e4defrag

Failed to defrag with EXT4_IOC_MOVE_EXT ioctl:Operation not supported   [ NG ]
Run Code Online (Sandbox Code Playgroud)

我猜这个tune2fs命令缺少一些选项,但谷歌搜索并没有帮助我弄清楚这可能是什么。

Joo*_*ols 5

我有同样的问题。我找到了答案:

https://wiki.archlinux.org/index.php/Ext4#Migrating_files_to_extents

将文件迁移到扩展区

警告:不要对已在本地克隆的 Mercurial 存储库使用以下方法,因为这样做会损坏存储库。它也可能破坏文件系统中的其他硬链接。

即使文件系统现在已转换为 ext4,转换前已写入的所有文件尚未利用 ext4 的新范围,这将提高大文件性能并减少碎片和文件系统检查时间。为了充分利用 ext4,所有文件都必须在磁盘上重写。e4defrag正在开发一个名为的实用程序,它将负责这项任务;然而,它还没有准备好投入生产。

幸运的是,可以使用该chattr程序,这将导致内核使用范围重写文件。可以在一个分区的所有文件和目录上运行此命令(例如,如果/home在专用分区上):(必须以 root 身份运行)

find /home -xdev -type f -print0 | xargs -0 chattr +e
find /home -xdev -type d -print0 | xargs -0 chattr +e
Run Code Online (Sandbox Code Playgroud)

建议先在少量文件上测试此命令,然后检查是否一切正常。转换后检查文件系统也可能很有用。

使用该lsattr命令,可以检查文件现在是否正在使用范围。字母“e”应出现在所列文件的属性列表中。

——

注意:我假设 e4defrag 可以将文件转换为使用范围。失败的 ioctl 就是那个 afaik,所以我有点困惑为什么它不起作用,但chattr +e对我有用。之后,你有chattr +e文件,然后可以使用e4defrag它们。显然,请确保您有备份等以防万一(我本以为这是安全的,但您永远不知道 - 这里有关于硬链接的警告,但我没有找到其他有关硬链接已知问题的参考)。

  • 我已按要求改进了答案。 (2认同)