![rsync 在继续损坏的副本时使用哪些临时文件?](https://linux22.com/image/153181/rsync%20%E5%9C%A8%E7%BB%A7%E7%BB%AD%E6%8D%9F%E5%9D%8F%E7%9A%84%E5%89%AF%E6%9C%AC%E6%97%B6%E4%BD%BF%E7%94%A8%E5%93%AA%E4%BA%9B%E4%B8%B4%E6%97%B6%E6%96%87%E4%BB%B6%EF%BC%9F.png)
在“源端”我正在运行:
rsync -azP file.txt username@target:/root/
我必须中断一次(CTRL+C),但是随后发出相同的命令,所以 rsync 正在继续,就在它离开的地方(据我所知)。
在“目标端”我可以看到这些文件:
username@target:/root> ls -lah|grep -i file.txt
-rw-r--r-- 1 username group 120G May 3 16:32 file.txt
-rw------- 1 username group 342G May 8 12:47 .file.txt.yISk8R
username@target:/root>
file.txt:我认为(?)它是在中断 rsync 一次之前已经传输的部分。
.file.txt.yISk8R:我认为(?)这是在一次性 rsync 中断发生后传输的部分。
在 SLES12 上使用 rsync-3.1.0-12.1.x86_64
q:目标端的这两个文件到底是什么?
那么当 rsync 完成时,它会将“.file.txt.yISk8R”附加到“file.txt”吗?
还是更复杂?:
我可以看到“.file.txt.yISk8R”的开头看起来与原始“file.txt”相同,因此规则可能有所不同......:
source:/root # head -1 file.txt|strings|head -1
A_.o
source:/root #
username@target:/root> head -1 .file.txt.yISk8R|strings|head -1
A_.o
username@target:/root>
username@target:/root> head -1 file.txt|strings|head -1
f/o*d
username@target:/root>
我可以看到“.file.txt.yISk8R”在仍在进行的传输过程中不断增长。
即使从https://linux.die.net/man/1/rsync
-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
-z, --compress compress file data during the transfer
-P same as --partial --progress
->
--partial keep partially transferred files
->
--partial
By default, rsync will delete any partially transferred file if the transfer is
interrupted. In some circumstances it is more desirable to keep partially
transferred files. Using the --partial option tells rsync to keep the partial
file which should make a subsequent transfer of the rest of the file much faster.
最初的目的是将这些文件从“目标”转发到另一个“目标2”,同时它们仍在复制到“目标”。我应该开始复制“.file.txt.yISk8R”文件吗?那为什么“file.txt”有120G大小呢?或者数据以某种方式重复?
2019 年 5 月 13 日更新:天哪,我可以看到这些几乎是重复的数据...所以当您复制 600 GB 文件并在 ex.: 500 GB 处中断时,您将需要在目标端至少 1100 GB 存储,因为 rsync 与“- azP”将创建几乎重复的文件(.file.txt.xxxxx 与 file.txt)。为什么它不对较小的块进行一些哈希处理,然后根据最后一个块没有相同的哈希值继续进行?
答案1
该过程的一些背景可以阅读:https://rsync.samba.org/how-rsync-works.html(特别是在“接收者”部分)。
目标端的这两个文件到底是什么?
在您开始(最近的)同步之前,第一个文件已经存在。也许您之前已经同步过?假设使用默认选项,它将一直保留在那里,直到rsync
认为同步已完成。
第二个文件是最近同步期间使用的临时文件。使用默认选项,它将在下次运行时在该点拾取。
那么当 rsync 完成时,它会将“.file.txt.yISk8R”附加到“file.txt”吗?
不会。它将删除现有的“file.txt”,然后将临时文件重命名为新的“file.txt”。
我可以看到“.file.txt.yISk8R”在仍在进行的传输过程中不断增长。
是的。文件传输不是原子的。这就是使用隐藏文件名的原因。在正常情况下,您不想访问该文件,因为它可能正在更改或不完整。
如果您要继续处理,则应该忽略临时文件。只需复制“file.txt”即可。该文件应始终一致且完整(如果不是始终是最新的)。