opensuse系统快照管理常用命令
基于Btrfs
文件系统的快照管理
https://documentation.suse.com/zh-cn/sle-micro/6.0/html/Micro-transactional-updates/index.html
创建快照
每安装一次
软件包后重启
,就会生成一个快照
snapper create
# 为根文件系统创建 Snapper 配置
## 参数: / 表示配置应用于根分区
snapper create-config /
# 创建一个名为 "home" 的 Snapper 配置,用于管理 /home 挂载点
## 参数: -c home 指定配置名称;/home 表示目标挂载点
snapper -c home create-config /home
查看快照列表
# 查看快照列表
snapper list
修改快照描述
# 修改快照12的 描述
snapper modify -d "安装了mosh" 12
回滚快照
# 回滚快照
snapper rollback 快照编号
# 回滚到快照5 并添加备注
snapper rollback 5 -d "Emergency_rollback"
对比快照
snapper status 15..16 |less # 查看文件变化
snapper diff 15..16 |less # 内容差异对比
删除快照
# 删除快照
snapper delete 快照编号
回滚操作
snapper
在 openSUSE
之外的系统操作回滚还是很麻烦的.
回滚操作是一个比较复杂的变更,使用 snapper
也是一个比较繁杂的操作。
需要注意尽量确认自己修改了哪个文件,需要回滚,尽量使用 undochange
命令进行回滚,rollback
需要配合额外的工具实现具体回滚( openSUSE
正常回滚,会创建 grub2
条目,但其他系统修改 /etc/fstab
无法成功 )。
因此文件数量较少,可以使用 undochange
撤销更改:
# 使用 Snapper 回滚指定快照之间的文件更改(还原修改前的版本)
## 参数: <修改前的快照编号>..<修改后的快照编号> 表示快照对比范围;<文件名> 是要恢复的具体文件路径
snapper undochange <修改前的快照编号>..<修改后的快照编号> <文件名>
# 回滚快照 1 到 3 之间对 /etc/hostname 文件的更改
snapper undochange 1..3 /etc/hostname
# 如果需要比对两个快照之间的差异,可以使用 status 命令
## 参数: <第一个快照编号>..<第二个快照编号>,第一个快照的创建时间必须早于第二个
snapper status <第一个快照编号>..<第二个快照编号>
# 查看快照 1 和 3 之间的文件变更情况
snapper status 1..3
如果确实需要 rollback
到对应的快照,完全回滚到对应的快照号,则可以通过 subvol
特性实现。
手上需要一个支持 btrfs
格式挂载的系统维护盘,gentoo
的安装盘即可。
假设快照所在的磁盘标签为 DISK
(磁盘格式为 btrfs
)。
# 挂载指定设备上的 Btrfs 子卷 / 到目标目录 /mnt/gentoo
## 参数: /dev/disk/by-label/DISK 是设备标识;
## /mnt/gentoo 是挂载点;
## -o subvol=/ 指定要挂载的子卷路径
mount /dev/disk/by-label/DISK /mnt/gentoo -o subvol=/
迁移 snapshot 目录
如果你创建的 snapper
快照目录存储在默认的 /
路径下,并没有单独分盘,可以考虑将其迁移出单独的盘,更好管理。若原先已分成单独子卷可以,可以跳过该步骤。
假设当前子卷架构如下:
ID | gen | top level | path |
---|---|---|---|
2 | 876941 | 5 | @home |
1 | 876939 | 5 | @ |
而 snapper
原来存储快照在 @/.snapshots
目录下,即默认路径,未挂载单独目录。
btrfs
的子卷可以当作普通文件夹取管理:
# 将 Btrfs 子卷中默认的快照目录 .snapshots 重命名为 snapshots
## 参数: @/.snapshots 是原子卷路径;@snapshots 是新命名的目标子卷路径
mv @/.snapshots @snapshots
将 @/.snapshots
移动到根目录,其 top level
就会变化和 @
一致。
ID | gen | top level | path |
---|---|---|---|
3 | 876913 | 5 | @snapshots |
2 | 876941 | 5 | @home |
1 | 876939 | 5 | @ |
后续直接添加 /etc/fstab
条目即可:
参数 | 解释 |
---|---|
defaults: | 默认挂载参数(rw, suid, dev, exec, auto, nouser, async) |
subvol=@snapshots: | 指定挂载的 Btrfs 子卷名称为 @snapshots |
compress=zstd:8: | 启用 zstd 算法压缩,压缩等级 8 |
ssd: | 优化 SSD 性能 |
space_cache=v2: | 使用更高效的块空间缓存跟踪机制 |
discard=async: | 异步执行 TRIM 操作,提升 SSD 寿命与性能 |
# fstab 条目:定义如何挂载快照子卷 @snapshots
## - LABEL=DISK 表示设备按标签挂载
## - /.snapshots 是挂载点路径
## - btrfs 表示文件系统类型
## - defaults,subvol=@snapshots,... 表示挂载选项,包含子卷名称和压缩等设置
## - 0 0 表示不进行 dump 备份和 fsck 检查
LABEL=DISK /.snapshots btrfs defaults,subvol=@snapshots,compress=zstd:8,ssd,space_cache=v2,discard=async 0 0
通过子卷快照回滚
不需要明确的回滚操作,通过子卷移动或者“快照的快照”,也可以方便地实现快照的回滚。
假设 snapper
快照号为 326
,则其子卷路径为 @snapshots/326/snapshot
,可以通过 btrfs subvolume list /mnt/gentoo | grep 326
搜索路径。此处回滚 root
的快照
# 备份原有 root
# 创建当前根子卷 @ 的快照作为备份,命名为 @bak
## 参数: 第一个 @ 是源子卷;@bak 是新建的快照名称
btrfs subvolume snapshot @ @bak
# 删除当前根子卷 @(谨慎操作)
## 参数: @ 是要删除的子卷名称
btrfs subvolume delete @
# or 也可以使用 mv 命令重命名子卷而不是删除
mv @ @bak
# 迁移快照
# 使用快照编号 326 中的 snapshot 创建新的根子卷 @(从快照恢复)
## 参数: @snapshots/326/snapshot 是源快照路径;@ 是目标子卷名称
btrfs subvolume snapshot @snapshots/326/snapshot @
# or 直接重命名快照为根子卷 @
mv @snapshots/326/snapshot @
迁移完成后重启
即可。
小结
btrfs
目前已经很稳定,没有比较大的问题,快照管理也十分简单,所有快照都是子卷,子卷当文件管理也可以。
恢复快照
需要重启设备
,而且异地存储
还需要目标机器是 btrfs
格式的磁盘。