Borg Backup 是目前最受欢迎,用户量最大的一个备份支持程序,支持去重和压缩,同时也支持认证加密。其主要目的是提供一个高效而且安全的方法用于数据备份。数据的去重技术用于每日增量备份。它支持Linux、MacOS和BSD,并遵循BSD许可协议。(地址:https://www.borgbackup.org/)。你也可以通过Windows 10 Linux Subsystem、Cygwin、pip+virtualenv在windows中运行它,但是目前尚属于实验性,未经充分测试。
在通常情况下,我们希望备份应该自动执行、快速部署、稳定可靠、低依赖、统一存储,不需要通过命令行或点击某个按钮来执行,不仅能备份一些常规的静态文件,而且能够对系统盘、数据库、应用系统数据等随时会发生变化的动态数据进行备份,必须能够处理备份过程中的数据一致性问题。这些仅靠BorgBackup自身是不能全部完成的。
针对以上目标,我利用BorgBackup搭建了一个备份支持环境,使用一台Linux服务器提供集中的备份存储,在备份源主机利用LVM的快照功能来解决数据一致性问题,通过一个定制的脚本来进行定时自动操作,并通过电子邮件来记录和跟踪备份完成情况,由此,形成了一个相对可靠、便捷的解决方案
主要方法
使用单一主机(BH)负责管理所有的备份仓库,各客户服务器(CH)通过SSH远程连接备份主机,执行备份操作。
BH挂接存储作为备份仓库存储位置,包括WIndows-SMB 、 NFS 、 RAID等
BH配置一个专用的备份账户,比如 backup。CH和BH间使用SSH Key建立连接,连接BH上的专门账户 backup, 并利用 .ssh/authorized_keys 的配置启用 force command 和 borg serve –restrict-to-path , 以实现各CH间的权限各类和各仓库的隔离
每个CH使用一个单独的仓库,或者直接使用一个独立的目录
CH通过systemd配置备份脚本的定时运行
CH启用LVMs,利用LVMs的快照来实现文件系统的平滑静默,快照在备份前建立,备份后删除
BH配置
1.连接和建立备份存储仓库
#最简单的存储方案,直接建立一个目录即可
mkdir /var/borgs
#其它的方式:选择挂接一个cifs(smb)网络存储作为存储,比如Windows的共享文件夹
#之所以这样做的原因是想搭建一个集中的备份存档库,而这个库既要存储Borg的备份,也要存储Windows的 Server backup 备份,
#从而实现一个机房内部的备份集中解决方案
mount.cifs //10.5.183.126/asb/borgs /mnt/borgs -o user=autobackuper,domain=backup,uid=backup
#或者把验证账号信息放到单一的文件中 (/usr/borg/cifs.creds)
mount.cifs //10.5.183.126/asb/borgs /mnt/borgs -o credentials=/usr/borg/cifs.creds,uid=backup
#不同的主机的备份存储部署,建议使用独立仓库方案,即每个主机的备份存储到一个相应的独立仓库中,如下
# borgs/host1
# /host2
# /host3
#然后,需对每个仓库进行初始化
borg init /var/borgs/host1 .....
2.安装Borg。
注意,borgBackup的服务端实际上不需要任何专门的服务端程序,只需要提供SSH接入,事实上BorgBackup只需要能够读取Repo的文件,就可以进行备份操作。
但是在实际使用中,我们需要一起额外的配置来确保安全。在这里,我们在备份服务前创建一个账号 ‘backup’ 专门用来处理备份请求,并利用 “borg serve –restrict-to-path” 作为SSH连接请求的Shell,来确保备份连接只能在指定路径下进行和Borgbackup 相关的操作。
具体来说:复制客户端的root 账号 SSH Key ( id_rsa.pub的内容),添加到/home/backup/.ssh/authorized_keys文件末尾,并进行相应编辑:
#singl line rsa code
command="cd /mnt/borgs/some-borg-repo-dir; borg serve --restrict-to-path /mnt/borgs/some-borg-repo-dir" ssh-rsa AAA***key string*** root@XXX.com
# "borg serve --restrict-to-path " set restrict ssh server for only borg service and only the path
通过上述配置,在CH上以Root用户权限运行Borg时,将可以免除密码连接到 backup@BH ,并对指定的borg-repo-dir进行操作。
3.初始化Borg Repo ,也可以在连入CH时,逐一创建
CH配置
前置条件:已经配置安装了LVMs,并且VG有空余空间用于创建快照,具备Root权限,可以ssh连接BH
**如果正在运行的系统,没有配置LVMs,比较可行的办法是,安装一台全新系统,安装的过程中配置好LVMs,并且务必预留一些空余空间,用于创建快照,然后把旧系统迁移到新系统,可以使用Brog作为迁移工具,也可以简单的冷Copy。
1.配置ssh免密码连接
检查~/.ssh 目录下有没有已经存在的 id_rsa 和 id_rsa.pub ,如果没有可以使用 ssh-keygen -t rsa 生成密匙对,如果有可以直接使用,关于ssh-key的管理,可以查看相关文档,这里不做详细介绍。
复制id_rsa.pub的内容,添加到BH上的( /home/backup/.ssh/authorized_keys),具体见BH部分相关说明。通过上述配置,在CH上以Root用户权限运行Borg时,将可以免除密码连接到 backup@BH ,并对指定的borg-repo-dir进行操作。
2.安装Borg
Borg 的当前版本是 1.1.5, 查看了一下Debian的 Distribution Package 现在还是1.0.9版本,为了使用最新的版本,建议使用Binary方式安装。
#install borg
wget https://github.com/borgbackup/borg/releases/download/1.1.5/borg-linux64
sudo cp borg-linux64 /usr/local/bin/borg
sudo chown root:root /usr/local/bin/borg
sudo chmod 755 /usr/local/bin/borg
3.准备备份脚本
这里的脚本示例仅仅用了说明工作方式,文件末尾部分提供了一个经过优化完善的脚本包,可以直接使用,并根据需要修改。
主要需要的文件有:
borg-em.sh
borg-em-srv.service
borg-em-srv.timer
均放置在/usr/local/bin,也可根据需要放到任意位置
备份脚本文件 borg-em.sh
#!/usr/bin/env bash
# SETUP
# borg config
# export BORG_REPO='ssh://backup@58.57.39.74:10002/./' #SSH use rsakey and borg root path is seting
export BORG_REPO='/mnt/borgs/bsv-debian' #SSH use rsakey
export BORG_PASSPHRASE='password'
# lvm config
LVM_VG="bsv-deian-app-vg"
LVM_LV_ROOT="root"
BOOT_DEVICE="sda1"
# mail config
MAIL_TO=liflei@163.com
############################################
#### Seme options & Functions ####
ARCHIVE_PREFIX="$HOSTNAME-"
ARCHIVE_CRRENT="$ARCHIVE_PREFIX"`date '+%Y-%m-%d-%H%M'`
LVM_LV_SNAP="sn4backup"
LOG_ECHO=""
ec(){
echo -e "$1"
LOG_ECHO="$LOG_ECHO \n $(date '+%Y-%m-%d-%H:%M:%S') : $1"
}
lmail(){
if [ -n "$MAIL_TO" ];then
LOG_MSG=$( journalctl _PID=$ -u borg-em-srv --since -2h --no-pager --output=cat )
# or LOG_MSG=LOG_ECHO
echo 'sending mail....'
sendmail -t <
To: $MAIL_TO
From: BorgEm
Subject:$1
Content-Transfer-Encoding: 8bit
Content-Type: text/plain; charset=UTF-8
$2
###
$LOG_MSG
fi
}
#Clean all temprary vars & seting
lclean(){
ec "#CleanAll : Do cleaning snapshot & mount ... "
export BORG_PASSPHRASE=""
if [ -n "$LVM_LV_SNAP" ];then
umount /mnt/$LVM_LV_SNAP/boot
umount /mnt/$LVM_LV_SNAP
rm /mnt/$LVM_LV_SNAP -r
lvremove -f /dev/$LVM_VG/$LVM_LV_SNAP
fi
}
####Script Start####
ec "-----------------------------------------------"
ec "- Borg Backup Start (By ems) -"
ec "Target: $BORG_REPO::$ARCHIVE_CRRENT"
ec "Source: /dev/$LVM_VG/$LVM_LV"
ec " Boot device : $BOOT_DEVICE "
ec " "
ec "#PREPARE:"
ec " DO Create snapshot..."
lvcreate -s -n $LVM_LV_SNAP -L 1G /dev/$LVM_VG/$LVM_LV_ROOT
mkdir /mnt/$LVM_LV_SNAP
mount /dev/$LVM_VG/$LVM_LV_SNAP /mnt/$LVM_LV_SNAP
if [ -n "$BOOT_DEVICE" ];then
ec " Mount BOOT_DEVIE $BOOT_DEVICE "
mount /dev/$BOOT_DEVICE /mnt/$LVM_LV_SNAP/boot
fi
# Backing up the snapshot of root
# Moving into the Snapshot directory, the relative path will be
# backup as root of archive
# -v verbose -s show stats, -p show process, -x one-file-system
cd /mnt/$LVM_LV_SNAP
ec "#Creating borg backup........."
if [ 1 == 1 ];then
borg create -v -s \
--compression lz4 \
--exclude-caches \
--exclude 'home/*/.cache' \
--exclude 'var/cache' \
--exclude 'var/tmp' \
--exclude 'tmp' \
--exclude 'lost+found' \
--exclude 'mnt' \
--exclude '*.iso' \
::$ARCHIVE_CRRENT \
. \
2>&1 # Route stderr
fi
cd - #return orignal path
# If there is an error backing up, reset password envvar and exit
if [ "$?" == "1" ] ; then
ec "###"
ec "BorgBackup Failed : $BORG_REPO::$ARCHIVE_CRRENT"
lclean
lmail "Borg Failed($HOSTNAME)" "Borg Backup Failed!"
exit 1
fi
# Prune the repo of extra backups
borg prune -v --prefix $ARCHIVE_PREFIX \
--keep-hourly=6 \
--keep-daily=7 \
--keep-weekly=4 \
--keep-monthly=6 \
# Include the remaining device capacity in the log
ec "#Disk usage:"
df -hl | grep --color=never /dev/
ec " "
ec "#Backup archives list:"
borg list --format="{name:36} {time}{NEWLINE}"
ec " "
ec "#BorgBackup DONE : $BORG_REPO::$ARCHIVE_CRRENT"
lclean
lmail "Borg Done($HOSTNAME)" "BorgBackup DONE : $HOSTNAME --> $BORG_REPO::$ARCHIVE_CRRENT"
exit 0
borg-em-srv.service
#borg-em-srv.service
[Unit]
Description=Borg Em Backup Service
[Service]
Type=simple
Nice=19
KillMode=none
ExecStart=/usr/local/bin/borg-em.sh
borg-em-srv.timer
#borg-em-srv.timer
[unit]
Description=Borg Em Backup Timer
[Timer]
WakeSystem=false
OnCalendar=*-*-* 03:00:00
RandomizedDelaySec=10min
[Install]
WantedBy=timers.target
4.配置备份服务(systemd)
这篇文档How I Use Borg: Scripts & SystemD比较清晰的说明了使用SystemD部署Brog的一般方法。
#Setup systemd
cd /usr/local/bin
chmod x borg-em.sh
systemctl enable /usr/local/bin/borg-em-srv.service
systemctl enable /usr/local/bin/borg-em-srv.timer
#other tools
systemctl daemon-reload #reload service
systemctl list-timers --all #check timer
systemctl start borg-em-srv #run it manully
systemctl status borg-em-srv #show status
systemctl status borg-em-srv.timer
新的补充 2020-5-5:
为了方便客户机进行自动化备份,编写了一个自动备份脚本(Borgem),支 一个BorgBackup的自动备份辅助脚本,支持虚拟卷(LVM)、快照(Snapshot)、多源配置、定时运行,可以向指定邮箱发送备份完成情况,基本能够满足一般的服务器自动备份需要了,详细链接:https://github.com/EmericLee/borg-em