[Share Experiences] [教程] 更好地利用btrfs snapshot功能进行系统backup和restore
Tofloor
poster avatar
Ziggy
deepin
2023-07-30 20:40
Author

根据论坛里几个帖子和亲身体验,发现了使用timeshift来对btrfs文件系统来备份还原有一定操作难度,或者说使用默认方案基本不能实现正常备份和还原。

大概思路&介绍

btrfs snapshot主要通过进行创建snapshot子卷来创建快照,取决于btrfs的特性和我的实际体验,我姑且简单概括下:该模式下每个snapshot快照子卷均可以单独启动,但原始系统盘损坏后快照基本不可用,与rsync方案存在差异。
好比我在系统升级前创建了snapshot /@_1,那么原有系统为/,我在升级后,启动时通过对grub添加相关参数来指定引导@_1子卷可以进入升级前的系统子卷,如果不指定引导则会加载默认的/。
值得关注的是,你在每个子卷里的操作都是独立并且可以保存的,比如在@_1子卷中进行文件增删,只要该子卷仍然存在,重启引导/后是原有/的环境,不会混淆@_1子卷中的状况;同理,重启引导@_1子卷后发现之前对@_1子卷的更改被保留了下来,并不会因为我在grub中切换引导的卷而导致重置到快照创建时的状态。可以看成是在你切换到其他子卷后,上一个在使用的子卷就被暂时冻结了。

题外话不多说了,回归正题

创建快照snapshot子卷

出于用途,我个人分为两个模式:

  1. 在系统安装后先使用lived对系统盘进行挂载操作,在用户创建&系统配置步骤前创建首个snapshot子卷,达到 恢复出厂设置 的效果
  2. 在系统使用一段时间后直接在系统内创建snapshot子卷,不依赖lived,充当普通快照使用

以上仅为个人观点,其他用途可以自行安排。下面大概描述下操作步骤:

snapshot子卷创建

  1. 首先挂载目标系统盘,这里是在系统运行的时候操作,因而不需要单独挂载
  2. 创建/@子卷,这里定义为首个子卷
sudo btrfs subvolume snapshot / /@
  1. 创建其他子卷,这里定义为/@_20230730,为方便管理,我一般会使用快照日期作为标记
sudo btrfs subvolume snapshot / /@_20230730

检查子卷是否创建完毕

sudo btrfs subvolume list /

这里可以看到该目录下挂载的所有子卷

ID 265 gen 198 top level 5 path timeshift-btrfs/snapshots/2023-07-30_02-39-39/@
ID 267 gen 225 top level 5 path timeshift-btrfs/snapshots/2023-07-30_01-30-55/@
ID 269 gen 139 top level 5 path timeshift-btrfs/snapshots/2023-07-30_02-02-53/@
ID 271 gen 203 top level 5 path timeshift-btrfs/snapshots/2023-07-30_02-30-21/@
ID 272 gen 212 top level 5 path timeshift-btrfs/snapshots/2023-07-30_02-43-35/@
ID 273 gen 216 top level 5 path timeshift-btrfs/snapshots/2023-07-30_02-41-57/@
ID 274 gen 238 top level 5 path @
ID 275 gen 462 top level 5 path @_20230730

确认子卷生成完毕,进行其他操作

修改fstab文件

  1. 找到根目录的内容, 删除subvolid=x字段,将原有字段 subvol=/修改为subvol=/@
UUID=xxxx-xxxx-xxxx-xxxx-xxxx       /               btrfs           rw,relatime,ssd,space_cache,subvol=/@         0 0

切换快照

基于修改grub进行快照子卷切换,分为临时切换和长期使用

grub界面临时切换

  1. 在grub引导菜单界面对应引导项上按e,找到linux行,在末尾添加参数rootflags=subvol=@,这里的具体子卷可以视实际场景而定
                linux   /vmlinuz-5.18.17-amd64-desktop-hwe root=UUID=xxxx-xxxx-xxxx-xxx-xxxx ro rootflags=subvol=@_20230730  splash quiet  DEEPIN_GFXMODE=$DEEPIN_GFXMODE
  1. 按Ctrl+x即可仅本次引导保存选项,引导进入该子卷环境

修改grub文件进行长期使用

该方法在grub文件重写后需要重新设置

  1. 找到/boot/grub/grub.cfg文件以root打开
  2. 在默认选项的位置,找到linux行,在末尾添加参数rootflags=subvol=@,这里的具体子卷可以视实际场景而定
                linux   /vmlinuz-5.18.17-amd64-desktop-hwe root=UUID=xxxx-xxxx-xxxx-xxxx-xxxx ro rootflags=subvol=@_20230730  splash quiet  DEEPIN_GFXMODE=$DEEPIN_GFXMODE

致谢

感谢各大论坛朋友提供的思路
@neko https://bbs.deepin.org/post/256300
@AMZ https://bbs.deepin.org/post/246616
@2023开始学习 https://bbs.deepin.org/post/256300 39楼

Reply Favorite View the author
All Replies
阿尼樱奈奈
Moderator
2023-07-30 21:02
#1

like

Reply View the author
青稚
Moderator
2023-07-30 22:03
#2

点赞like

Reply View the author
微光寒慕
deepin
2023-07-30 22:39
#3

agree

Reply View the author
2023开始学习
deepin
2023-07-31 01:25
#4

步骤很完善,收藏了。

这个是在linux上适配btrfs的子卷快照功能。

timeshift也是利用btrfs的子卷快照功能,只是对子卷名称有要求。所以适配timeshift也是同样的思路和操作。或者参考一下第一个链接。

Reply View the author
182******08
deepin
2023-08-12 15:37
#5

楼主你好。我现在遇到了问题是/boot空间使用100%的问题,每次删除/boot/snapshot下面的快照他都会再恢复,怎样才能彻底删除呢?

Reply View the author
Ziggy
deepin
2023-08-12 21:34
#6
182******08

楼主你好。我现在遇到了问题是/boot空间使用100%的问题,每次删除/boot/snapshot下面的快照他都会再恢复,怎样才能彻底删除呢?

和btrfs没关系,其他问题可以看看是不是自己用了什么定制操作

Reply View the author
182******08
deepin
2023-08-13 00:13
#7
Ziggy

和btrfs没关系,其他问题可以看看是不是自己用了什么定制操作

哦哦,好的,谢谢

Reply View the author