使用 backupninja 为 Debian 定制备份计划


backupninja是Debian系统(以及基于Debian的发行版)中一个强大的、高度可配置的备份软件。在前一篇文章中,我们探讨了如何安装backupninja以及如何设置两个备份操作并执行。然而,那些只是冰山一角。这一次,我们要讨论如何定制 Handler 和 Helper ,使用这些功能定制策略以完成任何备份需要。

 

回顾 backupninja

backupninja的一个独特的地方是它可以完全抛弃/etc/backup.d中的纯文本配置文件和操作文件,软件自己会搞定。另外,我们可以编写自定义脚本(又叫 “handler”)放在/usr/share/backupninja 目录下来完成不同类型的备份操作。此外,可以通过ninjahelper的基于ncurses的交互式菜单(又叫“helper”)来指导我们创建一些配置文件,使得人工错误降到最低。

 

创建定制的Handler与Helper

这一节的目标是创建一个脚本,将home目录以gzip或bzip2压缩包的形式备份起来,不包括音乐与视频文件。我们将这个文件命名为home,将它放在/usr/backup/ninja目录下。

尽管你可以使用默认的tar handler(参考 /usr/share/backupninja/tar 与 /usr/share/backupninja/tar.helper)来达到这个效果,但是我们使用这种方法来展示如何创建实用的 handler 脚本与基于 ncurses 的 helper。你可以根据你的需求来决定如何运用这里的方法。

由于 handlers 来源于主脚本,所以无需以#!/bin/bash开始的释伴行(shebang line)。

我们编写的 handler (/usr/share/backupninja/home)如下所示。已经详细注释了。getconf 函数用来读取备份操作的配置文件。如果你指定了一个变量的值,那么它会覆盖配置文件中对应变量的值:

  1. #/home 目录 handler 脚本
  2. # 每个备份文件会通过 FQDN 来鉴别主机
  3. getconf backupname
  4. # 备份文件的保存目录
  5. getconf backupdir
  6. # 默认压缩
  7. getconf compress
  8. # 包含 /home 目录
  9. getconf includes
  10. #不包含 *.mp3 与 *.mp4 文件
  11. getconf excludes
  12. # 要打包备份文件的默认扩展名
  13. getconf EXTENSION
  14. # tar 程序的绝对路径
  15. getconf TAR `which tar`
  16. # date 程序的绝对路径
  17. getconf DATE `which date`
  18. # 日期格式
  19. DATEFORMAT="%Y-%m-%d"
  20. # 如果备份目录不存在,以致命错误退出
  21. if[!-d "$backupdir"]
  22. then
  23. mkdir -p "$backupdir"|| fatal "Can not make directory $backupdir"
  24. fi
  25. # 如果备份目录不可写,同样以致命错误退出
  26. if[!-w "$backupdir"]
  27. then
  28. fatal "Directory $backupdir is not writable"
  29. fi
  30. # 根据压缩格式选择对应的tar选项
  31. case $compress in
  32. "gzip")
  33. compress_option="-z"
  34. EXTENSION="tar.gz"
  35. ;;
  36. "bzip")
  37. compress_option="-j"
  38. EXTENSION="tar.bz2"
  39. ;;
  40. "none")
  41. compress_option=""
  42. ;;
  43. *)
  44. warning "Unknown compress filter ($tar_compress)"
  45. compress_option=""
  46. EXTENSION="tar.gz"
  47. ;;
  48. esac
  49. # 不包含一些文件类型/目录
  50. exclude_options=""
  51. for i in $excludes
  52. do
  53. exclude_options="$exclude_options --exclude $i"
  54. done
  55. # 调试信息,执行备份操作
  56. debug "Running backup: " $TAR -c -p -v $compress_option $exclude_options \
  57. -f "$backupdir/$backupname-"`$DATE "+$DATEFORMAT"`".$EXTENSION" \
  58. $includes
  59. # 将标准输出重定向到以.list为扩展的文件
  60. # 将标准错误输出重定向到以.err为扩展的文件
  61. $TAR -c -p -v $compress_option $exclude_options \
  62. -f "$backupdir/$backupname-"`$DATE "+$DATEFORMAT"`".$EXTENSION" \
  63. $includes \
  64. >"$backupdir/$backupname-"`$DATE "+$DATEFORMAT"`.list \
  65. 2>"$backupdir/$backupname-"`$DATE "+$DATEFORMAT"`.err
  66. [ $?-ne 0]&& fatal "Tar backup failed"

接下来我们将要创建helper文件(/usr/share/backupninja/home.helper)。这样,hendlers将会以菜单的形式在ninjahelper中显示:

  1. # 备份操作描述,以下划线分割单词
  2. HELPERS="$HELPERS home:backup_of_home_directories"
  3. home_wizard(){
  4. home_title="Home action wizard"
  5. backupname=`hostname --fqdn`
  6. # 指定备份操作的时间
  7. inputBox "$home_title""When to run this action?""everyday at 01"
  8. [ $?=1]&&return
  9. home_when_run="when = $REPLY"
  10. # 指定备份文件名
  11. inputBox "$home_title""\"Name\" of backups""$backupname"
  12. [ $?=1]&&return
  13. home_backupname="backupname = $REPLY"
  14. backupname="$REPLY"
  15. # 指定保存备份文件的默认路径
  16. inputBox "$home_title""Directory where to store the backups""/var/backups/home"
  17. [ $?=1]&&return
  18. home_backupdir="backupdir = $REPLY"
  19. # 指定复选框的默认值
  20. radioBox "$home_title""Compression" \
  21. "none""No compression" off \
  22. "gzip""Compress with gzip" on \
  23. "bzip""Compress with bzip" off
  24. [ $?=1]&&return;
  25. result="$REPLY"
  26. home_compress="compress = $REPLY "
  27. REPLY=
  28. while[-z "$REPLY"];do
  29. formBegin "$home_title: Includes"
  30. formItem "Include:"/home/gacanepa
  31. formDisplay
  32. [ $?=0]||return1
  33. home_includes="includes = "
  34. for i in $REPLY;do
  35. [-n "$i"]&& home_includes="$home_includes $i"
  36. done
  37. done
  38. REPLY=
  39. while[-z "$REPLY"];do
  40. formBegin "$home_title: Excludes"
  41. formItem "Exclude:"*.mp3
  42. formItem "Exclude:"*.mp4
  43. # 按需增加多个“Exclude”文本框指定其他不须包含的内容
  44. formItem "Exclude:"
  45. formItem "Exclude:"
  46. formDisplay
  47. [ $?=0]||return1
  48. home_excludes="excludes = "
  49. for i in $REPLY;do
  50. [-n "$i"]&& home_excludes="$home_excludes $i"
  51. done
  52. done
  53. # 保存配置
  54. get_next_filename $configdirectory/10.home
  55. cat > $next_filename <<EOF
  56. $home_when_run
  57. $home_backupname
  58. $home_backupdir
  59. $home_compress
  60. $home_includes
  61. $home_excludes
  62. # tar 程序的路径,必须为GNU tar
  63. TAR `which tar`
  64. DATE `which date`
  65. DATEFORMAT "%Y-%m-%d"
  66. EXTENSION tar
  67. EOF
  68. # 将配置文件的权限改为600
  69. chmod 600 $next_filename
  70. }

 

运行 ninjahelper

当创建了名为home的handler脚本以及对应的home.helper后,运行ninjahelper命令创建一个新的备份操作。

#ninjahelper

选择 create a new backup action(创建一个新的备份操作)。

接下来将看到可选的操作类型,这里选择“backup of home directories"(备份home目录):

然后会显示在helper中设置的默认值(这里只显示了3个)。可以编辑文本框中的值。注意,关于“when”变量的语法,参考文档的日程安排章节。

当完成备份操作的创建后,它会显示在ninjahelper的初始化菜单中:

按回车键显示这个备份操作的选项。因为它非常简单,所以我们可以随便对它进行一些实验。

注意,“run this action now"(立即运行)选项会不顾日程表安排的时间而立即进行备份操作:

备份操作会发生一些错误,debug会提供一些有用的信息以帮助你定位错误并纠正。例如,当备份操作有错误并且没有被纠正,那么当它运行时将会打印出如下所示的错误信息。

上面的图片告诉我们,用于完成备份操作的连接没有建立,因为它所需要链接的远程主机似乎宕机了。另外,在helper文件中指定的目标目录不存在。当纠正这些问题后,重新开始备份操作。

需要牢记的事情:

  • 当你在/usr/share/backupninja 下新建了一个自定义脚本(如foobar)来处理特殊的备份操作时,那么你还需要编写与之对应的helper(foobar.helper)文件,ninjahelper 将通过它生成名为10.foobar(下一个操作为11,以此类推)的文件,保存在/etc/backup.d目录下,而这个文件才是备份操作的真正的配置文件。
  • 可以通过ninjahelper设定好备份操作的执行时间,或按照“when”变量中设置的频率来执行。

 

总结

在这篇文章中,我们探讨了如何从头创建我们自己的备份操作,以及如何向ninjahelper添加相关的菜单以生成对应的配置文件。通过上一篇与这一篇文章,我希望我已经给出了足够好的理由让你继续研究,或者至少应该尝试一下。

本文永久更新链接地址

相关内容