我知道rsync
with --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 B
ext4 上的此时生成一份完整的副本。)
由于大多数 Linux 文件系统不会出现碎片,因此没有像 Windows 那样简单的碎片整理工具。
他们做1,并且有工具——e2fsprogs(官方 ext4 工具集)有e4defrag
,btrfs-progs 类似地有btrfs fi defrag
,等等。
1只是不像 FAT16/FAT32 那样(ext2 的设计部分避免碎片问题以前的 Linux“ext”文件系统曾经有过这种情况),但这并不意味着它们可以完全避免碎片化,甚至比 NTFS 更能避免碎片化。特别是,任何类型的“写时复制”文件系统(例如 Btrfs或 ZFS或 NILFS)将通过设计当文件被覆盖时,就会出现严重碎片化。