Btrfs快照是共享数据块的子卷克隆,需在同一文件系统内创建;可写快照默认生成,加-r参数创建只读快照;通过btrfs subvolume命令管理、查看及删除,删除后独占数据块才被回收。

在 Linux 中,Btrfs 原生支持写时复制(CoW)机制,快照是其最实用的功能之一——它不是简单拷贝,而是瞬间创建、空间共享、可读可写(或只读)的文件系统视图。
快照的基本原理与前提
Btrfs 快照本质上是一个子卷(subvolume)的“克隆”,共享原始数据块,仅在数据被修改时才分配新空间。要创建快照,源必须是一个子卷(不能是根目录本身,除非根就是子卷),且目标路径需位于同一 Btrfs 文件系统内。
- 确认当前挂载点使用 Btrfs:
findmnt -t btrfs或df -T /path - 检查是否已启用子卷支持(默认开启):
btrfs subvolume list /mount/point - 快照只能在同一个 Btrfs 分区/设备内创建,跨设备不支持
创建只读与可写快照
默认创建的是可写快照(即“写时复制子卷”),适合备份后继续使用;加 -r 参数可创建只读快照,防止误修改,常用于一致性备份点。
- 创建可写快照:
btrfs subvolume snapshot /mnt/data /mnt/snaps/data-20240520 - 创建只读快照:
btrfs subvolume snapshot -r /mnt/data /mnt/snaps/backup-ro-20240520 - 快照路径必须是绝对路径,且目标父目录(如
/mnt/snaps)需已存在并挂载在同一 Btrfs 上
管理与清理快照
快照占用空间随修改动态增长,不会自动释放旧数据——删除快照后,其独占的数据块才会被回收(需运行 btrfs filesystem usage 查看实际占用)。
- 列出所有子卷和快照:
btrfs subvolume list -a /mnt(-a显示全部,含隐藏) - 查看某快照的源信息:
btrfs subvolume show /mnt/snaps/data-20240520 - 删除快照(立即生效,不可撤销):
btrfs subvolume delete /mnt/snaps/data-20240520 - 批量删除旧快照可配合
find+xargs,但务必先确认路径无误
结合定时任务实现自动化快照
用 cron 定期创建带时间戳的快照,并保留最近 N 个,避免无限堆积。例如每天凌晨创建并保留 7 天:
- 脚本示例(保存为
/usr/local/bin/btrfs-snap.sh):#!/bin/bash<br>SNAP_DIR="/mnt/snaps"<br>SOURCE="/mnt/data"<br>NAME="daily-$(date +\%Y\%m\%d-\%H\%M)"<br>btrfs subvolume snapshot "$SOURCE" "$SNAP_DIR/$NAME"<br>find "$SNAP_DIR" -maxdepth 1 -name "daily-*" -mtime +7 -exec btrfs subvolume delete {} \; - 加入 cron:
0 0 * * * /usr/local/bin/btrfs-snap.sh - 建议搭配
btrfs filesystem df /mnt和日志记录,便于监控空间与执行状态


















