答案1
您实际上并不需要手动对 Btrfs 文件系统进行碎片整理。
是的,Btrfs 是 COW(写时复制),这意味着它比 Ext 更易对文件进行碎片整理,但这在设计的几个方面都得到了解决,包括能够在文件系统在线时轻松对其进行碎片整理。这摘抄提供更多细节(重点是我的):
自动碎片整理
COW(写时复制)文件系统有很多优点,但也有一些缺点,例如碎片化。当文件首次写入磁盘时,Btrfs 按顺序排列数据,但 COW 设计意味着对文件的任何后续修改都不能写入旧数据之上,而必须放在空闲块中,这将导致碎片化(RPM 数据库是此问题的常见案例)。此外,它还存在所有文件系统都存在的碎片化问题。
Btrfs 已经提供了解决这个问题的替代方案:首先,它支持使用命令进行在线碎片整理
btrfs filesystem defragment
。其次,它有一个挂载选项,-o nodatacow
可以禁用数据的 COW。现在 btrfs 增加了第三个选项,即-o autodefrag
mount 选项。此机制可检测文件中的小随机写入,并将它们排队以进行自动碎片整理过程,因此文件系统将在使用时自行进行碎片整理。它目前还不适合虚拟化或大型数据库工作负载,但适用于较小的文件,如 rpm、SQLite 或 bdb 数据库。
因此,只要您不打算在高负载下运行数据库等 IO 密集型软件,只要使用该autodefrag
选项挂载文件系统,一切就都没问题。
要检查文件的碎片,您可以使用文件碎片公用事业:
find /path -type f -exec filefrag {} + >frag.list
现在您可以使用您喜欢的工具来对数据进行排序。
在 systemd 系统上,/var/log/journal/
可能是最分散的。您还可以查看~/.mozilla
和其他浏览器数据库。
要进行碎片整理,请使用:
sudo btrfs fi defrag -r /path
答案2
对 btrfs 文件系统进行碎片整理的命令是
btrfs filesystem defragment sync -r -v -f [-czlib] / /home
答案3
基于这个答案我想到了:
sudo find / -xdev -type f -exec filefrag {} + | sed -En 's/(.+): (\w+) extent.*/\2 \1/p' | sort -nr
这首先列出最碎片化的文件,格式如下:
<num-fragments> <pathname>
答案4
为了这个主题,我认为最好澄清一下:
任何文件系统!=恢复/管理实用程序
请记住,文件系统是关于如何在物理硬件上组织数据,其他所有活动都是通过额外的软件和实用程序完成的,特别是在 GNU/linux 中,这些软件和实用程序是由可能与创建文件系统的人没有严格关系的人完成的。
Btrfs 的情况可能并非如此,但有时我们接近这种情况,因为桌面和企业环境可以提供具有不同可靠性级别的不同解决方案。
对您的问题的答案是“否”,但与通用文件系统的正常行为相关的“否”是肯定的,并且您可以找到的每个实用程序都只是一个不同的项目。
当您需要对文件系统进行碎片整理时,请记住,您将使用与文件系统本身的生命并不真正相关的外部软件,它有优点也有缺点。