在我的 debian 系统上,我使用 btrfs 格式化的硬盘来进行备份。大量数据是我的音乐和照片收藏,因此它往往相对稳定并且只会增长。
我将 btrfs 卷安装在 /media/backup 中,然后我有一个子目录备份,其中有用于我正在制作的各种备份集的目录。每晚进行备份后,我会制作快照。
DATE=$(日期 +"%Y%m%d_%H%M") btrfs 子卷快照 /media/backup /media/backup/$DATE
第一天,这按预期工作,但第二天,快照还包含第一天的快照,快照包含两个第一快照的第二天,依此类推。
如果我正确理解了创建 btrfs 快照时会发生什么,那么这没有实际意义,磁盘空间的使用绝对是微乎其微的,但由于它看起来有点混乱,我想避免它。我的第一个想法是制作 /media/backup/backup 的快照来避免这种情况,但当我尝试制作目录而不是卷的快照时,这当然不起作用。
有什么方法可以制作同一卷的多个快照并避免较新的快照也指向所有较旧的快照?
答案1
首先,如果您查看最新的快照,您会注意到上一个快照中的目录在新快照中不包含任何实际数据,因此这不仅仅是边际磁盘使用率,而是零额外。
现在,为了避免它们,唯一的方法是将快照存储在快照过程未覆盖的地方。为此,您基本上有两种选择:
在您要创建快照的子卷内为您的快照创建专用子卷。快照在子卷边界处停止(这就是它们不会存储现有快照的副本的原因),因此您的快照中不会有任何快照,只有快照子卷的空目录。这可能是目前最容易采用的选项,因为它只需要创建子卷并将
btrfs subvolume create
快照创建脚本指向存储快照的位置。就其价值而言,.snapshots
似乎是这种方法事实上的标准名称。使用几天后,您的目录树将大致如下所示:/media/backups /media/backups/.snapshots /media/backups/.snapshots/20180207_1342 /media/backups/.snapshots/20180209_0415 /media/backups/.snapshots/20180312_1754
您的所有非快照数据都位于 中
/media/backups
,所有个人快照都存储在 中/media/backups/.snapshots
。每个快照.snapshots
中都会有一个空目录。不要使用 BTRFS 卷的根子卷,而是将所有实际数据放入其自己的子卷中,并对其进行快照,同时将快照放置在其外部。这种方法不太容易转换,并且可能需要您更新的不仅仅是快照命令,而且还可以更轻松地一次性回滚整个快照。使用此方法拍摄一些快照后,您的目录树将如下所示:
/media/backups/current /media/backups/20180207_1342 /media/backups/20180209_0415 /media/backups/20180312_1754
您的所有数据都存储在
/media/backups/current
(需要是 BTRFS 子卷,就像.snapshots
第一种方法一样),并且您的快照位于/media/backups
.您只需删除current
子卷并创建一个名为current
您要恢复的快照的可写快照,即可轻松恢复整个快照。
现在,我想就您所说的内容提出另外两个意见,但这些意见并不直接属于您的问题:
- 您列出的命令将创建可写快照。如果您的目的是维护集合的存档副本,那么这几乎肯定不是您想要的,因此我建议添加
-r
选项以使快照变为只读。如果您需要修改一个文件(例如,如果您需要从集合中完全清除文件),您仍然可以使用该btrfs property set
命令来切换快照上的只读标志。 - 虽然在技术上不是一个重要问题,但您的时间戳格式有点不传统,因此,如果您尝试使用其他工具处理这些快照,可能会导致出现问题,或者如果您需要共享此数据,可能会让其他人感到困惑。鉴于此,我建议使用“%FT%T”,它将为您提供一个 ISO 8601 时间戳,该时间戳应该可以被所有软件解析并且大多数人可以立即识别,同时仍然提供快照的合理词汇排序。