rsync --remove-source-files 到同一驱动器可以减少碎片吗?

rsync --remove-source-files 到同一驱动器可以减少碎片吗?

我知道rsyncwith --remove-source-files(我使用它来代替mv以便可以合并目录层次结构)会创建新的 inode:

stat 2021_07_30_20_18_17.pdf~
rsync --remove-source-files 2021_07_30_20_18_17.pdf~ 2021_07_30_20_18_17.pdf~.moved
stat 2021_07_30_20_18_17.pdf~.moved
Device: 805h/2053d  Inode: 4850411     Links: 1
Device: 805h/2053d  Inode: 4849693     Links: 1

既然它分配了新的 inode,这是否意味着它为目标文件分配了新空间?还是--remove-source-files只是让新 inode 指向原始文件的内存位置?

背景

我之所以问这个问题,是因为我的驱动器由于目录层次结构庞大,大小文件混杂在一起而导致速度非常慢,我猜这会使碎片化更加严重。由于大多数 Linux 文件系统不会出现碎片化,因此没有像 Windows 那样简单的碎片整理工具。

我知道我可以 rsync 到一个新的驱动器以减少碎片,但相同的驱动器?从内存分配的角度来看,文件的移动方式是否相同?

答案1

rsync 始终以双进程模式运行 - 仍然有一个“发送方”进程和一个“接收方”进程(只是父进程的一个分支),它们通过套接字对交换数据,就像它们在网络上通信一样。这意味着即使是本地复制/移动仍然需要读取整个原始文件,将其流式传输到 rsync 接收方进程,然后将所有内容写入新文件。

(这种架构特定于 rsync,也不一定适用于其他工具。例如,cp A B甚至cat A > B 不要保证完成完整的复制——他们可能会复制完整的数据,但也可能会故意要求文件系统将现有数据链接到新文件。

然而,目前 ext4 根本不支持此类链接;基于“reflink”的副本仅在 Btrfs 和 XFS 中存在。因此cp A Bext4 上的此时生成一份完整的副本。)

由于大多数 Linux 文件系统不会出现碎片,因此没有像 Windows 那样简单的碎片整理工具。

他们做1,并且有工具——e2fsprogs(官方 ext4 工具集)有e4defrag,btrfs-progs 类似地有btrfs fi defrag,等等。

1只是不像 FAT16/FAT32 那样(ext2 的设计部​​分避免碎片问题以前的 Linux“ext”文件系统曾经有过这种情况),但这并不意味着它们可以完全避免碎片化,甚至比 NTFS 更能避免碎片化。特别是,任何类型的“写时复制”文件系统(例如 Btrfs或 ZFS或 NILFS)将通过设计当文件被覆盖时,就会出现严重碎片化。

相关内容