rsync
我通过over支持 ip 我的服务器,ssh
但/var/log/lastlog
文件是 1.2G(硬盘上只需要 24K)。在本地计算机上cp
可以立即复制它(几毫秒),但rsync
需要读取整个文件,这需要几个小时。我还尝试将服务器安装/var/log
到sshfs
我的本地电脑,但我的本地电脑检测到该文件为 1.2T(因此sshfs
似乎没有检测到稀疏文件)。是否有一些程序可以通过 ssh 检测稀疏文件,并可以以相同的方式复制它们cp
(无需从文件中读取空块)?
编辑:rsync
的-S/--sparse
选项仍然想要读取整个源文件(包含所有空字节),这对于 1.2T 文件来说需要几个小时。读取整个文件后,rsync
它会创建小目标文件(适当的稀疏文件),但问题是它读取包含所有空字节的源文件(而不跳过它们)。cp
复制文件只需几毫秒,而rsync
需要几个小时。您可以尝试(在 Linux 上)通过创建 20G 稀疏文件truncate -s 20G sparse_file1
并复制它rsync -S sparse_file1 sparse_file2
(需要很长时间),然后尝试复制它cp sparse_file1 sparse_file3
(需要几毫秒)。
答案1
别担心,你已经做得很好了rsync -S
。
原因cp
是速度快得多,因为它并没有真正复制它。这可能有很多原因,我能想到的前两个是:
系统决定文件系统不需要立即同步,复制将在稍后在后台进行(或在您运行时立即进行
sync
)。请参阅man sync
获取更多信息。您有一个具有类似牛/重复数据删除功能的文件系统。其效果将是
cp
创建我所说的“伪装的硬链接”。在这种情况下,永远不会物理地进行副本,文件中的数据只是获得一个额外的名称(就像真正的硬链接)。但是(与真正的硬链接相反)当源文件和目标文件将来收到不同的更改时,这些更改将物理保存在不同的位置,并且文件系统会将更改绑定到正确的文件。查看有关写时复制和重复数据删除的任何文档(例如维基百科页面)以获取更多信息。