![Rsync -avzHP 遵循硬链接,而不是将其复制为硬链接](https://linux22.com/image/576801/Rsync%20-avzHP%20%E9%81%B5%E5%BE%AA%E7%A1%AC%E9%93%BE%E6%8E%A5%EF%BC%8C%E8%80%8C%E4%B8%8D%E6%98%AF%E5%B0%86%E5%85%B6%E5%A4%8D%E5%88%B6%E4%B8%BA%E7%A1%AC%E9%93%BE%E6%8E%A5.png)
我使用 rsnapshot 创建我的“工作”共享的每小时/每日/每周/每月备份。现在我尝试使用 rsync 将整个备份目录复制到外部驱动器上。
我在屏幕会话中使用了这个命令/参数(是的,rsync-exclude.txt 位于我运行命令的目录中)
rsync -avzHP --exclude-from 'rsync-exclude.txt' /share/backup/ /share/eSATADisk1/backup/;
整个系统在 QNAP TS-439 上运行,内部驱动器是单个磁盘(无 RAID),格式为 EXT4,外部驱动器格式为 EXT3。
实际情况是:Rsync 跟踪每个硬链接,复制实际文件,而不是重新创建更新的硬链接在外部驱动器上。我没有立即意识到这一点,因此外部驱动器最终被相同文件的 xxx 份副本破坏。
我想要实现的是:将 rsnapshot 生成的整个文件结构复制到外部驱动器,保留硬链接以节省空间。注意:这不一定非要使用 rsync 来完成。
感谢您的想法和时间。我非常感谢您的帮助。
更新:我了解到,rsnapshot 没有使用符号链接,而是使用硬链接,所以我现在使用 -H 选项,它应该根据保留硬链接结构Rsnapshot 到多个目的地(或维护硬链接结构)但它仍然不起作用...我在这里遗漏了什么?
更新 2:我在这里发现了关于这个话题的另一种观点/说法:rsync 与 --hard-links 选项一起冻结Steven Monday 建议不要尝试 rsync 包含硬链接的大型文件结构,因为它会占用大量内存,而且对于 rsync 来说是一项艰巨的任务。因此,更好的解决方案可能是制作我尝试备份的数据结构的 .img。你怎么认为?
答案1
这rsync
命令的-H
(或--hard-links
)选项理论上会完成您想要完成的任务,简而言之:创建文件系统的副本,并保留原始文件系统的硬链接结构。正如我在我对另一个类似问题的回答,一旦源文件系统的硬链接复杂性超出某个阈值,此选项注定会失败。
该阈值的精确位置可能取决于您的 RAM 和硬链接总数(可能还有其他一些因素),但我发现尝试精确定义它是没有意义的。真的问题是,在现实生活中,这个门槛太容易跨过了,而你却不知道有跨越它,直到有一天你试图跑一场rsync -aH
或一场cp -a
挣扎并最终失败。
我的建议是:将大量硬链接的文件系统作为一个单元进行复制,而不是作为文件进行复制。也就是说,将整个文件系统分区作为一个大块进行复制。有许多工具可以做到这一点,但最常见的是dd
。
使用原厂固件,您的 QNAP NAS 应该dd
内置有 以及fdisk
。使用fdisk
,在目标驱动器上创建一个至少与源分区一样大的分区。然后,使用dd
在新创建的目标分区上创建源分区的精确副本。
在dd
复制过程中,您必须确保源文件系统中没有任何变化,否则最终会导致目标上的副本损坏。一种方法是umount
在开始复制过程之前访问源;另一种方法是将源挂载为只读模式。
答案2
-l
用于符号链接,为什么它会对硬链接做任何事情?
(抱歉,这是一个答案,而不是评论,我还没有评论权,而且这个答案需要回复)
另一个需要注意的是:这都是本机硬件吗,还是您在虚拟机、网络安装上?
编辑
忽略我之前关于你为什么使用硬链接的评论,我错过了该rsnapshot
评论。
进行一个测试会很有帮助,首先测试两个本地目录(本地磁盘)之间的 rsync,然后测试远程磁盘。这个小测试显示选项-H
按预期工作。-i
选项ls
显示 inode,从而显示链接已保留,没有额外的副本。
$ rsync -avzHP src/ dest
sending incremental file list
created directory dest
./
file111_prime.txt
9 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/3)
file111.txt => file111_prime.txt
sent 156 bytes received 59 bytes 430.00 bytes/sec
total size is 18 speedup is 0.08
$ ls -liR
.:
total 8
414044 drwxrwxr-x. 2 nhed nhed 4096 Feb 25 09:58 dest
414031 drwxrwxr-x. 2 nhed nhed 4096 Feb 25 09:58 src
./dest:
total 8
414046 -rw-rw-r--. 2 nhed nhed 9 Feb 25 09:57 file111_prime.txt
414046 -rw-rw-r--. 2 nhed nhed 9 Feb 25 09:57 file111.txt
./src:
total 8
414032 -rw-rw-r--. 2 nhed nhed 9 Feb 25 09:57 file111_prime.txt
414032 -rw-rw-r--. 2 nhed nhed 9 Feb 25 09:57 file111.txt
rsync -avzHP src/ host:/tmp
对远程主机的后续测试仍然保持硬链接
答案3
这是一个不太可能的尝试,但如果你找不到其他解决方案,我建议尝试将 USB 驱动器格式化为 EXT4。也许这可能是问题所在:https://bugzilla.samba.org/show_bug.cgi?id=7670
如果源文件夹中有足够多的硬链接,而目标卷又足够小,则使用 rsync --hard-links 进行复制可能会失败。Rsync 会因耗尽目标上的最大硬链接数量而失败 <...> 真正的问题不是 rsync,而是底层文件系统。
答案4
您是否尝试过添加该-l
选项?
我知道手册页说它包含在内,-a
但手册页并不总是 100% 准确。