我有两个 ext3 文件系统,它们非常老旧,长期以来一直处于 99% 的占用率,导致出现碎片。此外,它们还用于运行带有动态磁盘映像的虚拟机和其他会导致碎片化的工作负载。
我最近按照说明将文件系统转换为 ext4这里,具体方法是运行:
# tune2fs -O extents,uninit_bg,dir_index /dev/DEV
# e2fsck -fDC0 /dev/DEV
但是,文件系统仍然不支持e4defrag
:
Failed to defrag with EXT4_IOC_MOVE_EXT ioctl:Operation not supported [ NG ]
我猜测该tune2fs
命令缺少一些选项,但谷歌搜索并没有帮助我弄清楚那可能是什么。
答案1
我也遇到了同样的问题。我找到了以下答案:
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
建议先在少量文件上测试此命令,并检查是否一切正常。转换后检查文件系统也可能会很有用。
使用该lsattr
命令可以检查文件现在是否正在使用扩展区。字母“e”应出现在所列文件的属性列表中。
--
注意:我曾假设 e4defrag 可以将文件转换为使用扩展区。据我所知,失败的 ioctl 就是这样做的,所以我有点困惑为什么它不起作用,但chattr +e
对我来说确实有效。获得chattr +e
文件后,您就可以使用e4defrag
它们了。显然,请确保您有备份等以防万一(我本以为这是安全的,但你永远不知道 - 这里有关于硬链接的警告,但我找不到其他关于已知硬链接问题的参考资料)。