备份开启 Fedora Silverblue 与 Borg

当涉及到备份一个 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不适用认证-blake2repokey-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 list 命令。

要删除测试备份,请在终端中键入以下内容

$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 脚本文件中包含密码短语不是问题。 在正常使用情况下,每次执行备份时最好输入密码。