自动修剪旧的 ZFS 快照

Hyp*_*ane 5 zfs snapshot 22.04

所以我在安装Ubuntu 22.04时选择了ZFS,因为我想尝试一下。我喜欢快照功能,但我发现由于每天都会apt-upgrade积累大量快照,占用大量空间。(并开始抱怨 rpool/bpool 空间不足)

如何以及在哪里可以设置一些合理的自动删除规则?

例如我想自动只保留

  • 手动命名快照
  • 最后 3 张apt-upgrade快照
  • 1 或 2 个每周/每月备份快照。

似乎特别是当带有大型二进制文件(例如 CUDA)的软件包更新时,大量空间被用于快照......

Top*_*ell 2

Canonical 没有提供执行此操作的实用程序,因为以涵盖所有边缘情况的方式稳健且良好地执行此操作需要大量工作。而且您不想在大规模删除其他人的数据时犯错误。我认为 Canonical 低估了他们的 zsys 项目的范围以及他们对在十万个安装中自动修剪根数据集的信心。

话虽如此,我已经写了一个对我来说足够好的剧本。它是否适合您的目的完全是另一个问题,我无法回答。将 的值调整keep为您要保留的快照数量。您可以将此脚本放入/etc/cron.dailyzfs-prune.sh(或您喜欢的任何内容)并将其标记为可执行。

#!/bin/bash

keep=10
num_snaps=$(zfs list -t snapshot -o name -S creation | grep -Po '@autozsys_[a-zA-Z0-9]+$' | uniq | wc -l)
printf "Found %d autosys versions. Configured to keep %d.\n" $num_snaps $keep
if [[ $num_snaps -le $keep ]]; then
    printf "no need to prune.\n"
    exit 0
fi

num_to_prune=$(( num_snaps - keep ))
printf "Pruning %d zsys versions.\n" $num_to_prune
if [[ $num_to_prune -le 0 ]]; then
    printf "Error - no snapshots to prune.\n"
    exit 127
fi

if [[ $num_to_prune -ge $num_snaps ]]; then
    printf "Error - won't remove all snapshots.\n"
    exit 127
fi


for zsys_snap in $(zfs list -t snapshot -o name -S creation | grep -Po '@autozsys_[a-zA-Z0-9]+$' | uniq | tail -n $num_to_prune); do
    printf "Removing $zsys_snap\n"
    zfs list -t snapshot -o name | grep "${zsys_snap}$" | xargs -n 1 zfs destroy -vr
done
Run Code Online (Sandbox Code Playgroud)

局限性

该脚本有一些限制,您在使用之前应该了解并接受(或解决)这些限制。

  • 它不区分 USERDATA 和 ROOT 数据集,因此,如果您有其中一个或另一个的大量较新的 zsys 快照,则可能不会留下另一个的快照。
  • 这对 grub 引导选项没有任何作用(我不确定 zsys 是否有作用)。
  • 我只有一些检查以避免明显的计算/溢出错误。
  • 此脚本假定所有同名快照都是在同一日期创建的,并依靠按zfs list创建日期排序来确定哪些快照是旧的。

如果您能很好地应对这些限制,并且愿意将自己的数据押在上面,那就大胆尝试吧。但这是不提供保证或保证的。使用风险自负。


Art*_*ild 1

我使用该实用程序zfs-auto-snapshot来自动执行此操作。

可以通过以下方式安装:

sudo apt install zfs-auto-snapshot
Run Code Online (Sandbox Code Playgroud)

该程序将以下文件放在您的系统上进行调度:/etc/cron.d/zfs-auto-snapshot,其中我有以下内容:

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# */5 * * * * root zfs-auto-snapshot -q -g --label=frequent --keep=12 //
# 00 * * * * root zfs-auto-snapshot -q -g --label=hourly --keep=24 //
45 23 * * * root zfs-auto-snapshot -q -g --label=daily --keep=30 //
# 59 23 * * 0 root zfs-auto-snapshot -q -g --label=weekly --keep=4 //
# 00 00 1 * * root zfs-auto-snapshot -q -g --label=monthly --keep=12 //
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这使您可以定义以不同时间间隔运行的不同快照标签,以及要保留的数量。

您可以添加以下行来删除带有标签的其他快照apt-upgrade

59 23 * * * root zfs-auto-snapshot -q -g --label=apt-upgrade --destroy-only --keep=3 //
Run Code Online (Sandbox Code Playgroud)

请注意,//每行末尾的 表示所有 ZFS 数据集。您还可以在此处指定文件系统或卷名称,以仅将操作应用于此数据集。

另请注意,zfs-auto-snapshot还将文件放入所有目录/etc/cron.hourly/etc/cron.daily/etc/cron.weekly/etc/cron.monthly。我通过删除可执行属性来禁用它们。

  • 我认为这不会删除 zsys 在 apt 操作期间生成的 autozsys 快照。我的 22.04 安装上没有。这似乎只会修剪该工具制作的快照。 (3认同)