基于 rsync 和 ln 实现“写时复制”的快照备份功能
一、基本原理 这里“写时复制”加了一个引号,因为这是专门针对使用rsync备份时的写时复制效果,而不是事实上的写时复制(copy-on-write),其达到的目的如下: 使用 rsync 备份数据后,立即创建一份快照: 该快照的数据状态不会因为之后的同步行为被改变,而是始终保持快照创建时的状态。 该快照不会占用额外的存储空间。 再次使用 rsync 备份,原文件发生变化,或出现新的文件,则只有发生变化的文件和新出现的文件才会占用新的存储空间。 实现这一功能,主要依赖于一个事实: 使用 rsync 进行备份时,针对内容发生变化的文件,新备份的文件与原文件对比,inode 将被改变。 我们知道,Linux 文件系统中以 inode 作为文件索引,inode 编号相同的多个文件称为硬链接,指向的是硬盘中同一块数据,占用同一份存储空间。多个硬链接之间地位等同,没有主从之分,只要有一份硬链接拷贝没有删除,这个文件所占用的存储空间就不会释放出来。我们使用 rsync 进行备份时,如果文件内容没有发生变化,则rsync跳过该文件不作处理,如果文件内容发生变化,rsync 则删除原文件并重新复制文件为同一文件名,此时虽然文件相同,但 inode 将发生变化,表示备份前后的文件是文件名相同的不同文件。 基于这个事实,我们可以在备份完成后,对每一个文件创建硬连接,并以相同的目录结构保存