Btrfs 子卷快照

Btrfs 对子卷做写时复制快照:创建快、额外空间占用随变更增长,适合高频时间点保护与升级前回滚。

备份与容灾速查数据更新于 2026-10-13

Btrfs 子卷快照是什么

Btrfs 对子卷做写时复制快照:创建几乎瞬间完成,快照与源子卷共享未改动的数据块,只有新写入会额外占用空间。这让『每小时打一个时间点』变得可行,误改文件后可以直接切回。限制也很明确:快照与原数据在同一文件系统内,磁盘损坏时一起丢。

基本信息

适用平台Linux + Btrfs(SUSE 系默认,其他发行版可自建)
关键命令btrfs subvolume snapshot 创建、subvolume list 查看、subvolume delete 删除
只读快照-r 生成只读快照,作为保护点更安全,需写时再克隆成可写
空间机制与源共享数据块,占用随源数据变化量增长
异地能力btrfs send / receive 可把只读快照增量同步到远端

典型使用场景

  • 系统升级前留保护点:滚动发行版升级前打一份只读快照,异常时快速回退
  • 高频时间点保护:配合定时任务每小时或每日快照,应对误改误删
  • 容器与虚拟机文件目录:对存放镜像的子卷打快照,秒级得到副本
  • 发布前留底:Web 目录变更前快照,回退只需切换子卷
  • 异地同步源:用只读快照配合 send/receive 把增量送到远端

创建与清理

创建与清理
# 创建只读快照(-r):作为保护点更安全
btrfs subvolume snapshot -r /mnt/btr/data /mnt/btr/snap/data-$(date +%F)
# 查看所有子卷与快照
btrfs subvolume list /mnt/btr
# 删除过期快照(子卷删除是异步的,占用稍后才释放)
btrfs subvolume delete /mnt/btr/snap/data-2026-09-01
# 异地同步:只读快照配合 send/receive 做增量复制
btrfs send -p /mnt/btr/snap/data-2026-10-12 /mnt/btr/snap/data-2026-10-13 \
  | ssh backup@10.0.0.5 'btrfs receive /mnt/backup/snap/'

subvolume list 输出读法

列含义正常/异常
ID子卷编号,恢复或删除时用它定位与目录名不匹配时以路径为准核对
gen子卷的世代号,反映最后修改长期停在旧世代的快照说明它确实是只读保护点
top level所属父级子卷 ID快照被错误嵌套在其他子卷下会导致备份范围互相包含
path子卷相对路径路径与预期不符时先确认挂载点布局
快照位于同一文件系统内,磁盘故障时与源数据一起受影响;异地保护仍需用 send/receive 同步到远端,或另存独立副本。
频繁创建快照而不清理会持续消耗元数据与空间,需要配套保留策略;另外快照目录若被上级子卷收录,备份范围会意外膨胀。

易错点

  • 快照目录被上级子卷收录:形成嵌套关系,备份体积与时间被成倍放大
  • 频繁创建快照不清理:元数据与占用逐步上升,最终影响写入性能甚至空间耗尽
  • 把本地快照当异地备份:磁盘或整机故障时快照与源数据一起丢失
  • 对只读快照直接写入:操作失败,需要先克隆出可写子卷再修改

数据来源与参考

  • btrfs 官方文档(Subvolumes 与 Snapshot)
  • man 8 btrfs-subvolume
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌