`cp -al`快照,其硬链接在编辑后会定向到新文件


11

我正在尝试定期为大型文件夹拍摄快照。

我在这里阅读过:http : //www.mikerubel.org/computers/rsync_snapshots/#Incremental
,它cp -al可以通过简单地复制硬链接来获取文件夹快照。

很好,但问题是在此快照中,如果我更改文件,则所有快照中的文件都会更改。相反,我希望系统在更改时创建一个新文件并链接到该文件。这样,每个快照都不会在编辑第一个文件时失效。

我该如何实现?

ps我试过了rsync -a --delete --link-dest=../backup.1 source_directory/ backup.0/,但是有同样的问题。

Answers:


7

这就是硬链接的工作方式。但是,有一些解决方法:

我想到了两个选择:

  • 使用支持写时复制文件的文件系统,例如btrfs。当然,如果您使用btrfs,则只需使用其本机快照...如果文件系统支持,则可以使用cp --reflink=always。不幸的是,ext4不支持此功能。
  • 仅在快照之间共享硬链接,而不与原始快照共享硬链接。也就是说,第一次看到文件的给定版本时,请将其复制到快照。但是下次,将其链接到上一个快照中的快照。(不确定十年前我曾经用什么程序执行此操作,但是搜索会出现烦恼,烦恼,storebackup和rsnapshot)
  • 根据文件的更改方式,您可能可以保证使用写入临时文件/重命名来更改它们,然后这将中断硬链接-因此快照中的版本将保持原始状态。不过,这样做不太安全,因为错误可能会破坏快照。
  • 拍摄整个文件系统的LVM快照。

当然,还有另一种选择-使用适当的备份系统。他们大多数人只能备份更改的文件。


您如何推荐备份大型文件夹?
2013年

我当时正在考虑将rsync应用于具有cronjob的服务器,以便定期执行cp -al进行快照..以及rsync-inging onward甚至更多副本。听起来怎么样?
Hermann Ingjaldsson

@HermannIngjaldsson很好,这取决于您如何进行备份。就个人而言,我只是将其添加到我的Bacula设置中,但除非您有一堆要备份的机器或已经了解Bacula,否则我不建议您这样做。所以,我想建议您先尝试rsnapshot。
derobert

rsnapshot很好
developerbmw

4

您正在寻找的是一种复制形式,其中具有相同内容的多个文件使用磁盘上的相同空间,直到其中一个被修改。硬链接仅在进行写操作的应用程序删除文件并使用相同名称创建新文件时实现写时复制(通常是通过使用不同名称创建新文件,然后将其移动到位来完成)。您正在使用的应用程序显然没有执行此操作:它正在覆盖现有文件。

可以将某些应用程序配置为使用替换策略。某些应用程序默认情况下使用替换策略,但是在看到具有多个硬链接的文件时会使用覆盖策略,以确保不会破坏硬链接。如果您可以将应用程序配置为替换而不是覆盖,则当前的快照技术将起作用。

Fl-cow修改程序以系统地对具有多个硬链接的文件使用替换策略。

或者,您可以将文件存储在执行写时复制或重复数据删除或具有快照功能的文件系统中,而不用担心硬链接:BtrfsZfs。根据您的分区方案,可以选择使用LVM快照。

我的建议是使用适当的快照工具。进行可靠的备份非常困难。您可能需要rsnapshot


2

以下是我编写的ruby脚本,该脚本将“ cp -al”和rsync包装到一个可以手动或通过cron运行的漂亮脚本中。目标可以是本地或远程(通过ssh):

贫民窟的时光机

如上一则评论所述,您问题的基本答案必须与硬链接分开。例如,假设您的主目录是每日备份:

资源:

  • / home / flakrat

目的地:

  • / data / backup / daily
    • /星期一
    • /星期二
    • /星期三
    • /星期四
    • ...

通过对昨天的备份运行“ cp -al”来创建硬链接。假设是星期二早上运行它:

cd /data/backup/daily

rm -rf tuesday

cp -al monday tuesday

rsync -a --delete /home/flakrat /data/backup/daily/tuesday/


0

rdiff-backup似乎可以满足您的要求,请检查一下。

使用rsync,首先必须不使用硬链接进行完整备份。下一个备份可以指向上一个备份,并可以硬链接到该备份。这样,您的备份就不会硬链接到您的工作文件(正在修改的文件)。例。如果我以前的备份是文件夹backup.01,那么我的备份脚本将首先通过将文件夹重命名一个文件夹来增加文件夹的名称,以便backup.01成为backup.02。然后,脚本将创建一个名为backup.01的新空文件夹。然后它将新备份备份到新文件夹中,并硬链接到backup.02,这样只有新文件才会占用备份中的任何空间。rsync命令如下所示:rsync -rlt sourcepath backuppath / backup.01 --link-dest = backuppath / backup.02

因此,您可以看到,所有的硬链接都发生在备份路径上。这样,当您在源路径中修改文件时,您不必担心写时复制。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.