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

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

Linux单点备份,基于Borg的Linux 整机备份的单点集群解决方案相关推荐

  1. 嵌入式基于Linux电机控制,基于嵌入式arm+linux平台的直流电机调速控制系统.pdf

    2012--2013 学年第 二 学期 物电 学院期末考试卷 嵌入式系统与应用 学号 : 姓名 : 班级 : 成绩: 评语: 装 订 (考试题目及要求) 嵌入式大作: 采用实验箱上的电位器作为信号输入 ...

  2. linux摄像头 自动对焦,基于H3在Linux下驱动OV5640摄像头的方法与流程

    技术特征: 1.基于H3在Linux下驱动OV5640摄像头的方法,其特征在于,包括如下步骤: S1打开OV5640摄像头所对应的设备文件/dev/videoX: S2为OV5640摄像头驱动添加读写 ...

  3. 深度 linux支持debian,基于Debian的Linux发行版安装深度音乐及其插件

    在Linux上想要一个完美的,并且能够在线的音乐播放器是很头疼的事情.找了很久,还是觉得Deepin的深度音乐是非常不错的选择.不仅可以播放本地,还可以安装很多插件,包括网易云,百度音乐等等. 下面我 ...

  4. linux 网络对讲,基于ARM与Linux的全数字化可视对讲系统的设计与实现

    摘要: 在信息化飞速发展的今天智能家居系统已越来越多的被人们所接受,从楼宇可视对讲到紧急情况报警,再到远程家电控制,智能家居系统在人们的日常生活中扮演着重要的角色.传统的可视对讲系统都是基于模拟音视频 ...

  5. arm linux 工控,基于ARM和Linux通用工控平台设计 - ARM - 电子发烧友网

    交叉编译 交叉编译就是在一个平台上生成另一个平台上的可执行代码.所谓平台,实际上包含两个概念:体系结构及操作系统.根据上述建立的开发环境,目标平台是基于ARM体系结构的运行嵌入式Linux操作系统,而 ...

  6. 基于tq6410的linux使用教程,基于tq6410的linux使用教程

    基于tq6410的linux使用教程 [2021-02-14 14:24:49]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace(&q ...

  7. 基于2440的Linux开发原理,基于S3C2440和Linux的嵌入式网络驱动程序开发

    摘要: 嵌入式与互联网已经成为最热门的技术.使嵌入式系统具备网络功能,并将它们与Internet或企业局域网连接起来,增强了嵌入式系统多方面的实用性. 本文采用S3C2440微处理器为硬件开发平台,根 ...

  8. 观察内核linux行为,Linux 学习:基于proc观察Linux行为

    内容简介 本篇博文的主要内容是通过/proc文件,对Linux系统管理有一个初步的认识. 在Linux中,proc文件系统提供了一套在用户态检查内核状态和系统特征的机制.proc文件系统将进程的地址空 ...

  9. 【linux kernel】基于ARM64分析linux内核的链接脚本vmlinux.lds.S

    文章目录 一.导读 二.链接器是什么 三.链接脚本 四.linux内核的链接脚本 4-1 头文件包含描述 4-2 参数设置和宏定义描述 4-3 SECTIONS内容分析 五.linux内核的" ...

最新文章

  1. 35 利用构造函数和原型对象实现继承
  2. 上海网络推广浅析一个优质的404页面能给网站带来什么优化效果?
  3. 随便写点时间相关的模块
  4. httpclient帮助类
  5. 解决ubuntu中vi不能正常使用方向键与退格键的问题
  6. windows下使用cpanm进行模块安装
  7. Java 集合List、Set、HashMap操作三(查找List中的最大最小值、遍历HashTable、List元素替换、List查找位置)
  8. 封装的ADO.NET对数据库操作经典类
  9. 从零开始学前端:复习课程 --- 今天你学习了吗?(CSS:Day11)
  10. 微软重写 Windows 10 激活规则
  11. 通过DriverManager接口获取连接
  12. WARNING:root:could not open file ‘/etc/apt/sources.list.d
  13. java简易计算器代码
  14. Microsoft365 与 visio2016 共存
  15. python中re.group()
  16. Spring Security Oauth2 JWT、第三方登录、单点登录讲解,并使用Oauth2.0结合微服务进行单点登录
  17. 许三多买了中石油--暴笑股民语录许三多
  18. PowerMill2019基础到三四五轴编程视频教程全
  19. 一颗种子,一颗小树苗 在快速生长长大的过程中,遇到风雨在所难免
  20. multisim变压器反馈式_基于Multisim的负反馈放大电路仿真分析

热门文章

  1. Java抽象类与接口
  2. unity 项目文件夹保存哪2个_Unity3D 项目专属文件夹须知
  3. position属性
  4. centos当前目录表示方法_centos系统目录详解和常用命令
  5. linux中 删除指定行多行sed命令
  6. ( Flywest or AdvanceEdu )VS 看雪软件安全论坛
  7. 五大分布式ID生成器优缺点及对比(Java)
  8. eBay测评自养号,卖家如何运营?
  9. ASEMI代理AD8638ARJZ-REEL7原装ADI车规级AD8638ARJZ-REEL7
  10. 基于LLVM的Fortran编译器分析