Hyp*_*ane 5 zfs snapshot 22.04
所以我在安装Ubuntu 22.04时选择了ZFS,因为我想尝试一下。我喜欢快照功能,但我发现由于每天都会apt-upgrade积累大量快照,占用大量空间。(并开始抱怨 rpool/bpool 空间不足)
如何以及在哪里可以设置一些合理的自动删除规则?
例如我想自动只保留
apt-upgrade快照似乎特别是当带有大型二进制文件(例如 CUDA)的软件包更新时,大量空间被用于快照......
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)
该脚本有一些限制,您在使用之前应该了解并接受(或解决)这些限制。
zfs list创建日期排序来确定哪些快照是旧的。如果您能很好地应对这些限制,并且愿意将自己的数据押在上面,那就大胆尝试吧。但这是不提供保证或保证的。使用风险自负。
我使用该实用程序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。我通过删除可执行属性来禁用它们。
| 归档时间: |
|
| 查看次数: |
2609 次 |
| 最近记录: |