当涉及到备份一个 Fedora Silverblue 系统,一些传统工具可能无法按预期运行。 BorgBackup (Borg) 是一种替代方案,可以为基于 Silverblue 的系统提供备份功能。 本指南介绍了使用 BorgBackup 1.1.8 作为分层包进行备份的步骤 Fedora 银蓝 29 系统。
在一个正常的 Fedora 工作站系统,dnf是用来安装包的。 然而,在 Fedora Silverblue,rpm-ostree install 用于安装新软件。 这在 Silverblue 系统上被称为分层,因为核心 ostree 是一个不可变的映像,并且 rpm 包在安装过程中分层到核心系统上,从而产生带有分层包的新本地映像。
“BorgBackup(简称:Borg)是一个去重备份程序。 可选地,它支持压缩和认证加密。”
来自博格网站
此外,与 Borg 交互的主要方式是通过命令行。 阅读快速入门指南,很明显 Borg 非常适合编写脚本。 事实上,在执行系统的重复彻底备份时,非常有必要使用某种形式的 shell 脚本。 提供了一个基本脚本 博格快速入门指南 ,作为开始的一个点。
安装博格
在终端中,键入以下命令将 BorgBackup 安装为分层包:
$rpm-ostree 安装 borgbackup
这会将 BorgBackup 安装到 Fedora 银蓝系统。 要使用它,请使用以下命令重新启动到新的 ostree:
$systemctl 重启
现在 Borg 已经安装完毕,可以使用了。
关于 Silverblue 及其文件系统、分层包和 flatpak 的一些说明
文件系统
Silverblue 是一个基于 ostree 的不可变操作系统,通过使用 rpm-ostree 支持分层 rpm。 在用户级别,这意味着在 flatpak 中显示为 /home 的路径实际上是系统的 /var/home。 对于像 Borg 这样的程序和其他备份工具,记住这一点很重要,因为它们通常需要实际路径,所以在这个 example 那将是 /var/home 而不仅仅是 /home。
在开始备份之前,最好了解可以存储潜在数据的位置,然后了解是否应该备份这些数据。 Silverblue 的文件系统布局对于可写和不可写非常具体。 在 Silverblue 上,/etc 和 /var 是唯一不可变的地方,因此是可写的。 在单用户系统上,通常用户主目录可能是数据备份的一种选择。 通常不包括下载,但包括文档等。 此外, /etc 是您不想再次经历的某些配置选项的合理选择。 记下要从主目录和 /etc 中排除的内容。 /etc 的一些文件和子目录需要 root 或 sudo 访问权限。
扁平包装
Flatpak 应用程序将数据存储在 $HOME/.var/app/flatpakapp 下的主目录中,无论它们是作为用户还是系统安装的。 如果安装在用户级别,还会在 $HOME/.local/share/flatpak/app/ 中找到数据,或者如果安装在系统级别,则会在 /var/lib/flatpak/app 中找到数据。在这篇文章中,列出已安装的 flatpak 并将输出重定向到文件进行备份就足够了。 推理如果需要重新安装它们(flatpaks),可以使用列表文件来完成它。 对于更健壮的方法,可以检查 flatpak 文件系统布局 这里。
分层和 rpm-ostree
除了
$rpm-ostree 状态命令。 其中显示了当前和以前的 ostree 提交的分层包,如果有任何提交被固定,它们也会被列出。 下面是我系统上的输出,请注意每个提交列表末尾的 LayeredPackages 标签。
命令
$ostree 日志对于检索系统的提交历史非常有用。 在终端中输入它以查看输出。
准备备份 repo
为了使用 Borg 备份系统,您需要首先初始化一个 Borg repo。 在初始化之前,必须决定使用(或不)加密,如果是,什么模式。
使用 Borg,可以使用 256 位 AES 加密来保护数据。 在客户端加密的数据的完整性和真实性使用 HMAC-SHA256 进行验证。 下面列出了加密模式。
加密模式
哈希/MAC | 未加密无身份验证 | 未加密,但经过身份验证 | 加密(AEAD w/ AES)和认证 |
SHA-256 | 没有任何 | 认证 | repokey 密钥文件 |
布莱克2b | 不适用 | 认证-blake2 | repokey-blake2 密钥文件-blake2 |
决定的加密模式是 keyfile-blake2,它需要输入密码以及所需的密钥文件。
Borg 可以使用以下压缩类型,您可以在创建备份时指定它们。
- lz4(超快,低压缩)
- zstd(从高速低压缩到高压缩低速的宽范围)
- zlib(中等速度和压缩)
- lzma(低速,高压缩)
对于压缩,lzma 在设置 6 时选择,即最高可感知压缩级别。 完成初始备份需要 4 分 59.98 秒,而后续备份通常用时不到 20 秒。
博格初始化
为了能够使用 Borg 执行备份,首先,为您的 Borg repo 创建一个目录:
$mkdir borg_testdir
然后改变它。
$cd borg_testdir
接下来,使用 borg init 命令初始化 Borg repo:
$borg 初始化 -e=keyfile-blake2 。
Borg 将提示您输入密码,该密码区分大小写,并且在创建时必须输入两次。 应创建一个合适的字母数字字符和符号密码短语,并具有合理的长度。 如果需要,可以稍后更改它,而不会影响密钥文件或您的加密数据。 密钥文件可以与密码一起导出并用于备份目的,并存储在安全的地方。
创建备份
接下来,创建 Documents 目录的测试备份,记住 Silverblue 上用户 Documents 目录的实际路径是 /var/home/username/Documents。 在 Silverblue 的实践中,适合使用 ~/ 或 $HOME 来指示您的主目录。 实际路径和作为真实路径的环境变量之间的区别不会改变,而环境变量可以改变。 在 Borg repo 中,输入以下命令
$borg create .::borgtest /var/home/username/Documents
这将创建名为 Documents 目录的备份 博格测试. 稍微分解一下命令; 创造 需要一个 回购位置, 在这种情况下 . 因为我们在 顶层 的 回购. 这使得路径 .::borgtest 为备份名称。 最后 /var/home/用户名/文档 是我们正在备份的数据的位置。
以下命令
$borg 列表
返回您的备份列表,几天后它看起来类似于:
要删除测试备份,请在终端中键入以下内容
$borg 删除 .::borgtest
此时 Borg 会提示输入加密密码以删除备份。
将其整合到一个 shell 脚本中
如前所述,Borg 是一个非常适合脚本的工具。 提供的 Borg 文档链接是了解更多关于 BorgBackup 的好地方,而且还有更多。 这 example 修改了 Borg 提供的脚本以适合本文。 下面是一个包含基本部分的版本,如果需要,其他人可以将其用作起点。 它试图捕获前面提到的系统和应用程序的三个信息片段。 flatpak 列表、rpm-ostree 状态和 ostree 日志的输出作为人类可读文件,每次都给出相同的名称,因此每次都被覆盖。 自原始版本以来,必须更改 repo 设置 example 用于使用 ssh 进行远程服务器登录,这是为了在本地使用。 其他更改主要涉及更正目录路径、定制排除的内容以适合此系统主目录以及选择压缩。
#!/bin/sh
# This gets the ostree commit data, this file is overwritten each time
sudo ostree log fedora-workstation:fedora/29/x86_64/silverblue > ostree.log
rpm-ostree status > rpm-ostree-status.lst
# Flatpaks get listed too
flatpak list > flatpak.lst
# Setting this, so the repo does not need to be given on the commandline:
export BORG_REPO=/var/home/usernamehere/borg_testdir
# Setting this, so you won't be asked for your repository passphrase:(Caution advised!)
export BORG_PASSPHRASE='usercomplexpassphrasehere'
# some helpers and error handling:
info() { printf "n%s %snn" "$( date )" "$*" >&2; }
trap 'echo $( date ) Backup interrupted >&2; exit 2' INT TERM
info "Starting backup"
# Backup the most important directories into an archive named after
# the machine this script is currently running on:
borg create
--verbose
--filter AME
--list
--stats
--show-rc
--compression auto,lzma,6
--exclude-caches
--exclude '/var/home/*/borg_testdir'
--exclude '/var/home/*/Downloads/'
--exclude '/var/home/*/.var/'
--exclude '/var/home/*/Desktop/'
--exclude '/var/home/*/bin/'
::'{hostname}-{now}'
/etc
/var/home/ssnow
backup_exit=$?
info "Pruning repository"
# Use the `prune` subcommand to maintain 7 daily, 4 weekly and 6 monthly
# archives of THIS machine. The '{hostname}-' prefix is very important to
# limit prune's operation to this machine's archives and not apply to
# other machines' archives also:
borg prune
--list
--prefix '{hostname}-'
--show-rc
--keep-daily 7
--keep-weekly 4
--keep-monthly 6
prune_exit=$?
# use highest exit code as global exit code
global_exit=$(( backup_exit > prune_exit ? backup_exit : prune_exit ))
if [ ${global_exit} -eq 0 ]; then
info "Backup and Prune finished successfully"
elif [ ${global_exit} -eq 1 ]; then
info "Backup and/or Prune finished with warnings"
else
info "Backup and/or Prune finished with errors"
fi
exit ${global_exit}
此列表缺少更多特定于测试系统设置和备份意图的排除项,并且非常基本,具有定制和改进的空间。 对于写一篇文章的测试,在 shell 脚本文件中包含密码短语不是问题。 在正常使用情况下,每次执行备份时最好输入密码。