由rsync提供的Linux系统备份
项目描述
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守护进程。
备份过程包括几个步骤
首先,使用rsync将所有(相关)文件传输到目标目录(无论是在本地系统还是远程系统)。每次创建备份时,都会更新此目标目录。
文件传输完成后,会从目标目录创建一个“快照”并存储在带有时间戳命名的目录中。这些快照是使用“cp --archive --link”创建的。
最后,根据您可自定义的轮换方案,对现有的快照进行轮换以删除旧的备份。
支持选项
选项 |
描述 |
---|---|
-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 :-)。
快照和硬链接
每次创建备份时,都会使用相同的目标目录更新自上次备份以来的新增、更新和删除内容。备份完成后,使用带有当前日期和时间编码在名称中的命令cp --archive --link创建目标目录的快照。
由于使用了硬链接,每个文件的“版本”只存储一次。因为默认情况下rsync不会就地修改文件,这会导致硬链接失效,从而避免了修改现有的inode。这确保了快照的内容在新的备份更新现有文件时不会改变。硬链接和避免就地修改的组合有效地提供了一种有限形式的去重。每个快照需要几兆字节来存储目录名称和硬链接,但文件内容不会重复。
文章使用Linux和Rsync进行简单自动快照式备份包含了更多关于此技术的细节。
快照轮换
快照可以根据灵活的轮换方案进行轮换,例如,我已经配置了我的笔记本电脑备份轮换以保留最近的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守护进程。
确保已安装rsync。
$ sudo apt-get install rsync
通过编辑/etc/default/rsync并更改行RSYNC_ENABLE=false到RSYNC_ENABLE=true来启用rsync守护进程。以下是一个实现此任务的单行命令
$ sudo sed -i 's/RSYNC_ENABLE=false/RSYNC_ENABLE=true/' /etc/default/rsync
创建配置文件/etc/rsyncd.conf并定义至少一个模块。以下是一个基于我的rsync守护进程配置的示例
# Global settings. max connections =
4log file =/var/log/rsyncd.log# Defaults for modules. read only =nouid =0gid =0# Daily backups of my VPS. [vps_backups] path =/mnt/backups/vps/latestpost-xfer exec =/usr/sbin/process-vps-backups# Hourly backups of my personal laptop. [laptop_backups] path =/mnt/backups/laptop/latestpost-xfer exec =/usr/sbin/process-laptop-backupspost-xfer exec指令配置rsync守护进程在备份完成后创建快照,并在之后旋转旧快照。
创建/etc/rsyncd.conf后,您可以启动rsync守护进程。
$ sudo service rsync start
如果您正在使用防火墙,请确保将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可在PyPI和GitHub上获取。文档托管在Read the Docs上,包括变更日志。有关错误报告,请在GitHub上创建问题。如果您有任何问题,建议等,请随时通过peter@peterodding.com给我发电子邮件。
许可
本软件遵循MIT许可证。
© 2018 Peter Odding。
项目详情
rsync-system-backup-1.1.tar.gz的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8919f2bd0e86351dfa2e942b2f9f0f3882cea35a8b79e99e79b164b308e10824 |
|
MD5 | 77a9fb6ebf82385419321f81a8acd79b |
|
BLAKE2b-256 | 765a59bb5aca0ddf4b00a1670b777fe029d8b2f7cce1836269a463bc769182f1 |
rsync_system_backup-1.1-py2.py3-none-any.whl的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 96727367725f81f5cb23c46ec0ceae113753afe243fdd80e3d3db47704339ff9 |
|
MD5 | 2a8b1a54b28839a0251f97f1249cd076 |
|
BLAKE2b-256 | 9fcac72a7c21b060efb4343c488bed8a2febd213c7bfd6caa75af90d61de7af7 |