主要方法

  1. 使用单一主机(BH)负责管理所有的备份仓库,各客户服务器(CH)通过SSH远程连接备份主机,执行备份操作。
  2. BH挂接存储作为备份仓库存储位置,包括WIndows-SMB 、 NFS 、 RAID等
  3. BH配置一个专用的备份账户,比如 backup。CH和BH间使用SSH Key建立连接,连接BH上的专门账户 backup,  并利用 .ssh/authorized_keys 的配置启用 force command 和  borg serve –restrict-to-path , 以实现各CH间的权限各类和各仓库的隔离
  4. 每个CH使用一个单独的仓库,或者直接使用一个独立的目录
  5. CH通过systemd配置备份脚本的定时运行
  6. 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

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)文件末尾,并进行相应编辑(如下),注意不要换行,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***YEVr root@vultr.kometo.com
# "borg serve --restrict-to-path " set restrict ssh server for only borg service and only the path

初始化 /mnt/borgs/some-borg-repo-dir

通过上述配置,在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

 

(9)

分类: 系统

发表评论

电子邮件地址不会被公开。