使用 Snapper 管理 NAS 快照
对我而言,NAS 中最重要的数据是照片和文档。我的个人文档数量有限,所以会随时用多种服务备份,但是照片数量比较多,加上我老婆的照片总共有几百G,为防止这些照片数据丢失,我首先是用 btrfs 组建了 raid1,此外又用 snapper 来定时创建快照以防止照片误删。
创建 subvolume
btrfs 快照依赖 subvolume。btrfs 文件系统创建 subvolume 的指令为:
btrfs subvolume create /path/to/subvolume
配置 snapper
安装
以 Debian 系统为例,可直接通过官方源安装:
apt install snapper
配置自动任务
一般系统如果有 cron
守护进程的话,snapper
会定时执行快照任务。需要配置的是快照任务的执行间隔和快照数量限制。
为 btrfs 指定的 subvolume 创建 snapper
配置的指令为,config
为配置名称,可以根据自己情况指定:
snapper -c config create-config /path/to/subvolume
这将会:
根据
/usr/share/snapper/config-templates/default
处的默认配置模板创建一个配置文件/etc/snapper/configs/config
。在
/path/to/subvolume/.snapshots
处创建一个子卷,用于存储未来该配置文件产生的子卷。子卷的路径将会是/path/to/subvolume/.snapshots/#/snapshot
,#
是子卷序号。将
config
加入到/etc/conf.d/snapper
或/etc/default/snapper
(Linux 发行版不同位置会有区别,对我而言是后一个路径)SNAPPER_CONFIGS
中。
这里需要注意的是如果要手动删除
/etc/snapper/configs/
的配置文件,需要同时将/etc/conf.d/snapper
或/etc/default/snapper
中的SNAPPER_CONFIGS
里配置删除。
之后根据自己需要修改/etc/snapper/configs/
里的所要保存的snap数量,我这里的配置是这样:
# create hourly snapshots
TIMELINE_CREATE="yes"
# cleanup hourly snapshots after some time
TIMELINE_CLEANUP="yes"
# limits for timeline cleanup
TIMELINE_MIN_AGE="1800"
TIMELINE_LIMIT_HOURLY="10"
TIMELINE_LIMIT_DAILY="10"
TIMELINE_LIMIT_WEEKLY="0"
TIMELINE_LIMIT_MONTHLY="10"
TIMELINE_LIMIT_YEARLY="10"
TIMELINE_MIN_AGE
表示清理snap的间隔,单位是s。TIMELINE_LIMIT_*
的意思可能会让人困惑,我的配置文件的含义实际是保存最新的10 个小时快照;从10天前到现在,保留每天创建的第一个快照;不保留每周的快照;从10个月前到现在,保存每月创建的第一个快照;从10年前到现在,保留每年创建的第一个快照。
由于 btrfs 的快照记录的是子卷的变化而不是全部数据,在文件不经常删除或改动的情况下不会占用很多空间。
快照管理
使用snapper list-configs
查看已有的配置文件:
root@storage:~# snapper list-configs
Config | Subvolume
---------------+----------------------------------------------------------------------
immich_data | /srv/dev-disk-by-uuid-aa19d9dd-125b-464a-8159-cf1a95483254/data/Album
immich_program | /srv/dev-disk-by-uuid-aa19d9dd-125b-464a-8159-cf1a95483254/immich
使用 snapper -c config list
查看快照
root@storage:~# snapper -c immich_data list
# | Type | Pre # | Date | User | Cleanup | Description | Userdata
------+--------+-------+---------------------------------+------+----------+-------------+---------
0 | single | | | root | | current |
2 | single | | Wed 02 Aug 2023 12:00:01 AM CST | root | timeline | timeline |
447 | single | | Thu 07 Sep 2023 12:15:27 AM CST | root | timeline | timeline |
727 | single | | Sat 07 Oct 2023 02:08:14 PM CST | root | timeline | timeline |
954 | single | | Wed 01 Nov 2023 12:00:01 AM CST | root | timeline | timeline |
1130 | single | | Sun 03 Dec 2023 11:20:42 AM CST | root | timeline | timeline |
1482 | single | | Mon 01 Jan 2024 12:00:03 AM CST | root | timeline | timeline |
1785 | single | | Thu 01 Feb 2024 12:00:01 AM CST | root | timeline | timeline |
2202 | single | | Fri 01 Mar 2024 12:00:06 AM CST | root | timeline | timeline |
2728 | single | | Mon 01 Apr 2024 12:00:01 AM CST | root | timeline | timeline |
3031 | single | | Tue 16 Apr 2024 12:00:06 AM CST | root | timeline | timeline |
3055 | single | | Wed 17 Apr 2024 12:00:01 AM CST | root | timeline | timeline |
3078 | single | | Fri 19 Apr 2024 08:43:37 PM CST | root | timeline | timeline |
3082 | single | | Sat 20 Apr 2024 12:00:07 AM CST | root | timeline | timeline |
3106 | single | | Sun 21 Apr 2024 12:00:07 AM CST | root | timeline | timeline |
3130 | single | | Mon 22 Apr 2024 12:00:06 AM CST | root | timeline | timeline |
3154 | single | | Tue 23 Apr 2024 12:00:06 AM CST | root | timeline | timeline |
3178 | single | | Wed 24 Apr 2024 12:00:05 AM CST | root | timeline | timeline |
3202 | single | | Thu 25 Apr 2024 12:00:01 AM CST | root | timeline | timeline |
3226 | single | | Fri 26 Apr 2024 12:00:04 AM CST | root | timeline | timeline |
3233 | single | | Fri 26 Apr 2024 07:00:01 AM CST | root | timeline | timeline |
3234 | single | | Fri 26 Apr 2024 08:00:01 AM CST | root | timeline | timeline |
3235 | single | | Fri 26 Apr 2024 09:00:00 AM CST | root | timeline | timeline |
3236 | single | | Fri 26 Apr 2024 10:00:01 AM CST | root | timeline | timeline |
3237 | single | | Fri 26 Apr 2024 11:00:00 AM CST | root | timeline | timeline |
3238 | single | | Fri 26 Apr 2024 12:00:03 PM CST | root | timeline | timeline |
3239 | single | | Fri 26 Apr 2024 01:00:03 PM CST | root | timeline | timeline |
3240 | single | | Fri 26 Apr 2024 02:00:04 PM CST | root | timeline | timeline |
3241 | single | | Fri 26 Apr 2024 03:00:04 PM CST | root | timeline | timeline |
删除快照:
snapper -c config delete N
这个表示删除配置文件为config的序号为N的快照。