简单备份解决方案

我正在为我的Ubuntu服务器上的目录寻找一个非常基本的备份脚本/包。 目前我正在使用这样的cronjob:

0 5 * * 1 sudo tar -Pzcf /var/backups/home.tgz /home/ 

但我想要一个解决方案,它为文件名添加时间戳,不会覆盖旧备份。 当然,这将慢慢充斥我的驱动器,因此需要自动删除旧备份(例如,超过2个月)。

干杯,丹尼斯


更新:由于它很简单,我决定给logrotate -solution提供赏金。 但是非常感谢所有其他的回答者!

使用logrotate的简单解决方案

如果你想保持简单而没有脚本,只需保留当前的cronjob,并为其配置logrotate规则。

为此,请将以下内容放在名为/etc/logrotate.d/backup-home的文件/etc/logrotate.d/backup-home

 /var/backups/home.tgz { weekly rotate 8 nocompress dateext } 

从现在开始,每次logrotate运行时(通常每天都会在早上6点25分左右运行),它将检查它是否适合旋转,如果是,则将home.tgz重命名为另一个添加了时间戳的文件。 它将保留8份,所以你有大约两个月的历史。

您可以使用dateformat选项自定义时间戳,请参阅logrotate(8) 。

因为您的备份作业在凌晨5点运行而logrotate在早上6:25运行,所以您应该确保您的tar备份在1小时和25分钟内运行良好(我想它反正会快得多)。

这是我使用的脚本( /home/pduck/bup.sh )的(变体):

 #!/usr/bin/env bash src_dir=/home/pduck tgt_dir=/tmp/my-backups mkdir -p $tgt_dir # current backup directory, eg "2017-04-29T13:04:50"; now=$(date +%FT%H:%M:%S) # previous backup directory prev=$(ls $tgt_dir | grep -e '^....-..-..T..:..:..$' | tail -1); if [ -z "$prev" ]; then # initial backup rsync -av --delete $src_dir $tgt_dir/$now/ else # incremental backup rsync -av --delete --link-dest=$tgt_dir/$prev/ $src_dir $tgt_dir/$now/ fi exit 0; 

它使用rsync将文件从我的主目录本地复制到备份位置,在我的情况下是/tmp/my-backups 。 在该目标目录下面创建一个具有当前时间戳的目录,例如/tmp/my-backups/2018-04-29T12:49:42并在该目录下面放置当天的备份。

当脚本再次运行时,它会注意到已经存在目录/tmp/my-backups/2018-04-29T12:49:42 (它选择与时间戳模式匹配的“最新”目录)。 然后执行rsync命令,但这次使用--link-dest=/tmp/my-backups/2018-04-29T12:49:42/ switch指向上一个备份。

这是进行增量备份的实际点:

使用--link-dest=… rsync不会复制与link-dest目录中的文件相比未更改的文件。 相反,它只是在当前文件和以前的文件之间创建链接。

当您运行此脚本10次时,您将获得具有各种时间戳的10个目录,每个目录都包含当时文件的快照。 您可以浏览目录并还原所需的文件。

管家也很容易:只需rm -rf你不想保留的时间戳目录。 这不会删除旧的或更新的或未更改的文件,只需删除(减少)硬链接。 例如,如果您有三代:

  • /tmp/my-backups/2018-04-29T...
  • /tmp/my-backups/2018-04-30T...
  • /tmp/my-backups/2018-05-01T...

并删除第二个目录,然后你只是松开当天的快照 ,但文件仍然在第一个或第三个目录(或两者)。

我在/etc/cron.daily中写了一个cronjob:

 #!/bin/sh /usr/bin/systemd-cat -t backupscript -p info /home/pduck/bup.sh 

命名文件backup或其他东西, chmod +x它,但省略 .sh后缀(它不会运行)。 由于/usr/bin/systemd-cat -t backupscript -p info您可以通过journalctl -t backupscript来查看进度。

请注意,由于硬链接,此rsync解决方案要求目标目录位于ext4文件系统上。

通过对cron命令进行一点编辑,您可以为文件名添加时间戳:

 0 5 * * 1 sudo tar -Pzcf /var/backups/home_$(date "+%Y-%m-%d_%H-%M-%S").tgz /home/ 

至于清洁,我在这里找到了一个很棒的单行脚本,我适应了你的情况:

 find . -type f -name 'home_*.tgz' -exec sh -c 'bcp="${1%_*}"; bcp="${bcp#*_}"; [ "$bcp" "<" "$(date +%F -d "60 days ago")" ] && rm "$1"' 0 {} \; 

您可以将上述命令添加到另一个cron作业,它将删除超过60天的备份。 HTH

以下是我的每日备份脚本解决方案的一部分,该脚本由cron调用: 备份Linux配置,脚本和文档到Gmail 。 完整的脚本是合适的,因为:

  • 它包括目标/home/me/*文件,但跳过1 GB的/home/文件对你使用的FireFox,Chrome和其他我不感兴趣备份的应用程序很重要。
  • 它包括重要的文件给我,但在/etc/cron*/etc/system*/lib/systemd/system-sleep/etc/system* /etc/rc.local/boot/grub/usr/share/plymouth对你不重要,/ etc / /etc/apt/trusted.gpg
  • 它每天早上通过电子邮件将备份发送到我的gmail.com帐户进行异地备份。 您的备份不仅在现场,而且在同一台机器上。

以下是相关脚本,您可能会调整的部分:

 #!/bin/sh # # NAME: daily-backup # DESC: A .tar backup file is created, emailed and removed. # DATE: Nov 25, 2017. # CALL: WSL or Ubuntu calls from /etc/cron.daily/daily-backup # PARM: No parameters but /etc/ssmtp/ssmtp.conf must be setup # NOTE: Backup file name contains machine name + Distro # Same script for user with multiple dual boot laptops # Single machine should remove $HOSTNAME from name # Single distribution should remove $Distro sleep 30 # Wait 30 seconds after boot # Running under WSL (Windows Subsystem for Ubuntu)? if cat /proc/version | grep Microsoft; then Distro="WSL" else Distro="Ubuntu" fi today=$( date +%Y-%m-%d-%A ) /mnt/e/bin/daily-backup.sh Daily-$(hostname)-$Distro-backup-$today 

我的gmail.com只有35%已满(15 GB中),所以在我必须删除文件之前,我的每日备份可以运行一段时间。 但是,不是“xxx之前的一切”哲学,而是我将使用这里概述的祖父 – 父子策略: 是否有必要保留备份记录? 。 综上所述:

  • 周一至周日(每日备份)将在14天后清除
  • 周日备份(每周备份)在8周后清除
  • 18个月后清除备份(每月备份)的最后一天
  • 每年的最后一天备份(每年备份)永远保留

由于我必须学习Python并安装Python库来管理gmail文件夹,因此我的清除过程将变得复杂。

如果您不想要世代备份并且想要清除超过2个月的文件,则此答案将有所帮助: 查找不通过bash脚本删除文件夹中的文件 。

综上所述:

 DAYS_TO_KEEP=60 find $BACKUP_DIR -maxdepth 1 -mtime +"$DAYS_TO_KEEP" -exec rm -rf {} \;