Borg 数据备份

Borg 的优势是

  • 高效:
    BorgBackup 会将文件按数据块去重,只有改动的数据块才会被备份。
    一个 25 GiB 的虚拟机磁盘文件,只改动了 1 GiB,那就只会新增备份这 1 GiB 的数据;
  • 高速:
    核心算法使用 C 编译,使用缓存快速跳过未改动过的文件以加快备份速度;
  • 加密:
    数据默认是 AES-256 加密并且 HMAC-SHA256 校验的;
  • 压缩:
    支持多种压缩算法,可自动检测数据是否属于可被压缩的类型;
  • 异地备份:
    原生支持 SSH 备份到异地服务器,也可使用 NFS 等网络存储;
  • 可挂载:
    可以直接用 FUSE 挂载一个备份存档读取里面的数据;
  • 跨平台:
    支持 Linux, macOS, BSD, Windows (Cygwin / WSL) 等多种平台;
  • 开源:
    安全可审计,易于修改。


Borg 安装
wget https://github.com/borgbackup/borg/releases/download/1.2.4/borg-linux64
mv ./borg-linux64  /usr/bin/borg
ln -s /usr/bin/borg /usr/bin/borgfs
  • 1.
  • 2.
  • 3.
Borg 备份

现在有 2 个目录,要把source里面的数据备份到backup里面,原始数据如下:

ls -ltr source/ backup/
backup/:
总用量 0

source/:
总用量 573056
-rw-rwxr-- 1 admin admin 545468729 5月   8 16:13 Smi1.fa
-rw-rwxr-- 1 admin admin  41336490 5月   8 16:14 Smi1.gff
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
1. 初始化 backup 目录 (这里测试,采用不加密的方式)
borg init --encryption=none backup
# borg init --encryption=repokey /home/karthick/borg/backup

# 初始化后目录结果如下,这里应该是索引文件和效验文件
ls -ltra backup/
# 总用量 60
# drwxrwxr-x 4 admin admin    34 5月   8 16:14 ..
# -rw------- 1 admin admin    73 5月   8 16:26 README
# -rw------- 1 admin admin   209 5月   8 16:26 config
# drwx------ 3 admin admin    15 5月   8 16:26 data
# -rw------- 1 admin admin    70 5月   8 16:26 hints.1
# -rw------- 1 admin admin   190 5月   8 16:26 integrity.1
# -rw------- 1 admin admin 41258 5月   8 16:26 index.1
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
2. 创建备份存档

当前备份的存档命令为2023-05-08-1。每天备份时,可以以日期为存档命令,方便回溯。

# 默认情况下,borg 使用lz4压缩算法,lz4压缩算法速度非常快,压缩比低
# --compression zstd,N N 为 1-22,数值越大,压缩比越大
# 软链接会被作为软链接存储,不会存储其链接的源文件
# 这里遇到一个很有意思的事情:我的一个备份里面存在软连接,mount备份的存档后,发现
# 我在源文件里面怎么改,这里就怎么改,实时更新,还以为是 borg 出了 bug。后来才发现
# 备份的是软连接。
# 删除掉的文件在后面的存档里也会被删除
borg create --stats --progress backup::2023-05-08-1 source/
# borg create --stats --compression zstd,10 --progress backup::2023-05-08-2 source/
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
3. 获取存档信息
borg info backup::2023-05-08-1
  • 1.

输出如下

Archive name: 2023-05-08-1
Archive fingerprint: 9a368357c37399a5d3c784829471b7eb4bb0596b2011de74d444363581f6c868
Time (start): Mon, 2023-05-08 16:42:34
Time (end):   Mon, 2023-05-08 16:42:37
Duration: 2.49 seconds
Number of files: 2
Utilization of max. archive size: 0%
------------------------------------------------------------------------------
                       Original size      Compressed size    Deduplicated size
This archive:              586.81 MB            315.08 MB            315.08 MB
All archives:              586.81 MB            315.08 MB            315.09 MB

                       Unique chunks         Total chunks
Chunk index:                     225                  225
------------------------------------------------------------------------------
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
4. 列出当前所有存档和存档内容
borg list backup
# 2023-05-08-1                         Mon, 2023-05-08 16:42:34 [9a368357c37399a5d3c784829471b7

# 列出存档内容
borg list backup::2023-05-08-1
# drwxrwxr-x admin  admin         0 Mon, 2023-05-08 16:14:30 source
# -rw-rwxr-- admin  admin  545468729 Mon, 2023-05-08 16:13:41 source/Smi1.fa
# -rw-rwxr-- admin  admin  41336490 Mon, 2023-05-08 16:14:05 source/Smi1.gff

# 列出存档内容,同时排除特定文件或目录
borg list backup::2023-05-08-1 --exclude Smi1
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
5. 新增一个文件测试备份
head -n 10000 source/Smi1.fa >source/NewSmi1.fa
borg create --stats --progress backup::2023-05-08-2 source/
  • 1.
  • 2.

输出如下,总大小没有变。相同内容的文件,没有增加额外存储。

------------------------------------------------------------------------------               
Repository: /home/admin/tes/backup
Archive name: 2023-05-08-2
Archive fingerprint: 25d7942b01376dad1f84f3efef276d30c680be5d83e76626427f3794143345a5
Time (start): Mon, 2023-05-08 19:24:59
Time (end):   Mon, 2023-05-08 19:25:01
Duration: 1.13 seconds
Number of files: 3
Utilization of max. archive size: 0%
------------------------------------------------------------------------------
                       Original size      Compressed size    Deduplicated size
This archive:              587.32 MB            315.36 MB            284.22 kB
All archives:                1.17 GB            630.44 MB            315.39 MB

                       Unique chunks         Total chunks
Chunk index:                     228                  451
------------------------------------------------------------------------------
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

给之前文件增加一些内容

cat source/NewSmi1.fa >>source/Smi1.fa
borg create --stats --progress backup::2023-05-08-3 source/
  • 1.
  • 2.

输出如下,新的备份存档只包含文件新增的部分内容,总的存档大小略微增加。

------------------------------------------------------------------------------               
Repository: /home/admin/tes/backup
Archive name: 2023-05-08-3
Archive fingerprint: 887d645b3e80779431b564feab24e1ee5a9e1184780c291a5b11134da8d368f1
Time (start): Mon, 2023-05-08 19:27:41
Time (end):   Mon, 2023-05-08 19:27:42
Duration: 1.12 seconds
Number of files: 3
Utilization of max. archive size: 0%
------------------------------------------------------------------------------
                       Original size      Compressed size    Deduplicated size
This archive:              587.83 MB            315.65 MB              1.75 MB
All archives:                1.76 GB            946.09 MB            317.15 MB

                       Unique chunks         Total chunks
Chunk index:                     231                  677
------------------------------------------------------------------------------
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

再次查看每个档案下备份的文件

# 每个档案下的存储都是当时备份时的全文件,可以看到档案3里面Smi1.fa的大小比档案1里面要大一些
borg list backup::2023-05-08-3
# drwxrwxr-x admin  admin         0 Mon, 2023-05-08 19:23:01 source
# -rw-rwxr-- admin  admin  545978689 Mon, 2023-05-08 19:27:39 source/Smi1.fa
# -rw-rwxr-- admin  admin  41336490 Mon, 2023-05-08 16:14:05 source/Smi1.gff
# -rw-rw-r-- admin  admin    509960 Mon, 2023-05-08 19:23:01 source/NewSmi1.fa

borg list backup::2023-05-08-1
# drwxrwxr-x admin  admin         0 Mon, 2023-05-08 16:14:30 source
# -rw-rwxr-- admin  admin  545468729 Mon, 2023-05-08 16:13:41 source/Smi1.fa
# -rw-rwxr-- admin  admin  41336490 Mon, 2023-05-08 16:14:05 source/Smi1.gff

# 直接使用diff比较2个档案,差异看的更清楚
borg diff backup::2023-05-08-1 2023-05-08-3
# [ctime: Mon, 2023-05-08 16:14:30 -> Mon, 2023-05-08 19:23:01] [mtime: Mon, 2023-05-08 16:14:30 -> Mon, 2023-05-08 19:23:01] source
#   +3.2 MB   -2.7 MB [ctime: Mon, 2023-05-08 16:14:30 -> Mon, 2023-05-08 19:27:39] [mtime: Mon, 2023-05-08 16:13:41 -> Mon, 2023-05-08 19:27:39] source/Smi1.fa
# added     509.96 kB source/NewSmi1.fa
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
6. 提取档案,恢复数据

提取时只会提取到当前目录,这一点需要注意。

# 新建一个要恢复数据到的目录
mkdir -p recover_dir1

# 切换目录
cd recover_dir1/

# 恢复存档backup::2023-05-08-1,注意路径的变化
borg extract -v --list ../backup::2023-05-08-1
source
source/Smi1.fa
source/Smi1.gff

# 恢复时是恢复的整个文件夹
ls
source

# 查看下时间和大小
ls -l source/
# 总用量 573056
# -rw-rwxr-- 1 admin admin 545468729 5月   8 16:13 Smi1.fa
# -rw-rwxr-- 1 admin admin  41336490 5月   8 16:14 Smi1.gff
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
7. 删除最早的一个档案,测试恢复第三个档案是否可以全部内容恢复

删除早期档案不影响当前数据的完整恢复。

cd ../
borg delete backup::2023-05-08-1

# 新建一个要恢复数据到的目录
mkdir -p recover_dir2

# 切换目录
cd recover_dir2

# 恢复存档backup::2023-05-08-3,注意路径的变化
borg extract -v --list ../backup::2023-05-08-3

# 查看文件大小
ls -ltsr source/
总用量 574052
 40368 -rw-rwxr-- 1 admin admin  41336490 5月   8 16:14 Smi1.gff
   500 -rw-rw-r-- 1 admin admin    509960 5月   8 19:23 NewSmi1.fa
533184 -rw-rwxr-- 1 admin admin 545978689 5月   8 19:27 Smi1.fa

# 测试查看文件是否一致,输出为空,表示完全一样
diff source/Smi1.fa ../source/Smi1.fa
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
8. 通过挂载恢复部分文件
cd ../
mkdir /tmp/backup3
borg mount backup::2023-05-08-3 /tmp/backup3
ls -ltrs /tmp/backup3/source/
# 总用量 574049
#  40368 -rw-rwxr-- 1 admin admin  41336490 5月   8 16:14 Smi1.gff
#    499 -rw-rw-r-- 1 admin admin    509960 5月   8 19:23 NewSmi1.fa
# 533183 -rw-rwxr-- 1 admin admin 545978689 5月   8 19:27 Smi1.fa

可以直接拷贝需要的文件出来

# 卸载备份的文件
borg umount /tmp/backup3

# 如果挂载时出现下面的错误,请执行 export 的三句话设置本地语言

#  File "borg/archiver.py", line 183, in wrapper
#  File "borg/archiver.py", line 1371, in _do_mount
#  File "borg/fuse.py", line 545, in mount
#  File "borg/fuse.py", line 278, in _create_filesystem
#  File "borg/fuse.py", line 355, in _process_archive
#  File "os.py", line 812, in fsencode
# UnicodeEncodeError: 'ascii' codec can't encode characters in position 25-29: ordinal not in range(128)

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
  • 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.
9. 修剪存档

定期清空一部分副本以减少空间使用

# --keep-daily 7 means to keep the latest backup on each day, up to 7 most recent days with backups (days without backups do not count). The rules are applied from secondly to yearly, and backups selected by previous rules do not count towards those of later rules. 
# 每周的存档保留最新的,最多保存最近 2 个周
borg prune -v --list --keep-weekly=2 backup/

# 每周的存档保留最新的,最多保存最近 6 个 月
borg prune -v --list --keep-monthly=6 backup/

# 指定对某些特定名字的存档应用此规则
# borg prune -v --list --keep-weekly=2 --prefix='{archive name}' /home/karthick/borg/backup/
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
10. —dry-run 是你的测试好帮手

不知道命令的操作会有什么后面时,加上--dry-run查看会运行哪些操作。