XEN SERVER BACKUP
- Category: 電腦相關
- Last Updated: Wednesday, 03 June 2015 09:12
- Published: Monday, 18 May 2015 11:36
- Written by sam
公司大部份的機器都架在Debian(Ubuntu) Xen Server上
目前已進貨新NAS一臺
該寫一下備份了
採用SNAPSHOT的方式來備份
最基本的就是先弄好NFS作為備份地
192.168.1.17:/volume1/root on /blvm type nfs (rw,tcp,addr=192.168.1.17)
目前這臺只有四臺主機,兩臺採用LVM,兩臺是FILE方式
root@pm-team-acer:~# xen list Name ID Mem VCPUs State Time(s) Domain-0 0 3249 8 r----- 409531.6 samtest 21 1024 2 -b---- 2165.5 keenhigh-git 24 384 2 -b---- 3028.7 ag-server 36 1024 1 -b---- 2524.3 artifactory-server 37 1024 1 -b---- 825.4
詳細見SH的相異之處
#!/bin/bash
#sam141113 v0
#sam150515 v1
#sam150516 v2
#sam150603 add timer
#for acer-192.168.1.21
#for lv in `lvdisplay /dev/pm-team-acer-vg | grep 'LV Path' | awk '{print $3}'`
#{
cp -rf /etc/xen/* /blvm/acer
DEST="/blvm/acer"
SAM=`date "+%Y%m%d%H%M"`
startTimer() {
START_TIME=$(date)
S_TIME=$(date +%s)
}
endTimer() {
END_TIME=$(date)
E_TIME=$(date +%s)
DURATION=$(echo $((E_TIME - S_TIME)))
if [[ ${DURATION} -le 60 ]] ; then
echo "Backup Duration: ${DURATION} Seconds"
else
echo "Backup Duration: $(awk 'BEGIN{ printf "%.2f\n", '${DURATION}'/60}') Minutes"
fi
}
for lv in $(</home/samlin/list); do
startTimer
echo "lv: $lv"
LV_NAME="`basename $lv`"
LV_SIZE="`lvs --units m |grep $LV_NAME |awk '{print $4}'`"
LV_UUID="`lvdisplay $lv | grep 'LV UUID' | awk -F'LV UUID' '{print $2}' | sed 's/^ *//g'`"
LV_SNAPNAME="SNAP_$LV_NAME"
SAM1="`echo "$LV_NAME" |sed 's/-disk//g'`"
echo "shutdown $SAM1"
echo "LV NAME: $LV_NAME"
echo "LVM Logical Volume: $lv"
echo "Size: $LV_SIZE MB"
echo "UUID: $LV_UUID"
echo "Snapshot name: $LV_SNAPNAME"
echo "Removing old snapshot (if any)..."
lvremove -f "/dev/pm-team-acer-vg/$LV_SNAPNAME"
echo "Creating snapshot..."
lvcreate -L+$LV_SIZE --snapshot -n"/dev/pm-team-acer-vg/$LV_SNAPNAME" "$lv"
sleep 5
echo "Backing up snapshot..."
dd if="/dev/pm-team-acer-vg/$LV_SNAPNAME" bs=512k of=/dev/stdout |/usr/bin/pigz -9 -b 256 > "$DEST/$LV_SNAPNAME.$SAM.gz"
echo "Removing snapshot..."
lvremove -f "/dev/pm-team-acer-vg/$LV_SNAPNAME"
echo "start $SAM1"
echo "--------------Del more than 3--------------------"
(ls -t $DEST/$LV_SNAPNAME* |head -n 3;ls -t $DEST/$LV_SNAPNAME*) |sort |uniq -u |xargs rm
endTimer
echo "------------------------------------------------"
done
echo "start backup Fix lvm"
for fix in $(</home/samlin/list1); do
startTimer
NN=`echo $fix |awk -F',' '{print $1}'`
LL=`echo $fix |awk -F',' '{print $2}'`
echo stop ${NN}
xl shutdown ${NN}
echo Backing up ${NN}
dd if=${LL} bs=512k of=/dev/stdout |/usr/bin/pigz -9 -b 256 > $DEST/${NN}.$SAM.gz
echo start ${NN}
xl create /etc/xen/${NN}.cfg
echo "--------------Del more than 3--------------------"
(ls -t $DEST/${NN}*.gz |head -n 3;ls -t $DEST/${NN}*.gz) |sort |uniq -u |xargs rm
endTimer
done
#} > /blvm/backup-lvm-acer-sam.log
#mutt -s "backup-lvm-acer" mis at fuhu.tw < /blvm/backup-lvm-acer-sam.log
以上是測試正常腳本
分隔兩部份
一區為使用lvcreate的方式,取得大小_建立snapshot_壓縮_至目的地_移除snapshot
一區為使用先停xen guest os的方式,先DD出來_壓縮_至目的地_啟動
snapshot的方式沒有停機,採直接DD到目的地
當然原本的方式是由LVM指令取得相關資訊
但由於許多臺機器並無開機及備份需求
所以改採用 cat 由檔案讀入方式
以下一份附上格式、內容
oot@pm-team-acer:~# cat list /dev/pm-team-acer-vg/keenhigh-git-disk /dev/pm-team-acer-vg/testgerrit-disk
root@pm-team-acer:~# cat list1 ag-server,/home/xen/domains/ag-server/disk.img artifactory-server,/home/xen/domains/artifactory-server/disk.img
##############################################
另一臺環境相同,差別為都是由LVM所建立
所以相對腳本少了許多
#!/bin/bash
#sam141113 v0
#sam150515 v1
#sam150516 v2
#sam150603 add timer
#for asus-192.168.1.20
#for lv in `lvdisplay /dev/pm-team | grep 'LV Path' | awk '{print $3}'`
#{
cp -rf /etc/xen/* /blvm/asus
DEST=/blvm/asus
SAM=`date "+%Y%m%d%H%M"`
startTimer() {
START_TIME=$(date)
S_TIME=$(date +%s)
}
endTimer() {
END_TIME=$(date)
E_TIME=$(date +%s)
DURATION=$(echo $((E_TIME - S_TIME)))
if [[ ${DURATION} -le 60 ]] ; then
echo "Backup Duration: ${DURATION} Seconds"
else
echo "Backup Duration: $(awk 'BEGIN{ printf "%.2f\n", '${DURATION}'/60}') Minutes"
fi
}
for lv in $(</home/samlin/list)
do
startTimer
LV_NAME="`basename $lv`"
LV_SIZE="`lvs --units m |grep $LV_NAME |awk '{print $4}'`"
LV_UUID="`lvdisplay $lv | grep 'LV UUID' | awk -F'LV UUID' '{print $2}' | sed 's/^ *//g'`"
LV_SNAPNAME="SNAP_$LV_NAME"
echo "LV NAME: $LV_NAME"
echo "LVM Logical Volume: $lv"
echo "Size: $LV_SIZE MB"
echo "UUID: $LV_UUID"
echo "Snapshot name: $LV_SNAPNAME"
echo "Removing old snapshot (if any)..."
lvremove -f "/dev/pm-team/$LV_SNAPNAME"
echo "Creating snapshot..."
lvcreate -L+$LV_SIZE --snapshot -n"/dev/pm-team/$LV_SNAPNAME" "$lv"
sleep 10
echo "Backing up snapshot..."
dd if="/dev/pm-team/$LV_SNAPNAME" bs=512k of=/dev/stdout |/usr/bin/pigz -9 -b 256 > "$DEST/$LV_SNAPNAME.$SAM.gz"
echo "Removing snapshot..."
lvremove -f "/dev/pm-team/$LV_SNAPNAME"
echo "--------------Del Old than 3--------------------"
(ls -t $DEST/$LV_SNAPNAME* |head -n 3;ls -t $DEST/$LV_SNAPNAME*) |sort |uniq -u |xargs rm
endTimer
echo "-------------------------------------------------------"
done
#} > /blvm/backup-lvm-asus-sam.log
#mutt -s "backup-lvm-asus" mis at fuhu.tw < /blvm/backup-lvm-asus-sam.log
##############################################
備份出來格式
目前還欠版本保留個數及發信通知功能待加入
要使用lvm的snapshot 記得查看是否有以下指令
##########################################
檔案保留三個
(ls -t $LV_SNAPNAME |head -n 3;ls -t $LV_SNAPNAME) |sort |uniq -u |xargs rm
使用mutt寄信
mutt -s "backup-lvm-asus" mis fuhu.tw < /blvm/backup-lvm-asus-sam.log
因為直接用crontab 排程寄信,所以直接mark掉shell 裡的mutt.

