使用restic+rclone实现增量备份linux到云端

目录

[TOC]


一、安装

1.1 安装restic

apt install restic

如果*包安装管理器*没有找到可安装的restic的话

可以从restic发布页面下载restic的最新稳定发布版本。

找到对应架构并下载 .bz2后缀的文件后

解压并授予可执行权限:bunzip2 restic\*.bz2 && chmod +x restic\*

移动 mv restic\* /usr/bin/restic

使用 restic version查看是否正确输出版本号


1.2 查看版本号

restic version
旧版会少很多功能,比如我这里第一次安装的就是 restic 0.11.0,都不支持参数 --keep-within-\*,后面升级到 restic 0.15.2才好的

1.3 升级restic为最新版

可以从restic发布页面下载restic的最新稳定发布版本。

或者直接运行:

restic self-update

1.4 安装rclone

sudo -v ; curl https://rclone.org/install.sh | sudo bash

1.5 rclone配置文件

使用 rclone config file查看配置文件位置(一般默认是 /root/.config/rclone/rclone.conf),并把修改好的配置文件粘贴进去。

如果以前没有使用过rclone的话,使用 rclone config添加 n) New remote,会自动生成。

[restic-backup]

type = drive

client\_id = xxxxxxxx-xxxxxxxx.apps.googleusercontent.com

client\_secret = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

scope = drive

token = {"access\_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","token\_type":"xxxxxxxx","refresh\_token":"xxxxxxxxxxxxxxxxxxxxxxxx","expiry":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}

team\_drive = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

root\_folder\_id = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

二、使用

2.1 初始化

restic init \

-o rclone.args="serve restic --stdio --bwlimit 512M --b2-hard-delete -v --tpslimit=1" \

--password-command="echo <PASSWORD>" \

-r rclone:restic-backup:/<PATH>

2.1.1 参数说明

  • --stdio不要动!
  • --bwlimit 512M表示限制上传速度最大为 512 MiByte/s
  • --b2-hard-delete不要动!
  • 将其中的 -v改为 --verbose=2--verbose --verbose或者 -vv可以获得更详细的输出。
  • 以前用的 --tpslimit=10经常403报错,现在保险起见,直接设置成 --tpslimit=1好了,虽然会慢点,但是安全。
  • <PASSWORD>为自己的密码,比如改为 --password-command="echo 1234" \
  • <PATH>team\_drive下以 root\_folder\_id为根目录的路径,不存在的话,初始化程序会自动创建。

2.2 备份前的模拟执行(备份时不进行实际上传 --dry-run

  • 这些 --exclude排除的文件是我本地测试出来报错的都给他排除了,具体情况自己 --dry-run多测试一下。
  • restic backup /中的 /表示备份的是根目录,可以自己修改。

linux:

restic backup / \

--dry-run \

-o rclone.args="serve restic --stdio --bwlimit 512M --b2-hard-delete -v --tpslimit=2" \

--password-command="echo <PASSWORD>" \

-r rclone:restic-backup:/linux \

--exclude /dev \

--exclude /tmp \

--exclude /mnt \

--exclude /media \

--exclude /proc \

--exclude /run \

--exclude /snap \

--exclude /sys \

--exclude "/var/lib/docker/overlay\*" \

--exclude-caches

macOS:

restic backup "/" \

--dry-run \

-o rclone.args="serve restic --stdio --bwlimit 512M --b2-hard-delete -vv --tpslimit=2" \

--password-command="echo <PASSWORD>" \

-r rclone:restic-backup:/macOS \

--exclude "/Library/Caches" \

--exclude "/dev" \

--exclude "Docker.raw" \

--exclude "/System" \

--exclude "/Users/\$USER/Library/CloudStorage" \

--exclude "/private/var" \

--exclude "/.file" \

--exclude "/Applications/Python\*" \

--exclude "/Library/Application Support/Apple" \

--exclude "/Library/Application Support/ApplePushService" \

--exclude "/Library/Bluetooth/Library/Preferences/com.apple.MobileBluetooth.devices.plist" \

--exclude "/Library/OSAnalytics/Preferences/Library/Preferences/com.apple.OTACrashCopier.plist" \

--exclude "/Library/Preferences/LemonDaemon\_packet.dat" \

--exclude "/Library/Preferences/OpenDirectory/opendirectoryd.plist" \

--exclude "/Library/Preferences/SystemConfiguration/com.apple.vmnet.plist" \

--exclude "/Library/Preferences/com.apple.VNCSettings.txt" \

--exclude "/Library/Preferences/com.apple.apsd.plist" \

--exclude "/Library/Preferences/com.apple.wifi.known-networks.plist" \

--exclude "/Users/Shared/Previously Relocated Items\*" \

--exclude "/Users/\$USER/.viminfo" \

--exclude "/Users/\$USER/Library/Application Support/FileProvider" \

--exclude "/Users/\$USER/Library/Containers/\*/Data/Documents/msc" \

--exclude "/Users/\$USER/Library/Google/GoogleSoftwareUpdate/Stats/Keystone.stats" \

--exclude "/Users/\$USER/Library/Group Containers/group.com.apple.secure-control-center-preferences/Library/Preferences/group.com.apple.secure-control-center-preferences.av.plist" \

--exclude "/private/etc/aliases.db" \

--exclude "/private/etc/cups/certs" \

--exclude "/private/etc/cups/printers.conf" \

--exclude "/private/etc/cups/printers.conf.pre-update" \

--exclude "/private/etc/krb5.keytab" \

--exclude "/private/etc/master.passwd" \

--exclude "/private/etc/openldap/DB\_CONFIG.example" \

--exclude "/private/etc/openldap/slapd.conf.default" \

--exclude "/private/etc/racoon/psk.txt" \

--exclude "/private/etc/security/audit\_control" \

--exclude "/private/etc/security/audit\_user" \

--exclude "/private/etc/sudo\_lecture" \

--exclude "/private/etc/sudoers" \

--exclude "/usr/bin/sudo" \

--exclude "/usr/libexec/cups/backend/dnssd" \

--exclude "/usr/libexec/cups/backend/ipp" \

--exclude "/usr/libexec/cups/backend/lpd" \

--exclude "/usr/libexec/cups/backend/smb" \

--exclude "/usr/libexec/firmwarecheckers/eficheck/eficheck" \

--exclude "/usr/libexec/firmwarecheckers/eficheck/eficheck-standalone" \

--exclude "/usr/libexec/firmwarecheckers/ethcheck/ethcheck" \

--exclude "/usr/libexec/security\_authtrampoline" \

--exclude "/usr/local/bin/rclone" \

--exclude "/usr/local/mysql\*" \

--exclude "/usr/sbin/authserver" \

--exclude "/usr/sbin/cupsd" \

--exclude "/usr/sbin/visudo" \

--exclude-caches

2.3 正式备份

linux:

restic backup / \

-o rclone.args="serve restic --stdio --bwlimit 512M --b2-hard-delete -v --tpslimit=2" \

--password-command="echo <PASSWORD>" \

-r rclone:restic-backup:/linux \

--exclude /dev \

--exclude /tmp \

--exclude /mnt \

--exclude /media \

--exclude /proc \

--exclude /run \

--exclude /snap \

--exclude /sys \

--exclude "/var/lib/docker/overlay\*" \

--exclude-caches

macOS:

restic backup "/" \

-o rclone.args="serve restic --stdio --bwlimit 512M --b2-hard-delete -vv --tpslimit=2" \

--password-command="echo <PASSWORD>" \

-r rclone:restic-backup:/macOS \

--exclude "/Library/Caches" \

--exclude "/dev" \

--exclude "Docker.raw" \

--exclude "/System" \

--exclude "/Users/\$USER/Library/CloudStorage" \

--exclude "/private/var" \

--exclude "/.file" \

--exclude "/Applications/Python\*" \

--exclude "/Library/Application Support/Apple" \

--exclude "/Library/Application Support/ApplePushService" \

--exclude "/Library/Bluetooth/Library/Preferences/com.apple.MobileBluetooth.devices.plist" \

--exclude "/Library/OSAnalytics/Preferences/Library/Preferences/com.apple.OTACrashCopier.plist" \

--exclude "/Library/Preferences/LemonDaemon\_packet.dat" \

--exclude "/Library/Preferences/OpenDirectory/opendirectoryd.plist" \

--exclude "/Library/Preferences/SystemConfiguration/com.apple.vmnet.plist" \

--exclude "/Library/Preferences/com.apple.VNCSettings.txt" \

--exclude "/Library/Preferences/com.apple.apsd.plist" \

--exclude "/Library/Preferences/com.apple.wifi.known-networks.plist" \

--exclude "/Users/Shared/Previously Relocated Items\*" \

--exclude "/Users/\$USER/.viminfo" \

--exclude "/Users/\$USER/Library/Application Support/FileProvider" \

--exclude "/Users/\$USER/Library/Containers/244D137C-E606-4CDB-8CD3-702E6B711603/Data/Documents/msc/4a50d4a5a8e1a9c345a30ba038a78c1e" \

--exclude "/Users/\$USER/Library/Google/GoogleSoftwareUpdate/Stats/Keystone.stats" \

--exclude "/Users/\$USER/Library/Group Containers/group.com.apple.secure-control-center-preferences/Library/Preferences/group.com.apple.secure-control-center-preferences.av.plist" \

--exclude "/private/etc/aliases.db" \

--exclude "/private/etc/cups/certs" \

--exclude "/private/etc/cups/printers.conf" \

--exclude "/private/etc/cups/printers.conf.pre-update" \

--exclude "/private/etc/krb5.keytab" \

--exclude "/private/etc/master.passwd" \

--exclude "/private/etc/openldap/DB\_CONFIG.example" \

--exclude "/private/etc/openldap/slapd.conf.default" \

--exclude "/private/etc/racoon/psk.txt" \

--exclude "/private/etc/security/audit\_control" \

--exclude "/private/etc/security/audit\_user" \

--exclude "/private/etc/sudo\_lecture" \

--exclude "/private/etc/sudoers" \

--exclude "/usr/bin/sudo" \

--exclude "/usr/libexec/cups/backend/dnssd" \

--exclude "/usr/libexec/cups/backend/ipp" \

--exclude "/usr/libexec/cups/backend/lpd" \

--exclude "/usr/libexec/cups/backend/smb" \

--exclude "/usr/libexec/firmwarecheckers/eficheck/eficheck" \

--exclude "/usr/libexec/firmwarecheckers/eficheck/eficheck-standalone" \

--exclude "/usr/libexec/firmwarecheckers/ethcheck/ethcheck" \

--exclude "/usr/libexec/security\_authtrampoline" \

--exclude "/usr/local/bin/rclone" \

--exclude "/usr/local/mysql\*" \

--exclude "/usr/sbin/authserver" \

--exclude "/usr/sbin/cupsd" \

--exclude "/usr/sbin/visudo" \

--exclude-caches

2.4 排除文件

可以通过指定排除模式来排除文件夹和文件,当前的排除选项有:

  • --exclude 可以多次指定以排除一个或多个项目
  • --iexclude--exclude 相同,但忽略路径的大小写
  • --exclude-caches 只需指定一次,如果文件夹包含特殊的CACHEDIR.TAG文件,则排除其内容,但保留 CACHEDIR.TAG
  • --exclude-file 可以多次指定以排除给定文件中列出的项目
  • --iexclude-fileexclude-file 相同,但忽略大小写,类似于 --iexclude
  • --exclude-if-present foo 可以多次指定,如果文件夹包含名为 foo 的文件(可选择具有给定标题,文件名不支持通配符),则排除其内容
  • --exclude-larger-than size 只需指定一次,排除大于给定大小的文件

请参阅 restic help backup 获取有关每个排除选项的更详细信息。

假设我们有一个名为 excludes.txt 的文件,其中包含以下内容:

# 排除go文件

\*.go

# 排除foo/x/y/z/bar foo/x/bar foo/bar

foo/\*\*/bar

可以这样使用:

\$ restic -r /srv/restic-repo backup \~/work --exclude="\*.c" --exclude-file=excludes.txt

这将指示 restic 排除符合以下条件的文件:

  • 所有匹配 \*.c 的文件(参数 --exclude
  • 所有匹配 \*.go 的文件(excludes.txt 中的第二行)
  • 所有名为 bar 的文件和子目录,这些文件和子目录位于名为 foo 的目录下方(excludes.txt 中的第四行)

模式使用 Go 函数 filepath.Match 的语法,并针对要保存的文件/目录的完整路径进行测试,即使 restic 被传递相对路径进行保存。空行和以 # 开头的行会被忽略。

在排除文件中,环境变量会通过 os.ExpandEnv 进行扩展,因此 /home/\$USER/foo 会扩展为用户 bob/home/bob/foo。要获取一个字面上的美元符号,请将 \$\$ 写入文件中 - 即使在单个 \$ 后面没有匹配的环境变量的单词,也必须这样做。请注意,波浪号 (\~) 不会展开,而是使用 \$HOME 或等效的环境变量(取决于你的操作系统)。

模式需要匹配完整的路径组件。例如,模式 foo

  • 匹配 /dir1/foo/dir2/file/dir/foo
  • 不匹配 /dir/foobarbarfoo

末尾的 / 会被忽略,开头的 / 将模式锚定在根目录。这意味着,/bin 匹配 /bin/bash,但不匹配 /usr/bin/restic

常规通配符不能用于匹配目录分隔符 /,例如,b\*ash 匹配 /bin/bash,但不匹配 /bin/ash。为此,可以使用特殊的通配符 \*\* 来匹配任意子目录:模式 foo/\*\*/bar 匹配:

  • /dir1/foo/dir2/bar/file
  • /foo/bar/file
  • /tmp/foo/bar

在排除文件中列出的模式中的空格可以直接指定。也就是说,为了排除名为 foo bar star.txt 的文件,将其直接放在排除文件的一行中。请注意,开头和末尾的空格会被修剪 - 要匹配这些空格,请在文件名的开头或结尾使用 \*

在其他排除选项中列出的模式(例如命令行上的 --exclude)的空格的指定方式因操作系统和/或 shell 的不同而不同。Restic 本身不需要任何转义,但是你的 shell 可能需要一些转义,以便将名称/模式作为单个参数传递给 restic。

在大多数类 Unix shell 上,你可以使用引号或反斜杠。例如:

  • --exclude='foo bar star/foo.txt'
  • --exclude="foo bar star/foo.txt"
  • --exclude=foo\ bar\ star/foo.txt

如果模式以感叹号开始并与先前由常规模式匹配的文件匹配,那么匹配将被取消。它的工作方式类似于 gitignore,具有相同的限制:一旦排除了一个目录,就无法包含该目录内的文件。这是一个完整的示例,用于备份主目录中的一些目录。它通过首先排除任何目录,然后选择性地添加回一些目录来实现。

\$HOME/\*

!\$HOME/Documents

!\$HOME/code

!\$HOME/.emacs.d

!\$HOME/games

# [...]

node\_modules

\*\~

\*.o

\*.lo

\*.pyc

通过指定选项 --one-file-system,你可以指示 restic 仅备份最初指定的文件或目录所在的文件系统中的文件。换句话说,它将阻止 restic 跨越文件系统边界和子卷进行备份。

例如,如果你使用此选项备份 /,并且在 /media/usb 下挂载了外部介质,则 restic 将不会备份 /media/usb,因为它是与 / 不同的文件系统。虚拟文件系统如 /proc 也被视为不同的文件系统,在使用 --one-file-system 时被排除:

\$ restic -r /srv/restic-repo backup --one-file-system /

请注意,这不会阻止你在命令行上指定多个文件系统,例如:

\$ restic -r /srv/restic-repo backup --one-file-system / /media/usb

将备份 //media/usb 文件系统,但不包括其他文件系统,如 /sys/proc

注意

--one-file-system 在 Windows 上当前不受支持,并且将导致备份立即失败并显示错误。

可以使用 --exclude-larger-than 选项来排除大于给定大小的文件:

\$ restic -r /srv/restic-repo backup \~/work --exclude-larger-than 1M

这将从备份中排除 \~/work 中大小大于1 MiB的文件。

大小值的默认单位是字节,因此例如 --exclude-larger-than 2048 将排除大于2048字节(2 KiB)的文件。要指定其他单位,请在大小值后面加上以下之一的后缀:k/K 表示 KiB(1024字节),m/M 表示 MiB(1024^2字节),g/G 表示 GiB(1024^3字节)和 t/T 表示 TiB(1024^4字节),例如 1k10K20m20M30g30G2t2T


2.5 包括文件

--files-from--files-from-verbatim--files-from-raw 选项允许你提供一个包含要备份的文件模式或路径列表的文件给 restic 使用。当你想要从许多不同位置备份文件,或者使用其他软件生成要备份文件列表时,这将非常有用。

传递给 --files-from 的参数必须是一个文本文件的名称,该文件每行包含一个*模式*。文件必须使用 UTF-8 或带有字节顺序标记的 UTF-16 进行编码。模式中的前导和尾随空格将被删除。忽略空行和以 # 开头的行,每个模式在读取时都会被扩展,其中的特殊字符会使用 Go 函数 filepath.Glob 进行扩展 - 请参阅其文档了解模式中可使用的语法。

传递给 --files-from-verbatim 的参数必须是一个文本文件的名称,该文件每行包含一个*路径*,例如由 GNU find 使用 -print 标志生成的路径列表。与 --files-from 不同,--files-from-verbatim 不会扩展路径列表中的任何特殊字符,不会去掉任何空格,并且不会忽略以 # 开头的行。此选项只是按原样读取和使用每行内容,尽管空行仍将被忽略。当你想要备份包含特殊字符的文件名列表,而不希望这些特殊字符被扩展时,请使用此选项。

--files-from-raw 选项是 --files-from-verbatim 的一个变体,它要求文件中的每一行以 ASCII NUL 字符(\0 零字节)而不是换行符终止,以便它可以处理包含换行符的文件路径或未使用 UTF-8 编码的文件名(但在 Windows 上,列出的文件名仍然必须以 UTF-8 编码)。当从脚本(例如带有 -print0 标志的 GNU find)生成文件名列表时,此选项是最安全的选择。

这三个选项中,参数 - 被解释为标准输入,将从标准输入中读取文件/模式列表,而不是从文本文件中读取。

在所有情况下,路径可以是绝对路径,也可以是相对于 restic backup 的工作目录。

例如,你可能希望备份文件名与特定正则表达式模式匹配的文件(使用 GNU find):

\$ find /tmp/some\_folder -regex PATTERN -print0 > /tmp/files\_to\_backup

然后,你可以使用 restic 来备份过滤后的文件:

\$ restic -r /srv/restic-repo backup --files-from-raw /tmp/files\_to\_backup

你可以将这三个选项与彼此和普通文件参数结合使用:

\$ restic backup --files-from /tmp/files\_to\_backup /tmp/some\_additional\_file

\$ restic backup --files-from /tmp/glob-pattern --files-from-raw /tmp/generated-list /tmp/some\_additional\_file

2.6 检查

restic check --no-lock \

-o rclone.args="serve restic --stdio --bwlimit 512M --b2-hard-delete -v --tpslimit=1" \

--password-command="echo <PASSWORD>" \

-r rclone:restic-backup:/<PATH>
最好加一个 --no-lock不然会有很多报错

2.7 解锁

restic unlock \

-o rclone.args="serve restic --stdio --bwlimit 512M --b2-hard-delete -v --tpslimit=1" \

--password-command="echo <PASSWORD>" \

-r rclone:restic-backup:/<PATH>

2.8 查看所有快照

restic snapshots \

-o rclone.args="serve restic --stdio --bwlimit 512M --b2-hard-delete -v --tpslimit=1" \

--password-command="echo <PASSWORD>" \

-r rclone:restic-backup:/<PATH>

2.9 查看储存库的统计信息(已备份的*文件大小*、*文件数*)

restic stats \

-o rclone.args="serve restic --stdio --bwlimit 512M --b2-hard-delete -v --tpslimit=1" \

--password-command="echo <PASSWORD>" \

-r rclone:restic-backup:/<PATH>

2.10 查看某次备份的文件列表

通过 查看所有快照可以看到每一次备份的十六进制的字符串,使用 ls 字符串即可查看某次备份的文件列表

其中的 latest代表最新的镜像,也可以将其改为快照的id。

restic ls latest \

-o rclone.args="serve restic --stdio --bwlimit 512M --b2-hard-delete -v --tpslimit=1" \

--password-command="echo <PASSWORD>" \

-r rclone:restic-backup:/<PATH>

也可以指定某个目录 /<PATH1>

restic ls latest /<PATH1> \

-o rclone.args="serve restic --stdio --bwlimit 512M --b2-hard-delete -v --tpslimit=1" \

--password-command="echo <PASSWORD>" \

-r rclone:weiland-backup:/<PATH>

2.11 挂载恢复文件到目录(大量文件不推荐,超慢)

restic mount /home/restore \

-o rclone.args="serve restic --stdio --bwlimit 512M --b2-hard-delete -v --tpslimit=1" \

--password-command="echo <PASSWORD>" \

-r rclone:restic-backup:/<PATH>

执行以后,假设没有报错的话,不要退出这个终端,重新开一个新的终端窗口,再进入 /home/restore就能看见如下目录:

dr-xr-xr-x  1 root  root     0B  6  2 20:56 .

drwxr-xr-x  8 root  root   256B  6  2 20:55 ..

dr-xr-xr-x  1 root  root     0B  6  2 20:56 hosts

dr-xr-xr-x  1 root  root     0B  6  2 20:56 ids

dr-xr-xr-x  1 root  root     0B  6  2 20:56 snapshots

dr-xr-xr-x  1 root  root     0B  6  2 20:56 tags

自己进去查看/回恢复文件就是了,但是这样超慢(我试过,恢复了8个小时,下载用了1T的流量,但是本地只恢复了30多G的文件),推荐使用 2.12 直接恢复文件的方法,挂载更适合查看文件。

完成以后,退出文件夹 /home/restore,然后回到最初执行 restic mount的那个终端,按下 Ctrl+C即可取消挂载,此时再进入 /home/restore里面就是空的了。


2.12 直接恢复文件

恢复仓库 rclone:restic-backup:/<PATH>中,路径为 /<PATH1>的 文件/文件夹 到本地的路径 /<PATH2>下,恢复为 /<PATH2>/<PATH1>

看不懂的话自己试一下就知道了

restic restore latest \

-o rclone.args="serve restic --stdio --bwlimit 512M --b2-hard-delete -v --tpslimit=10" \

--password-command="echo <PASSWORD>" \

-r rclone:restic-backup:/<PATH> \

--target /<PATH2> \

--include /<PATH1>

如果不是rclone,而是用其他软件已经挂载到了本地的话:

restic restore latest:/home/myProject \

--target /home/myProject \

-r /mnt/resticBackup/ubuntu \

--password-command="echo 12345" \

--verbose
将最新备份latest中的路径为 /home/myProject目录恢复到当前主机的目录 /home/myProject中,仓库路径为 /mnt/resticBackup/ubuntu,仓库密码为 12345,输出详细日志

执行结果:

# root @ ubuntu in /home/temp [10:29:22]

\$ restic restore latest:/home/myProject \

--target /home/myProject \

-r /mnt/resticBackup/ubuntu \

--password-command="echo 12345" \

--verbose

repository 17897fc8 opened (version 2, compression level auto)

[0:08] 100.00%  314 / 314 index files loaded

restoring <Snapshot a4892d2e of [/] at 2024-04-27 17:24:33.286439601 +0800 CST by root@ubuntu> to /home/myProject

[8:36] 7.76%  127404 files/dirs 13.249 GiB, total 3109440 files/dirs 170.714 GiB

2.13 自动删除快照

先运行 --dry-run模拟一下看会删除什么

参数的功能是:保留最近 7 天内的所有**日**备份、最近 1 个月内的所有**周**备份、最近 1 年内的所有**月**备份和最近 100 年内的所有**年**备份

restic forget --dry-run \

--keep-within-daily 7d \

--keep-within-weekly 1m \

      --keep-within-monthly 1y \

      --keep-within-yearly 100y \

      --prune \

      -o rclone.args="serve restic --stdio --bwlimit 512M --b2-hard-delete -v --tpslimit=1" \

      --password-command="echo <PASSWORD>" \

      -r rclone:restic-backup:/<PATH>

**确定无误以后再把 --dry-run \删除运行一次**


三、完全自动化 备份/删除

3.1 借助crontab实现自动化

3.1.1 把上面的*备份*和*自动删除*综合在一起就可以达到完全自动化,以下是流程:

递归创建目录

mkdir -p /home/scripts/log

创建并赋予可执行权限:

touch /home/scripts/sysBackup.sh && chmod +x /home/scripts/sysBackup.sh

将如下文档保存为 /home/scripts/sysBackup.sh

vim /home/scripts/sysBackup.sh
#!/bin/bash

restic backup / \

-o rclone.args="serve restic --stdio --bwlimit 512M --b2-hard-delete -v --tpslimit=1" \

--password-command="echo <PASSWORD>" \

-r rclone:restic-backup:/<PATH> \

--exclude /dev \

--exclude /tmp \

--exclude /mnt \

--exclude /media \

--exclude /proc \

--exclude /run \

--exclude /snap \

--exclude /sys \

--exclude "/var/lib/docker/overlay\*" \

--exclude-caches

&& \

restic forget --keep-within-daily 7d \

--keep-within-weekly 1m \

--keep-within-monthly 1y \

      --keep-within-yearly 100y \

      --prune \

      -o rclone.args="serve restic --stdio --bwlimit 512M --b2-hard-delete -v --tpslimit=1" \

      --password-command="echo <PASSWORD>" \

      -r rclone:restic-backup:/<PATH>

先模拟运行一下 sudo bash /home/scripts/sysBackup.sh看看输出是否正常(如果怀疑时间太长的话就直接跳过模拟运行吧),没问题的话继续下面的步骤。

目前我用的

!/bin/bash

添加空行

echo "" >> /home/scripts/log/restic-backup.log

添加分隔线

echo "--------------------------------------------------------------------------------------------------------------" >> /home/scripts/log/restic-backup.log

echo "开始备份..." >> /home/scripts/log/restic-backup.log

添加当前时间

date >> /home/scripts/log/restic-backup.log

restic unlock -r /home/mount/resticBackup/Ubuntu \

--password-command="echo 12345" \

--verbose \

&& \

restic forget --keep-within-daily 60d \

--keep-within-weekly 10y \
--prune \
--password-command="echo 12345" \
--verbose \
-r /home/mount/resticBackup/Ubuntu \

&& \

restic backup / \

-r /home/mount/resticBackup/Ubuntu \

--password-command="echo 12345" \

--verbose \

--exclude /dev \

--exclude /tmp \

--exclude /mnt \

--exclude /media \

--exclude /proc \

--exclude /run \

--exclude /snap \

--exclude /sys \

--exclude /swap.img \

--exclude "/var/lib/docker/overlay*" \

--exclude /home/mount \

--exclude /home/mnt \

--exclude-caches

date >> /home/scripts/log/restic-backup.log

echo "备份完成!!!" >> /home/scripts/log/restic-backup.log

echo "--------------------------------------------------------------------------------------------------------------" >> /home/scripts/log/restic-backup.log

终端中执行

crontab -e

最后一行粘贴:

# 每天凌晨3点自动备份与删除

0 3 \* \* \* sudo bash /home/scripts/sysBackup.sh > /home/scripts/log/restic-backup.log 2>&1

注意只会保留最近一次的日志,如果想永久保留,可以把

> /home/scripts/log/restic-backup.log 2>&1

改为

>> /home/scripts/log/restic-backup.log 2>&1

查看最近一次的备份的日志:

shell cat /home/scripts/log/restic-backup.log


实际还有挺多复杂的功能,可参见官方文档
Last modification:December 5, 2024
V50%看看实力