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 <<MAIL To: $MAIL_TO From: BorgEm Subject:$1 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 $2 ### $LOG_MSG MAIL 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