一、前言
Time Machine 这东西用过 macOS 的都知道,可以说是数据备份神器。
前几天我误删了几个文件,还好我有设置 Time Machine 自动备份,于是我打开 Time Machine,点几下鼠标,文件就回来了!
我想要是 Time Machine 能用来备份 Linux 服务器那该有多好啊,特别是像我这种喜欢乱改配置文件然后又从来不备份的人!
于是我 Google 了一下,发现 GitHub 上有一个基于 rsync 二次开发的备份脚本!于是乎马上开始折腾……
GitHub 项目:laurent22/rsync-time-backup
我的备份方式是外接硬盘。这个脚本我用了几天,感觉 Time Machine 的特性都具备了,而且磁盘满的时候可以自动清理最早的备份,权限、硬链接全部正常,觉得应该完美了。最重要的是 (wo) 不(bu)用 (hui) 配置复杂的 rsync,可以说是 Linux 版的 Time Machine!
二、系统环境
- 操作系统:CentOS 7.3.1611(已关闭 SELinux)
- 备份盘挂载点:
/backup
- 备份盘文件系统:ext4
三、配置步骤
3.1 下载脚本文件
克隆 GitHub 上的项目
git clone https://github.com/laurent22/rsync-time-backup.git
安装脚本文件
cp rsync-time-backup/rsync_tmbackup.sh /usr/local/bin/rsync_tmbackup.sh
赋予脚本执行权限
chmod +x /usr/local/bin/rsync_tmbackup.sh
附:脚本文件基本用法
rsync_tmbackup.sh <备份源> <备份目标> [排除文件列表]
3.2 创建备份排除列表
如果要备份根目录的话,必须指定一个排除列表来防止根目录所在分区以外分区的文件被备份。
文件格式:
- <目录>
(一行一个目录。)
下面是我的排除列表(位置:/etc/rsync_tmbackup_ext.txt
):
cat /etc/rsync_tmbackup_ext.txt
- /mnt
- /backup
- /dev
- /proc
- /sys
- /tmp
3.3 在备份目标上创建一个标记点
在非 rsync 服务器上进行备份时,必须先创建一个标记点,否则备份将无法进行。使用 rsync 或者 scp 方式备份的可能不用(自己没试过)。
touch /backup/backup.marker
3.4 开始备份
/usr/local/bin/rsync_tmbackup.sh / /etc/rsync_tmbackup_ext.txt
不出意外的话,下面就开始刷屏了。
3.5 设置整点自动备份
crontab -e
请在命令行窗口中按下 O
(大写) ,将以下内容直接粘贴到命令行窗口中,再按下 ESC
,最后输入 :wq
按回车。
0 */1 * * * /usr/bin/flock -n /tmp/backup.lock -c "/usr/local/bin/rsync_tmbackup.sh / /backup /etc/rsync_tmbackup_ext.txt" > /dev/null 2>&1
这一步完成之后,每隔一个小时系统就会自动执行该脚本来实现自动备份。
说明
- 请确保
crond
服务已开启,否则无法定时备份。
3.6 结果
下面是脚本运行几天之后我的备份目录。我这里设置的是每天 8 点到 22 点整点备份。
[root: ~]# ll /backup
总用量 80K
drwxr-xr-x 16 root root 4.0K 4月 29 15:00 .
dr-xr-xr-x. 20 root root 4.0K 4月 29 08:21 ..
dr-xr-xr-x 3 root root 4.0K 4月 29 14:04 2023-04-28-170001
dr-xr-xr-x 15 root root 4.0K 4月 26 22:11 2023-04-28-180002
dr-xr-xr-x 15 root root 4.0K 4月 26 22:11 2023-04-28-190001
dr-xr-xr-x 15 root root 4.0K 4月 26 22:11 2023-04-28-200001
dr-xr-xr-x 15 root root 4.0K 4月 26 22:11 2023-04-28-210001
dr-xr-xr-x 15 root root 4.0K 4月 26 22:11 2023-04-28-220001
dr-xr-xr-x 16 root root 4.0K 4月 29 08:21 2023-04-29-080002
dr-xr-xr-x 16 root root 4.0K 4月 29 08:21 2023-04-29-100002
dr-xr-xr-x 16 root root 4.0K 4月 29 08:21 2023-04-29-110003
dr-xr-xr-x 16 root root 4.0K 4月 29 08:21 2023-04-29-120002
dr-xr-xr-x 16 root root 4.0K 4月 29 08:21 2023-04-29-130001
dr-xr-xr-x 16 root root 4.0K 4月 29 08:21 2023-04-29-140002
dr-xr-xr-x 15 root root 4.0K 4月 29 08:21 2023-04-29-150002
-rw-r--r-- 1 root root 6 4月 29 15:20 backup.inprogress
-rw-r--r-- 1 root root 0 4月 27 07:59 backup.marker
lrwxrwxrwx 1 root root 17 4月 29 14:13 latest -> 2023-04-29-140002
drwx------ 2 root root 16K 4月 26 22:10 lost+found
下面我们对比一下 macOS 原生的 Time Machine。
[zenandidi: ~]$ ls -l /Volumes/Time\ Machine/Backups.backupdb/MacBook\ Pro
total 8
drwxr-xr-x@ 21 root wheel 714B 4 29 15:03 .
drwxr-xr-x@ 6 root wheel 204B 2 8 18:01 ..
drwxr-xr-x@ 6 root wheel 204B 4 27 07:04 2023-04-27-070433
drwxr-xr-x@ 6 root wheel 204B 4 28 09:21 2023-04-28-092124
drwxr-xr-x@ 6 root wheel 204B 4 28 15:01 2023-04-28-150135
drwxr-xr-x@ 6 root wheel 204B 4 28 16:00 2023-04-28-160028
drwxr-xr-x@ 6 root wheel 204B 4 28 16:56 2023-04-28-165654
drwxr-xr-x@ 6 root wheel 204B 4 28 17:55 2023-04-28-175554
drwxr-xr-x@ 6 root wheel 204B 4 28 18:56 2023-04-28-185654
drwxr-xr-x@ 6 root wheel 204B 4 28 20:08 2023-04-28-200806
drwxr-xr-x@ 6 root wheel 204B 4 28 21:17 2023-04-28-211735
drwxr-xr-x@ 6 root wheel 204B 4 28 22:45 2023-04-28-224546
drwxr-xr-x@ 6 root wheel 204B 4 29 07:05 2023-04-29-070534
drwxr-xr-x@ 6 root wheel 204B 4 29 08:05 2023-04-29-080531
drwxr-xr-x@ 6 root wheel 204B 4 29 08:50 2023-04-29-085018
drwxr-xr-x@ 6 root wheel 204B 4 29 09:54 2023-04-29-095453
drwxr-xr-x@ 6 root wheel 204B 4 29 11:03 2023-04-29-110311
drwxr-xr-x@ 6 root wheel 204B 4 29 13:04 2023-04-29-130419
drwxr-xr-x@ 6 root wheel 204B 4 29 14:12 2023-04-29-141247
drwxr-xr-x@ 4 root wheel 136B 4 29 15:03 2023-04-29-150331.inProgress
lrwxr-xr-x 1 root wheel 17B 4 29 14:12 Latest -> 2023-04-29-141247
可以看出,仿真度已经非常高了!
3.7 恢复
这里恢复的话当然没有像 macOS 那样可以用漂亮的 GUI 啦!我们直接用 rsync
命令将备份时间点里面的文件恢复过去就好了。
例如恢复整个 /etc
目录:
rsync -aP /backup/2023-04-29-080002/etc/ /etc
-a 参数,相当于-rlptgoD,-r 是递归 -l 是链接文件,意思是拷贝链接文件;-p 表示保持文件原有权限;-t 保持文件原有时间;-g 保持文件原有用户组;-o 保持文件原有属主;-D 相当于块设备文件;
-z 传输时压缩;
-P 传输进度;
-v 传输时的进度等信息,
考虑使用
--dry-run
选项来检查要复制的内容。如果您还希望删除存在于目标但不存在于备份中的文件,请使用--delete
(显然,在使用此选项时必须格外小心)。
我这里并没有尝试全盘恢复,全盘恢复的话用启动盘启动之后把全部文件拷贝过去应该也是可以的(如果开了 SELinux 那么还需要恢复一下安全上下文数据)。
四、注意事项
- 如果需要使用 samba 网络备份的话,必须在上面建立一个虚拟的磁盘映像,然后创建一个 ext4 文件系统再挂载,否则所有的硬链接将不可用,权限也无法保存。
- 如果要使用网络磁盘的话,推荐使用 NFS,或者直接备份到其他的 rsync 服务器上。
- 脚本可能会更新,更新之后的用法可能会改变,请以 GitHub 项目上的最新说明为准。