![Rsync 增量复制不适用于虚拟磁盘](https://linux22.com/image/594573/Rsync%20%E5%A2%9E%E9%87%8F%E5%A4%8D%E5%88%B6%E4%B8%8D%E9%80%82%E7%94%A8%E4%BA%8E%E8%99%9A%E6%8B%9F%E7%A3%81%E7%9B%98.png)
我尝试使用 rsync 将虚拟机复制到远程主机,但 deltacopy 似乎不起作用。我在 CentOS 6.2 上使用 Virtualbox。我的虚拟机有 1 个快照,所以我只复制快照文件而不是整个基础映像。当我复制到映射为本地驱动器的远程主机时(在这种情况下不使用 rsync deltacopy),这种方法有效。
问题是,当我使用 rsync 通过 ssh 复制简单文本文件时,更改会被复制,但当我使用相同方法复制快照文件时,更改(例如在桌面上创建的文本文件)不会被复制。有没有人成功使用 rsync 将更改复制到 VM HDD 而不复制整个文件?
答案1
我认为 rsync 可能确实会为虚拟磁盘执行增量复制,但磁盘太大,因此需要读取整个磁盘才能找到差异。对于多个文件(如普通文件系统,而不是虚拟磁盘),rsync 可以使用所有文件的各个时间戳和大小,但对于虚拟磁盘,它只有 1 个文件。
因此,如果您在本地复制文件,则会在同一台计算机上读取两次磁盘(2 个文件,源文件和目标文件),因此速度仍然很慢;如果是远程文件,则通过网络传输的速度很慢,但在滚动差异过程中,两个单独的 rsync 进程仍然会在两侧读取整个磁盘。我还没有完全验证这一点,但观察 iostat(所有磁盘活动而不仅仅是我的 rsync 测试),我发现写入速度与读取速度相比非常低。
此外,使用 rsync 进行复制时,它会在覆盖目标文件之前创建一个临时文件。为了避免这种情况,您可以使用 --inplace。这样,您就永远不会写入第二个副本,但您仍然会读取整个磁盘,因此这不是一个完美的解决方案。
我最初说过:我认为没有办法绕过读取整个文件...要做到这一点,你需要除了 rsync 之外的其他东西,比如具有增量发送功能的写时复制文件系统(如 btrfs 或 zfs),即仅从文件系统元数据中就可以知道差异,而不必再次读取所有数据。
编辑:今天我意识到如果文件被分成许多部分,您可能可以避免读取整个文件,因此每个部分都有不同的时间戳等。使用 vmdk 格式的 Split2G 变体,将文件分成许多 2GB 的文件(但我还没有验证各个部分是否具有不同的时间戳)。