一、Restic介绍
Restic 是一款 GO 语言开发的开源免费且快速、高效和安全的跨平台备份工具。Restic 使用加密技术来保证你的数据安全性和完整性,可以将本地数据加密后传输到指定的存储。Restic 同样支持增量备份,可随时备份和恢复备份。Restic 支持大多数主流操作系统,比如:Linux、macOS、Windows 以及一些较小众的操作系统 FreeBSD 和 OpenBSD 等。
官方文档:Restic Documentation — restic 0.15.2 documentation
Restic优势
- Restic 每次备份都会生成一个快照,记录当前时间点的文件结构,可以找回特定时间点的文件。通常可以实现在不清理快照时同一个文件的版本记录。
- Restic 配置信息直接写在仓库,只要有仓库密码,在任何安装了Restic的计算机上都可以操作仓库。
- Restic 面向的是文件备份和加密,文件先加密再传输备份,而且是增量备份,即每次只备份变化的部分。
- Restic 可以备份数据到不同的类型的数据仓库如本地存储、SFTP、Minio等。
- Restic 支持多种操作系统。
- Restic 备份与恢复操作相对简单。
- Restic 可实现备份验证,因此restic使您可以轻松验证所有数据是否可以恢复。
- Restic 可实现备份数据加密,假设存储备份数据的位置不是受信任的环境(例如,系统管理员等其他人能够访问您的备份的共享空间)。
- Restic 备份时可实现重复文件的去重以达到节省备份空间的目的
二、Restic的安装
Restic的安装非常简单官方提供了一个二进制文件包进行下载,下载后解压添加执行权限即可正常使用。
下载地址:https://github.com/restic/restic/releases
#下载安装包后解压
$ bzip2 -d restic_0.13.1_linux_amd64.bz2
#添加执行权限
$ chmod +x restic_0.13.1_linux_amd64
#拷贝到PATH路径
$ mv restic_0.13.1_linux_amd64 /usr/bin/restic
#验证命令
$ restic version
restic 0.13.1 compiled with go1.18 on linux/amd64
三、Restic的使用
3.1 存储库
保存备份的位置称为存储库,存储库也可以表示存储数据的数据仓库,如果没有存储库需首先创建,存储库的类型很多,根据不同类型的存储后端创建不同类型的存储库。以下只介绍一些常见的存储库。
存储库创建命令:restic init
。
创建存储库时需要设置存储库的密码,注意如果密码丢失或者忘记将无法访问存储库中存储的数据。对于自动备份或者脚本备份的存储库可通过以下方式避免交互式。
- 设置环境变量
RESTIC_PASSWORD
$ export RESTIC_PASSWORD=123456
$ restic -r s3:http://192.168.10.254:9000/restic snapshots
- 通过选项或环境变量使用密码指定文件的路径
--password-file
,RESTIC_PASSWORD_FILE
#创建密码文件
$ cat pass
123456
#使用参数
$ restic -r s3:http://192.168.10.254:9000/restic snapshots --password-file pass
#使用变量
$ export RESTIC_PASSWORD_FILE=/root/pass
$ restic -r s3:http://192.168.10.254:9000/restic snapshots
- 配置在需要密码时通过选项或环境变量调用的程序
--password-command
,RESTIC_PASSWORD_COMMAND
#使用参数
$ restic -r s3:http://192.168.10.254:9000/restic snapshots --password-command 'echo 123456'
#使用变量
$ export RESTIC_PASSWORD_COMMAND='echo 123456'
$ restic -r s3:http://192.168.10.254:9000/restic snapshots
1.本地存储库创建
本地存储库就是在本地通过命令在文件系统初始化存储库,如果不进行特殊设置即只有本机可使用,可以通过其他文件共享的方式让多个主机使用。
#创建
$ restic init --repo /opt/backup
#验证
$ ll /opt/backup/
total 16
-r-------- 1 root root 155 Jul 17 18:40 config
drwx------ 258 root root 8192 Jul 17 18:40 data
drwx------ 2 root root 6 Jul 17 18:40 index
drwx------ 2 root root 78 Jul 17 18:40 keys
drwx------ 2 root root 6 Jul 17 18:40 locks
drwx------ 2 root root 6 Jul 17 18:40 snapshots
--repo
: 指定本地文件系统目录
2.REST存储库创建
为了通过HTTP或HTTPS协议将数据备份到远程服务器,必须首先设置远程REST服务器实例。
部署rest服务器:https://github.com/restic/rest-server
#下载安装包解压
$ tar xf rest-server_0.11.0_linux_amd64.tar.gz
#拷贝执行文件
$ mv rest-server_0.11.0_linux_amd64 /usr/local/rest-server
#生成认证文件
$ htpasswd -B -c .htpasswd zhangzhuo
$ mv htpasswd /data1/rest-server/.htpasswd
#创建数据目录
$ mkdir /data1/rest-server -p
#创建服务启动文件
$ cat /etc/systemd/system/rest-server.service
[Unit]
Description=rest-server
Wants=network-noline.target
After=network-noline.target
[Service]
WorkingDirectory=/data1/rest-server
ExecStart=/usr/local/rest-server/rest-server --path /data1/rest-server
Restart=always
[Install]
WantedBy=multi-user.target
#启动设置开机自启
$ systemctl enable --now rest-server.service
#访问测试,端口默认8000
$ curl 127.0.0.1:8000
Unauthorized
配置服务器后,可以通过更改URL方案来实现访问它,如下所示。
$ restic -r rest:http://zhangzhuo:123456@192.168.10.11:8000/ init
3.Minio存储库创建
Minio 是一个开源对象存储,用 Go 编写,与 Amazon S3 API 兼容
#配置minio的认证信息
export AWS_ACCESS_KEY_ID=minio
export AWS_SECRET_ACCESS_KEY=minio123
#创建存储库
restic -r s3:http://192.168.10.254:9000/restic init
#其他有用参数
--insecure-tls #如果是自签名证书可以选择强制跳过
4.管理存储库密钥
#查看所有密钥
restic -r s3:http://192.168.10.254:9000/restic key list
#添加密钥
restic -r s3:http://192.168.10.254:9000/restic key add
#删除密钥
restic -r s3:http://192.168.10.254:9000/restic key remove 77ac7b7e
#修改密钥密码,当前使用的那个账户即修改那个账户的密码
restic -r s3:http://192.168.10.254:9000/restic key passwd
3.2 快照使用
Restic中备份被称为快照。以下示例使用minio存储库进行示例。
1.创建快照
使用restic -r [存储库] --verbose backup [备份目录]
即可实现备份。
注意:restic多次备份依据主机名称与备份目标目录名称区别是否备份的是之前备份过的。
--verbose
:数据信息级别,可以使用更高级别的信息显示如--verbose=2
$ restic -r s3:http://192.168.10.254:9000/restic --verbose backup /etc
open repository
repository 945d24e5 opened successfully, password is correct
lock repository
load index files
no parent snapshot found, will read all files
start scan on [/etc]
start backup on [/etc]
scan finished in 0.256s: 1702 files, 26.968 MiB #总共处理了多少数据
Files: 1702 new, 0 changed, 0 unmodified
Dirs: 604 new, 0 changed, 0 unmodified
Data Blobs: 1283 new
Tree Blobs: 539 new
Added to the repo: 23.832 MiB #总共处理
processed 1702 files, 26.968 MiB in 0:00 #存储库中实际添加了多少数据,比实际处理小这意味着一些数据是重复的。
snapshot 6555e87a saved #快照的标识符,也就是名称
2.文件检测更改
当 restic 遇到已备份的文件时,无论在当前备份还是之前备份,它都会确保文件的内容仅在存储库中存储一次。因此默认它通常必须扫描每个文件的全部内容,会进行下载比较如果文件较大会产生的代价非常昂贵,因此restic还使用基于文件元数据的更改检测规则来确定文件是否可能自上次备份以来未发生更改。如果是,则不会再次扫描该文件。
仅对常规文件(而不是特殊文件、符号链接或目录)执行更改检测,这些文件的路径与同一位置的先前备份中的路径完全相同。如果文件或其包含目录之一被重命名,则会将其视为其他文件,并且将再次扫描其全部内容。
在Unix(包括 Linux 和 Mac)上,假设文件与先前备份中的文件位于同一位置,则以下文件元数据属性必须匹配才能推定其内容不变。
- 修改时间戳(mtime)。
- 元数据更改时间戳 (ctime)。
- 文件大小。
- Inode 编号(用于在文件系统中引用文件的内部编号)。
要求mtime和ctime匹配的原因是Unix程序可以自由更改mtime(有些程序可以)。在这种情况下,ctime 更改可能是文件已更改的唯一提示。
以下命令行标志修改更改检测规则
--force
:关闭更改检测并重新扫描所有文件。--ignore-ctime
:需要 mtime 才能匹配,但允许 ctime 不同。--ignore-inode
:需要 mtime 才能匹配,但允许 inode 编号和 ctime 不同。
restic -r s3:http://192.168.10.254:9000/restic --verbose backup /etc --force
3.试运行
可以在试运行模式下执行备份,以查看在不修改存储库的情况下会发生什么情况
restic -r s3:http://192.168.10.254:9000/restic backup /etc --dry-run -vv
4.筛选文件
排除文件
--exclude
指定一次或多次以排除一个或多个项目--iexclude
与路径相同但忽略路径的情况--exclude
--exclude-caches
指定一次以排除包含特殊文件的文件夹--exclude-file
指定一次或多次以排除给定文件中列出的项目--iexclude-file
与 相同,但忽略像exclude-file``--iexclude
--exclude-if-present foo
指定一次或多次以排除文件夹的内容(如果该文件夹包含名为 的文件(可选具有给定标头,不支持文件名的通配符)foo
--exclude-larger-than size
指定一次以排除大于给定大小的文件
restic -r s3:http://192.168.10.254:9000/restic backup /etc --exclude="*.c" --exclude-file=excludes.txt
包含文件
并允许您为 restic 提供一个包含要备份的文件模式或路径列表的文件。这很有用,例如,当您想要从许多不同的位置备份文件时,或者当您使用其他一些软件来生成要备份的文件列表时
$ cat 1
/etc
/opt
/tmp
$ restic -r s3:http://192.168.10.254:9000/restic backup --files-from 1
5.比较快照
Restic 有一个 diff 命令,它显示两个快照之间的差异并显示一个小的统计信息,只需传递两个快照 ID 的命令
$ restic -r s3:http://192.168.10.254:9000/restic diff 7629554a 29328031
6.备份退出状态码
运行备份命令后,Restic 返回以下退出状态代码之一,一般在备份结束后验证备份状态时使用。
- 备份成功时为 0(创建所有源文件的快照)
- 1 出现致命错误时(未创建快照)
- 3 当某些源文件无法读取时(不完整的快照,其余文件已创建)
$ restic -r s3:http://192.168.10.254:9000/restic backup /etc/
#验证
echo $?
7.列出所有快照
$ restic -r s3:http://192.168.10.254:9000/restic snapshots
8.检查完整性和一致性
最好定期使用该命令来测试您的存储库是否正常且一致,以及您宝贵的备份数据是否不受损害。可以执行两种类型的检查
- 结构一致性和完整性,例如快照、树和包文件(默认)
restic -r [存储库] check
- 备份的实际数据的完整性
restic -r [存储库] check --read-data
$ restic -r s3:http://192.168.10.254:9000/restic check
#备份实际数据完整性检查,由于必须下载存储库中的所有包文件,因此请注意,它可能会产生比平时更高的带宽成本,并且比默认文件花费更多的时间
$ restic -r s3:http://192.168.10.254:9000/restic check --read-data
9.删除快照
所有备份空间都是有限的,因此 restic 允许删除旧快照。这可以手动完成(通过指定要删除的快照 ID)或使用描述要忘记哪些快照的策略来完成。对于所有删除操作,需要依次调用两个命令:forget
删除快照,以及 prune
删除仅由已删除快照引用的剩余数据。后者可以通过选项自动运行,如果实际删除了任何快照,该--prune
选项会自动运行
单独运行删除命令
#查看快照
$ restic -r s3:http://192.168.10.72:9000/restic snapshots
repository 9a79b94a opened successfully, password is correct
ID Time Host Tags Paths
------------------------------------------------------------
95a8af65 2022-07-19 17:04:25 centos7 /etc
639a13e2 2022-07-19 17:04:40 centos7 /etc
------------------------------------------------------------
2 snapshots
#删除快照
$ restic -r s3:http://192.168.10.72:9000/restic forget 95a8af65
#快照删除后此快照中的文件引用的数据仍存储在存储库中。要清理未引用的数据,prune 必须运行命令
$ restic -r s3:http://192.168.10.72:9000/restic prune
一起运行删除并且清理
$ restic -r s3:http://192.168.10.72:9000/restic forget 639a13e2 --prune
根据策略删除快照
手动删除快照既乏味又容易出错,因此 restic 允许指定--keep-*
要保留快照的策略(一个或多个选项)。例如,您可以定义要保留多少每小时、每天、每周、每月和每年的快照,并且将删除任何其他快照。
--keep-last n
保留n
最后(最近的)快照。--keep-hourly n
对于有一个或多个快照的最后n
几个小时,每个小时只保留最近的一个。--keep-daily n
对于有一个或多个快照的最后n
几天,每天只保留最近的一个。--keep-weekly n
对于有一个或多个快照的最后n
几周,每周只保留最近的一个。--keep-monthly n
对于有一个或多个快照的最后n
几个月,每个月只保留最近的一个。--keep-yearly n
对于有一个或多个快照的最后n
几年,每年只保留最近的一个。--keep-tag
保留具有此选项指定的所有标签的所有快照(可以指定多次)。--keep-within duration
将所有具有时间戳的快照保留在最新快照的指定持续时间内,其中duration
是年数、月数、天数和小时数。例如2y5m7d3h
,将保留在最近(最近)快照之前两年、五个月、7 天和三个小时内制作的所有快照。--keep-within-hourly duration
保留在最新快照的指定持续时间内制作的所有每小时快照。的duration
指定方式与 for 相同--keep-within
,确定每小时快照的方法与 for 相同--keep-hourly
。--keep-within-daily duration
保留在最新快照的指定持续时间内制作的所有每日快照。--keep-within-weekly duration
保留在最新快照的指定持续时间内制作的所有每周快照。--keep-within-monthly duration
保留在最新快照的指定持续时间内制作的所有月度快照。--keep-within-yearly duration
保留在最新快照的指定持续时间内制作的所有年度快照
#保留同一个主机同一个备份目标的3个快照其余全部删除
$ restic -r s3:http://192.168.10.72:9000/restic forget --keep-last 3 --prune
10.快照恢复
快照恢复使用restic -r [存储库] restore [快照id] --target [恢复到哪里]
-
恢复时可以使用
dump
将整个文件夹结构的内容输出到标准输出。Restic 将以 tar(默认)或 zip 格式输出内容restic -r [存储库] dump -a zip [快照id] [快照备份路径] > [压缩包名称].zip
-
恢复过滤
--exclude
和--include
,可以只恢复单个文件restic -r [存储库] restore [快照id] --target [恢复目的路径] --include [选择恢复的文件或目录路径]
#以下为全部恢复
$ restic -r s3:http://192.168.10.72:9000/restic restore ff00e6a6 --target /tmp/1
#恢复单个文件
restic -r s3:http://192.168.10.72:9000/restic restore ff00e6a6 --target /tmp/1 --include /opt/etc/fstab
#恢复文件到压缩包
restic -r s3:http://192.168.10.72:9000/restic dump -a zip ff00e6a6 /opt/etc > restore.zip