轮换命名的btrfs增量快照子卷如何通过send/receive同步到远程服务器
可行方案
核心思路是不依赖子卷的目录名做匹配,而是用子卷唯一不变的UUID做对齐,完美适配快照轮换重命名的场景,哪怕断更多日也能正常同步:
具体操作步骤
- 每次本地快照轮换完成后,执行同步逻辑前,先分别拉取本地和远程备份根目录下所有只读子卷的UUID与对应路径映射:
# 本地执行,输出格式为 子卷UUID:子卷相对路径 btrfs subvolume list -u /本地/备份根目录 | awk '{print $9":"$NF}' # 远程执行,输出格式同上 ssh 远程主机 btrfs subvolume list -u /远程/备份根目录 | awk '{print $9":"$NF}'
- 对齐子卷生命周期:
- 删除远程存在、但本地已经不存在对应UUID的子卷(就是本地已经轮换淘汰的旧快照)
- 对本地存在、但远程没有对应UUID的子卷,找到两端共有的最新快照作为父快照,执行增量发送:
btrfs send -p /本地/父快照路径 /本地/新快照路径 | ssh 远程主机 btrfs receive /远程/备份根目录
- 对齐路径:所有子卷都在两端存在后,按照本地的UUID-路径映射,直接重命名远程对应UUID的子卷路径即可,只读子卷重命名仅修改目录项,不会触碰实际数据,安全性极高。
注意事项
- 同步操作前可以先给远程备份根目录做一个临时只读快照,万一操作出错可快速回滚,同步验证无问题后再删除临时快照即可
- 发送快照时可添加校验参数避免传输错误,对可靠性要求高的场景可以加
btrfs send --checksum参数 - 不想自行开发脚本的话,可以直接用成熟的btrfs备份工具btrbk,原生支持快照轮换、跨主机增量同步、UUID自动匹配逻辑,无需自行处理路径对齐问题,适配你当前的使用场景。
内容的提问来源于stack exchange,提问作者mauserrifle
相关产品推荐
相关产品推荐

