备份 点文件 的习俗自古有之,arch 还为此单独开了一个 页面
我感觉比较好用的是 https://github.com/twpayne/chezmoi
然而, chezmoi 不支持用户路径以外的文件,其他工具我也懒得用了,索性用 rsync 自己配一个
touch ~/.rsync
写入以下内容:
# 备份的命令是 rsync --files-from=.rsync -raHXi / DESTINATION
/etc/oh-my-zsh/
/home/tea/.ssh/
上述命令中参数的含义分别为:
-r:递归处理文件夹
-a :归档模式(保留文件权限、保存文件时间信息、保留文件属组信息、保持文件属主信息、保持设备文件信息、保留软链接)
-H:保留硬链接
-X:保留拓展属性
-i:输出一个摘要信息
可以将 DESTINATION 设置到一个 git 路径下,同步成一个私有仓库即可。
也可以用 tar 压缩成一个压缩包,这样还能保留文件的权限信息。当然,使用 git-cache-meta
也可以保留权限信息
缺点是不同系统之间只能自己建分支维护,但是胜在简单
Note:
如果你备份了 $HOME 路径之外的文件,比如 /etc,那么由于备份时会保留权限,所以你在备份时需要 root 权限
另一个问题是 rsync 不支持路径替换,比如用 ~ 代替 $HOME 是不允许的,当然,变量替换也是不允许的
定时运行备份
根据 使用 Systemd Timer 调度任务 可以创建三个文件来用来创建定时运行的备份
三个文件分别为:
/bin/dot_backup.sh
#! /bin/bash
rsync --files-from=/home/your_name/.rsync -raHXi / /data/sec_data/Documents/backup/fedora
exit 0
/etc/systemd/system/dot_backup.service
[Unit]
Description=A job backup dotfiles
[Service]
Type=simple
ExecStart=/bin/dot_backup.sh
[Install]
WantedBy=default.target
/etc/systemd/system/dot_backup.timer
[Unit]
Description=A job timer backup dotfiles
RefuseManualStart=no
RefuseManualStop=no
[Timer]
Persistent=true
# 一天运行一次
OnCalendar=*-*-* 00:00:00
Unit=dot_backup.service
[Install]
WantedBy=timers.target
根据以上内容,实际上还可以创建一个任务用来定期将其打包成 tar 或者进行增量备份并上传,但是我现在还没有更新这部分内容的计划,就先搁置了。
使用 tar 对备份进行打包
上面已经将文件备份到指定文件夹,但是如果直接使用 git 上传上去的话,一方面是会丢失权限,另一方面也不够安全。
打包的命令如下:
XZ_DEFAULTS="-T 0"
tar -cpJ 1 | xz -9e > 1.tar.xz
上面第一行是让 xz 自动使用多线程,下面先使用 tar 将文件夹压缩成 tar 再通道到 xz 进行最高限度的压缩
加密
一般来说
- 使用公钥对文件进行签名是最可靠的方法,但是一旦私钥丢失就没办法将文件找回了,所以这里不再使用公钥签名
- 最简单的字节反转的方式对文件加密,这种方式虽然加密程度不高,但是但是胜在简单、速度快,而且很难想到有人用这种方式加密
- 另一种是使用 openssl 的密码加密。这里使用这种方式
openssl enc -e -aes256 -in 1.tar.xz -out 2.tar.xz -k 12345
需要解密的时候只需要将 -e 换成 -d 就行了
加密要求不高的话还可以使用 dd conv=swab 进行字节反转,这种方式快速而且简单
后续
这里我又做了一个测试:
压缩文件为 mp4,653MB(684558471)
| 压缩方式 | 加密方式 | 总时间 | 压缩后的大小 | 压缩比 |
|---|---|---|---|---|
| ztsd -T0 -18 | openssl | 5:35.85 | 680484912 | 0.994 |
| zstd -T0 -18 | gpg | 5:43.77 | 681187559 | 0.995 |
| lz4 | openssl | 5:34.70 | 680534560 | 0.994 |
| lz4 -9 | openssl | 5:49.34 | 680532256 | 0.994 |
| lz4 -9 | gpg | 6:09.26 | 681193647 | 0.995 |
因此,以后备份方式改成 zstd+openssl ,如此,完整的备份命令如下:
tar -cpJ Music | zstd -c -T0 -18 | openssl enc -e -aes256 -k 12345 -pbkdf2 > Music.tar.zstd.secret
gpg 对称加密的方式如下:
tar -cpJ '1.mp4' | zstd -c -T0 -18 | gpg -c --cipher-algo AES256 --output /tmp/1.tar.zstd.gpg