跳转到主要内容

由rsync提供的Linux系统备份

项目描述

https://travis-ci.org/xolox/python-rsync-system-backup.svg?branch=master https://coveralls.io/repos/xolox/python-rsync-system-backup/badge.svg?branch=master

rsync-system-backup程序使用rsync创建Linux系统的完整系统备份。支持的备份目的地包括本地磁盘(可能使用LUKS加密)和运行SSH服务器或rsync守护进程的远程系统。每个备份产生一个带时间戳的快照,这些快照根据您配置的轮换方案进行轮换。该软件包目前已在cPython 2.7、3.4、3.5、3.6、3.7和PyPy(2.7)上进行了测试。

状态

虽然该项目汇集了使用rsync进行系统备份超过十年的经验,但所有实际的Python代码都是在2017年最初的几个月内编写的,并且在实际应用中使用的范围有限。然而,该项目确实有一个自动化测试套件,覆盖率达到90%以上,我的意图是进一步扩展测试覆盖率。

2018年5月,我将该项目的状态从alpha版更改为beta版,作为1.0版本发布的一部分。主要版本号的增加是由不兼容的代码更改触发的,然而在那个时刻,我已经使用rsync-system-backup来对我的几个Linux系统进行本地备份,已经使用了一年多的时间。此外,我的几位同事也使用了如何设置到加密USB盘的无人值守备份的指南。

安装

rsync-system-backup软件包可在PyPI上找到,这意味着安装应该非常简单。

$ pip install rsync-system-backup

实际上有无数种安装Python软件包的方法(例如,用户site-packages目录、虚拟环境或仅安装系统范围)。我无意在这里进行讨论,所以如果您感到害怕,请在返回这些说明之前了解您的选项;-)。

用法

使用rsync-system-backup软件包有两种方式:作为命令行程序rsync-system-backup和作为Python API。有关Python API的详细信息,请参阅Read the Docs上的API文档。以下是命令行界面的描述。

命令行

用法: rsync-system-backup [OPTIONS] [SOURCE] DESTINATION

使用rsync创建完整系统备份。

必需的DESTINATION参数指定了存储备份的(可能远程的)位置,其语法类似于rsync的命令行界面。可选的SOURCE参数默认为‘/’,这意味着将包括完整的根文件系统在内的备份(其他文件系统将被排除)。

请在熟悉此程序时使用--dry-run选项,并且不要移除它,直到您确信您有正确的命令行,因为以错误的方式使用此程序可能导致数据丢失(例如,意外交换SOURCE和DESTINATION参数)。

支持的位置包括

  • 本地磁盘(可能使用LUKS加密)。

  • 允许SSH连接的远程系统。

  • 运行rsync守护进程的远程系统。

  • 通过SSH隧道连接到rsync守护进程。

备份过程包括几个步骤

  1. 首先,使用rsync将所有(相关)文件传输到目标目录(无论是在本地系统还是远程系统)。每次创建备份时,都会更新此目标目录。

  2. 文件传输完成后,会从目标目录创建一个“快照”并存储在带有时间戳命名的目录中。这些快照是使用“cp --archive --link”创建的。

  3. 最后,根据您可自定义的轮换方案,对现有的快照进行轮换以删除旧的备份。

支持选项

选项

描述

-b, --backup

使用rsync创建备份,但不要创建快照,也不旋转旧的快照,除非同时提供了--snapshot和/或--rotate选项。

-s, --snapshot

创建目标目录的快照,但不要创建备份和旋转旧的快照,除非同时提供了--backup和/或--rotate选项。

此选项可用于使用“post-xfer exec”命令创建rsync守护进程模块的快照。如果未指定DESTINATION,则默认为环境变量$RSYNC_MODULE_PATH的值。

-r, --rotate

旋转旧的快照,但不要创建备份和快照,除非同时提供了--backup和/或--snapshot选项。

此选项可用于使用“post-xfer exec”命令旋转rsync守护进程模块的旧快照。如果未指定DESTINATION,则默认为环境变量$RSYNC_MODULE_PATH的值。

-m, --mount=DIRECTORY

自动挂载备份所写入的文件系统。

当指定此选项且DIRECTORY尚未挂载时,在备份开始之前使用‘mount’命令挂载备份所写入的文件系统。当在备份开始之前调用‘mount’时,在备份完成后将调用‘umount’。

需要定义挂载点的条目在/etc/fstab中才能工作。

-c, --crypto=NAME

自动解锁备份所写入的加密文件系统。

当指定此选项且设备名称NAME尚未解锁时,在备份开始之前使用cryptdisks_start命令解锁备份所写入的加密文件系统。当在备份开始之前调用cryptdisks_start时,在备份完成后将调用cryptdisks_stop。

需要定义加密文件系统的条目在/etc/crypttab中才能工作。如果加密文件系统的设备缺失,并且rsync-system-backup正在非交互模式下运行,它将优雅地退出而不会显示任何桌面通知。

如果您希望备份过程完全无人值守,您可以在/etc/crypttab中配置密钥文件,否则每次解锁加密文件系统时都会提示输入密码。

-t, --tunnel=TUNNEL_SPEC

通过SSH隧道连接到rsync守护进程。这为未加密的rsync客户端到守护进程连接提供了加密。期望TUNNEL_SPEC的值是一个SSH别名、主机名或IP地址。可选地,可以在用户名前加前缀(后跟‘@’)和/或可以在后缀中加端口号(前带‘:’)。

-i, --ionice=CLASS

使用“ionice”程序设置用于删除备份的“rm”调用的I/O调度类和优先级。期望CLASS是以下值之一:“idle”,“best-effort”或“realtime”。有关这些值的详细信息,请参阅“ionice”程序的man页。

-u, --no-sudo

默认情况下,备份和快照的创建使用超级用户权限执行,以确保所有文件可读,并且文件系统元数据得到保留。使用-u--no-sudo选项将禁用在这些操作中使用‘sudo’。

-n--dry-run

不进行任何更改,仅报告将要执行的操作。这不会创建备份或快照,但会以--dry-run选项运行rsync。

--multi-fs

允许rsync跨越文件系统边界。此选项与rsync选项--one-file-system相反,因为rsync-system-backup默认使用带有--one-file-system的rsync运行,必须使用--multi-fs来指示不使用。

-x--exclude=PATTERN

有选择地排除某些文件不被包含在备份中。请参考rsync文档了解允许的PATTERN语法。请注意,rsync-system-backup始终使用‘rsync --one-file-system’选项。

-f--force

默认情况下,rsync-system-backup拒绝在非Linux系统上运行,因为它专门为Linux设计。使用-f--force选项绕过此合理性检查。请注意,如果出现问题,您将自行承担后果!

--disable-notifications

默认情况下,系统备份开始前和完成后会显示桌面通知(使用notify-send)。使用此选项将禁用通知(notify-send根本不会被调用)。

-v--verbose

增加噪音(增加日志详细程度)。可重复使用。

-q--quiet

减少噪音(减少日志详细程度)。可重复使用。

-h--help

显示此消息并退出。

如何工作

多年来,我一直在微调Linux系统备份的方法,在这段时间里,rsync已经成为我首选的多功能工具 :-)。我也相信,全面的文档可以是一个开源项目价值的一半。以下部分试图提供我对系统备份策略的高级概述

(缺乏)备份格式

每个备份都是文件系统树的完整副本,以目标上单独的文件和目录的形式存储。这种“备份格式”使得在备份中导航和恢复变得非常容易,因为您可以使用任何您舒适的方法,无论是文件浏览器、终端、Python脚本,甚至是chroot :-)。

快照轮换

快照可以根据灵活的轮换方案进行轮换,例如,我已经配置了我的笔记本电脑备份轮换以保留最近的24小时备份、30天备份和无限期的月度备份。

备份目的地

在开发和维护用于各种Linux笔记本电脑和服务器的备份脚本时,我了解到不同系统需要不同的备份位置和连接方法。

加密USB磁盘

在我的工作桌上有一个LUKS加密USB硬盘,我用它来保存我工作笔记本电脑的小时、日和月度备份。硬盘通过连接键盘和鼠标的相同USB集线器连接,所以我几乎不会忘记它 :-).

自动挂载

在备份开始之前,加密硬盘会自动解锁并挂载。使用密钥文件可以使此过程在后台无人值守地运行。一旦备份完成,硬盘将再次卸载并锁定,以便可以在任何时候拔掉(当然,只要备份没有运行)。

本地服务器(rsync守护进程)

我的个人笔记本电脑通过直接TCP连接,不使用SSH将小时备份传输到在我家用网络中运行的rsync守护进程。大多数时候笔记本电脑连接了一个USB以太网适配器,但备份也可以通过无线连接正常运行。

远程服务器(通过SSH隧道rsync守护进程)

我的VPS(虚拟专用服务器)通过SSH隧道将夜间备份传输到在我家用网络中运行的rsync守护进程,以加密流量并限制访问。SSH账户被配置为允许隧道传输,但不允许执行命令。这种设置允许rsync客户端和服务器以root权限运行,而不允许客户端在服务器上运行任意命令。

其他连接方法

将备份到本地磁盘限制了备份的有效性,但使用系统间的SSH访问给您带来的不仅仅是预期的,因为您允许了任意命令执行。rsync守护进程提供了一个不允许任意命令执行的替代方案。以下部分将更详细地讨论此选项。

使用rsync守护进程

要能够以root身份写入文件并保留所有文件系统元数据,rsync必须以root权限运行。然而,我的大多数备份都存储在远程系统上,仅为了传输备份就打开SSH远程root访问似乎是一个非常直接解决问题的方法 :-).

幸运的是,还有一个解决方案可用:在目标服务器上配置一个rsync守护进程,并指示您的rsync客户端连接到rsync守护进程而不是通过SSH连接到远程系统。rsync守护进程的配置可以限制rsync客户端的访问,使其只能写入包含备份树的目录。

在此配置中,不使用SSH连接,rsync客户端和服务器之间的流量没有加密。如果您对此有问题,请继续阅读下一节。

启用rsync守护进程

在Debian及其衍生产品(如Ubuntu)上,您可以通过以下方式轻松启用和配置rsync守护进程

  1. 确保已安装rsync。

    $ sudo apt-get install rsync
  2. 通过编辑/etc/default/rsync并更改行RSYNC_ENABLE=falseRSYNC_ENABLE=true来启用rsync守护进程。以下是一个实现此任务的单行命令

    $ sudo sed -i 's/RSYNC_ENABLE=false/RSYNC_ENABLE=true/' /etc/default/rsync
  3. 创建配置文件/etc/rsyncd.conf并定义至少一个模块。以下是一个基于我的rsync守护进程配置的示例

    # Global settings.
    max connections = 4
    log file = /var/log/rsyncd.log
    
    # Defaults for modules.
    read only = no
    uid = 0
    gid = 0
    
    # Daily backups of my VPS.
    [vps_backups]
    path = /mnt/backups/vps/latest
    post-xfer exec = /usr/sbin/process-vps-backups
    
    # Hourly backups of my personal laptop.
    [laptop_backups]
    path = /mnt/backups/laptop/latest
    post-xfer exec = /usr/sbin/process-laptop-backups

    post-xfer exec指令配置rsync守护进程在备份完成后创建快照,并在之后旋转旧快照。

  4. 创建/etc/rsyncd.conf后,您可以启动rsync守护进程。

    $ sudo service rsync start
  5. 如果您正在使用防火墙,请确保将rsync守护进程端口列入白名单以允许传入连接。rsync守护进程端口默认为873。以下是一个使用iptables完成此任务的命令

    $ sudo iptables -A INPUT -p tcp -m tcp --dport 873 -m comment --comment "rsync daemon" -j ACCEPT

隧道rsync守护进程连接

当您的备份通过公共互联网传输时,您绝对应该使用SSH加密流量,但如果您对安全性有顾虑,那么您可能不会喜欢为了传输备份而打开通过SSH的远程root访问 :-).

另一种选择是使用非特权SSH账户来设置一个SSH隧道,将网络流量重定向到rsync守护进程。SSH账户的登录shell可以设置为/usr/sbin/nologin(或类似如/bin/false)以禁用命令执行,在这种情况下,您需要将-N传递给SSH客户端。

联系方式

最新版本的rsync-system-backup可在PyPIGitHub上获取。文档托管在Read the Docs上,包括变更日志。有关错误报告,请在GitHub上创建问题。如果您有任何问题,建议等,请随时通过peter@peterodding.com给我发电子邮件。

许可

本软件遵循MIT许可证

© 2018 Peter Odding。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪一个,请了解有关安装包的更多信息。

源分发

rsync-system-backup-1.1.tar.gz (34.7 kB 查看散列)

上传时间: 源代码

构建分发

rsync_system_backup-1.1-py2.py3-none-any.whl (29.3 kB 查看哈希)

上传时间: Python 2 Python 3

由以下支持