This page looks best with JavaScript enabled

系统全盘备份及快照策略的探索和尝试

 ·  ☕ 4 min read  ·  ✍️ 鱼子盖饭 · 👀... views

这几天一直在探索系统的备份

最初由于抄作业时手滑覆盖了 .config 文件夹,刚配置好的桌面环境,又回到了命令行。。。于是将配置文件同步到了 Gayhub 并记录每一次修改

虽然重装系统后能够手动恢复桌面环境,但一切还是要根据配置文件重新部署。而我对 Linux 还不太熟悉,难免出错,为了能够一键恢复系统,开始探索如何对系统备份

Rsync

Rsync 用于增量同步源地址与目的地址,意味着在第一次同步之后,后面的每一次同步都只传输发生变化的部分,而且 Rsync 本身也非常实用,用来备份系统就不用很折腾了

1
sudo rsync --archive --inplace --acls --xattrs --sparse --hard-links --numeric-ids --exclude-from='/home/bruce/Backups/excludelist' --delete  --delete-excluded / /home/bruce/Backups/archlinux/

这是我使用的同步命令,用于将 / 目录下的文件同步到 /home/bruce/Backups/archlinux/ 中,也就是全盘备份

关于参数,部分参考了 依云 的,但大佬的备份策略实在是看不懂。。诶嘿嘿:

  • --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
  • --inplace 更新数据的方式:直接写入(默认为创建副本再重命名)
  • --acls --xattrs 保留文件 ACL 和扩展属性
  • --sparse 对稀疏文件进行特殊处理以节省DST的空间
  • --hard-links 保留硬链结
  • --numeric-ids 文件的所有者信息使用数字而不要解析成用户名/组名,避免在跨系统使用时出差错
  • --delete 将SRC中没有的文件从DST中删除
  • --delete-excluded 避免使用 --delete 选项之后在删除文件时报 cannot delete non-empty directory

--exclude-from= 用于从文件中读取需要排除的目录和文件,文件中的内容一定要是相对路径/* 表示保留目录,但不同步里面的内容,编辑 /home/bruce/Backups/excludelist

1
2
3
4
5
6
7
8
home/bruce/Backups/*
mnt/*
media/*
opt/*
sys/*
tmp/*
proc/*
run/*

Timeshift

Rsyn 虽然能方便快速地备份系统,但如果需要恢复则只能恢复到最近一次的同步,说不定最近一次的同步已经埋下了系统崩溃的祸根

很喜欢云服务器的快照服务,能够让系统回到任意一个快照的时间点,但是自己创建快照就不是那么容易了

Arch Wiki 里有很多快照工具,看了 这篇文章 后我决定用 Timeshift,原因是使用起来很容易,而且是全盘备份

AUR 中有 Timeshift,于是

1
yay -S timeshift

可能是我用的 i3 桌面的原因?没有前端界面,执行 timeshift 出来了一堆选项解释,文章中的教程用不了了,就自己根据选项提示来操作吧,下面是所有的帮助内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Timeshift v20.03 by Tony George (teejeetech@gmail.com)

Syntax:

  timeshift --check
  timeshift --create [OPTIONS]
  timeshift --restore [OPTIONS]
  timeshift --delete-[all] [OPTIONS]
  timeshift --list-{snapshots|devices} [OPTIONS]

Options:

List:
  --list[-snapshots]         List snapshots
  --list-devices             List devices

Backup:
  --check                    Create snapshot if scheduled
  --create                   Create snapshot (even if not scheduled)
  --comments <string>        Set snapshot description
  --tags {O,B,H,D,W,M}       Add tags to snapshot (default: O)

Restore:
  --restore                  Restore snapshot
  --clone                    Clone current system
  --snapshot <name>          Specify snapshot to restore
  --target[-device] <device> Specify target device
  --grub[-device] <device>   Specify device for installing GRUB2 bootloader
  --skip-grub                Skip GRUB2 reinstall

Delete:
  --delete                   Delete snapshot
  --delete-all               Delete all snapshots

Global:
  --snapshot-device <device> Specify backup device (default: config)
  --yes                      Answer YES to all confirmation prompts
  --btrfs                    Switch to BTRFS mode (default: config)
  --rsync                    Switch to RSYNC mode (default: config)
  --debug                    Show additional debug messages
  --verbose                  Show rsync output (default)
  --quiet                    Hide rsync output
  --scripted                 Run in non-interactive mode
  --help                     Show all options

Examples:

timeshift --list
timeshift --list --snapshot-device /dev/sda1
timeshift --create --comments "after update" --tags D
timeshift --restore
timeshift --restore --snapshot '2014-10-12_16-29-08' --target /dev/sda1
timeshift --delete  --snapshot '2014-10-12_16-29-08'
timeshift --delete-all

Notes:

  1) --create will always create a new snapshot
  2) --check will create a snapshot only if a scheduled snapshot is due
  3) Use --restore without other options to select options interactively
  4) UUID can be specified instead of device name
  5) Default values will be loaded from app config if options are not specified

并不是很详细,网上也很难找到 Timeshift 命令行的教程

首先需要安装 Cronie,为 Timeshift 提供定时任务。这里有个坑,刚装好的 Cronie 默认是 disabled 状态:

1
sudo systemctl list-unit-files | grep cronie

手动启动并设为开机自启

1
2
sudo systemctl start cronie.service
sudo systemctl enable cronie.service

然后编辑 Timeshift 的配置文件 /etc/timeshift.json

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
{
  // 快照保存在哪个设备(分区)
  // 执行 sudo blkid 查看各分区的 uuid
  "backup_device_uuid" : "9840955b-7131-4dca-bebf-8918cabc9dbb",
  "parent_device_uuid" : "",
  "do_first_run" : "false",
  "btrfs_mode" : "false",
  "include_btrfs_home_for_backup" : "false",
  "include_btrfs_home_for_restore" : "false",
  "stop_cron_emails" : "true",
  "btrfs_use_qgroup" : "true",
  // 备份策略
  "schedule_monthly" : "true",
  "schedule_weekly" : "true",
  "schedule_daily" : "true",
  "schedule_hourly" : "true",
  "schedule_boot" : "true",
  // 快照数量
  "count_monthly" : "2",
  "count_weekly" : "3",
  "count_daily" : "5",
  "count_hourly" : "6",
  "count_boot" : "5",
  // 这两个字段留空即可,创建之后值会自动生成
  "snapshot_size" : "6422007104",
  "snapshot_count" : "128679",
  "date_format" : "%Y-%m-%d %H:%M:%S",
  // 需要排除的目录
  "exclude" : [
    "/home/bruce/Music/**",
    "/home/bruce/Video/**",
    "/home/bruce/Downloads/**",
    "/home/bruce/Backups/**",
    "/media/**"
  ],
  "exclude-apps" : [
  ]
}

之后执行以下命令即可创建第一次快照

1
sudo timeshift --check

第一次创建快照花费的时间较长,目录也很大(我的有 6G),后面就很快了,一个快照也才 几十 MB

查看快照

1
sudo timeshift --list

list.jpg

也可以根据 Timeshift 的命令选项自己编写脚本,实际上 Timeshift 就是这样运行的,通过将脚本放在 /etc/cron.d 实现定时快照,比如按小时备份:

1
2
3
4
5
6
7
/etc/cron.d/timeshift-hourly

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""

0 * * * * root timeshift --check --scripted

鱼子盖饭
WRITTEN BY
鱼子盖饭
Get into trouble, make mistakes.


What's on this Page