我在 Btrfs 根分区上安装了 Ubuntu 20.04 以获取快照功能。
为了使其尽可能简单,我想将 Btrfs 快照的创建集成到我的upgrade
-alias 命令中,该命令目前如下所示:
sudo apt update && sudo apt upgrade -y && sudo flatpak update -y && sudo snap refresh
我如何最好地在更新之前添加快照,以便在出现任何问题时可以回滚?
是否也可以同时删除旧快照?(我的根分区填充不到 10%,所以我可以多次复制整个系统,但我想它会很快填满每周更新?)
我会以 Ignacio Nunez Hernanz 的精彩脚本为基础:
相关使用信息:
您的升级别名需要如下所示:
btrfs-snp / syschanges 3 600 && ...
它会生成一个带有标签syschanges in的快照/.snapshots
,但如果在过去 5 分钟内已经有一个快照,则不会,并且最多保留其中的 3 个。这为您提供了 5 分钟的窗口来执行重复操作而不会造成混乱,例如,如果您想在一个安装步骤中从不同的 repos 或 ppa 安装,而不仅仅是升级。
然后,您可以按照 btrfs 最佳实践使用和恢复这些快照。
在 中制作快照非常容易
btrfs
。首先将包含
btrfs
文件系统的分区挂载到例如/mnt
. 我们假设它是/dev/sda1
./
如果您使用at@
和/home
at安装标准 Ubuntu@home
,运行ls
将显示两个项目:@
和@home
.此外,如果您之前创建了快照,它们也会显示在那里。
要创建 and 的快照,请
/
运行/home
以下命令:如果要在创建新备份之前删除现有备份,命令将是:
就如此容易。
完成卸载分区后
/mnt
:此外,我可以补充一点,您可以创建带有时间戳的快照或进行增量备份。但这有点超出了问题的范围。
您可以将这些命令组合成一个文本文件,例如
backup.sh
.例子:
该脚本应与
sudo
.我有几个想法给你。挑选、选择和组合。
btrfs sub snapshot -r /mnt/btrfsroot/@/ /mnt/btrfsroot/snapshots/root-$(date +%y%m%d)
。/mnt/btrfsroot/snapshots/@*-apthook-YYMMDDHH
,例如,您可以在每个月的 12 日运行一个 cronjob 作为34 03 12 * * btrfs sub delete /mnt/btrfsroot/snapshots/@*-apthook-$(date --date='15 days ago' +\%y\%m)*
. 检查手册页以man 5 crontab
获取man date
更多信息。我希望这能让你朝着正确的方向前进。同样,我建议简单地使用
apt-btrfs-snapshot
并完成它。请注意,到目前为止,apt-btrfs-snapshot
假设您的根分区名为@
. 这是 Ubuntu 和许多其他发行版的默认设置。如果有不清楚的地方,请随时提出后续问题。
PS:你了解
/
(运行系统的根目录)和 btrfs-root 之间的区别吗?您可以使用这个 shell 脚本轻松地做到这一点。
使用以下内容创建一个 shell 脚本:
创建文件后,将 /snapshots 替换为您想要保存快照的快照目录。然后放在任何地方。
现在通过执行使其可执行:
现在更改升级别名的命令,使其指向脚本。
现在运行您的别名将首先删除带有
backup_
前缀的快照,然后它将拍摄以 . 开头的名称保存的文件系统的快照backup_
。请注意,第一次运行时,它可能会显示错误。但是第一次运行时忽略它,没有备份,所以没有什么可删除的。也不要
backup_
在将保存备份快照的目录中创建名称以 at 开头的子卷或快照。这将导致在脚本运行时将其删除。快照也不包括来自其他快照、子卷和挂载分区的文件。