post by tommy @ 21 七月, 2002 20:30
下面的 script 就是利用 xfsdump, bzip2, dd 備份資料到磁帶上. 備份後會測試一次, 以確定資料完整.
#!/bin/sh
# 磁帶機的裝置名稱
TAPE_DEV="/dev/nst0"
# null 裝置名稱
NULL_DEV="/dev/null"
# 指令檔存放的路徑
CMD_PATH="/etc/backup"
# 磁帶的區塊大小 (TR-5 使用 9-65536, 備份與還原必須使用相同設定)
# 配合壓縮軟體與 dd 時, 若設定過大會有問題
BLOCK_SIZE=1024
# 備份的等級, 0 為完全備份
BACKUP_LEVEL=0
# 備份時顯示的間格秒數
TIME_DISPLAY=300
# 備份的指令檔
DUMP_CMD="/usr/sbin/xfsdump"
# 還原備份的指令檔
RESTORE_CMD="/usr/sbin/xfsrestore"
# mt 指令
MT_CMD="/bin/mt"
# dd 指令
DD_CMD="/bin/dd"
# 壓縮程式
ZIP_CMD="/usr/bin/bzip2"
# ls 指令
LS_CMD="/bin/ls"
# head 指令
HEAD_CMD="/usr/bin/head"
# 備份路徑設定檔
# 檔案格式如下:
# <device> <session> <before cmd> <after cmd>
#/dev/hda1 /
#/dev/vg01/ora /home/oracle oracle_stop oracle_start
VOLS_INCL_FILE="${CMD_PATH}/vols.include.xfsdump"
if [ -f ${VOLS_INCL_FILE} ]; then
date
echo "---------------------------------------------------------------"
echo "如果要還原備份資料, 可以使用下面的指令:"
echo "${DD_CMD} bs=${BLOCK_SIZE} conv=sync if=${TAPE_DEV} | "
echo " ${ZIP_CMD} -dqv | "
echo " ${RESTORE_CMD} -p ${TIME_DISPLAY} -J - /path/to/restore/"
echo "---------------------------------------------------------------"
echo
echo "---------------------------------------------------------------"
echo "列出本檔案的內容 - ${0}"
echo "---------------------------------------------------------------"
cat ${0}
echo "---------------------------------------------------------------"
echo "檔案結束!"
echo "---------------------------------------------------------------"
echo
echo "---------------------------------------------------------------"
echo "將磁帶回轉, 並設定區塊大小"
echo "cmd: ${MT_CMD} -f ${TAPE_DEV} retension"
echo "cmd: ${MT_CMD} -f ${TAPE_DEV} rewind"
echo "cmd: ${MT_CMD} -f ${TAPE_DEV} setblk ${BLOCK_SIZE}"
echo "---------------------------------------------------------------"
echo
${MT_CMD} -f ${TAPE_DEV} retension
${MT_CMD} -f ${TAPE_DEV} rewind
${MT_CMD} -f ${TAPE_DEV} setblk ${BLOCK_SIZE}
echo "---------------------------------------------------------------"
echo "載入設定檔: ${VOLS_INCL_FILE}"
index=0
declare -a device_names
declare -a session_names
declare -a before_cmds
declare -a after_cmds
exec 9<&0
exec <${VOLS_INCL_FILE}
while read DEVICE_NAME SESSION_NAME BEFORE_CMD AFTER_CMD
do
case "${DEVICE_NAME}" in
""|#*)
continue;
;;
esac
device_names[$index]=${DEVICE_NAME}
session_names[$index]=${SESSION_NAME}
before_cmds[$index]=${BEFORE_CMD}
after_cmds[$index]=${AFTER_CMD}
let "index += 1"
done
echo "共有 ${index} 個檔案系統要備份!"
echo "---------------------------------------------------------------"
exec 0<&9 9<&-
num=0
while [ "$num" -lt "$index" ]; do
DEVICE_NAME=${device_names[$num]}
SESSION_NAME=${session_names[$num]}
BEFORE_CMD=${before_cmds[$num]}
AFTER_CMD=${after_cmds[$num]}
let "num += 1"
date
echo "---------------------------------------------------------------"
echo "備份 ${DEVICE_NAME} 到磁帶 ${TAPE_DEV} 中..."
echo "---------------------------------------------------------------"
if [ "${BEFORE_CMD}" != "" ]; then
echo " *** 執行備份前置指令: ${CMD_PATH}/${BEFORE_CMD}"
${CMD_PATH}/${BEFORE_CMD}
fi
echo " *** 開始備份..."
echo "cmd: ${DUMP_CMD}
-l ${BACKUP_LEVEL}
-o
-p ${TIME_DISPLAY}
-J
-F
-M weekly_backup
-L ${SESSION_NAME}
- ${DEVICE_NAME} |
${ZIP_CMD} -9qv |
${DD_CMD} bs=${BLOCK_SIZE} conv=sync of=${TAPE_DEV}"
${DUMP_CMD}
-l ${BACKUP_LEVEL}
-o
-p ${TIME_DISPLAY}
-J
-F
-M weekly_backup
-L ${SESSION_NAME}
- ${DEVICE_NAME} |
${ZIP_CMD} -9qv |
${DD_CMD} bs=${BLOCK_SIZE} conv=sync of=${TAPE_DEV}
echo " *** 備份完成!"
if [ "${AFTER_CMD}" != "" ]; then
echo " *** 執行備份後置指令: ${CMD_PATH}/${AFTER_CMD}"
${CMD_PATH}/${AFTER_CMD}
fi
done
date
echo "---------------------------------------------------------------"
echo "備份完成!"
echo "---------------------------------------------------------------"
echo "---------------------------------------------------------------"
echo "將磁帶回轉"
echo "cmd: ${MT_CMD} -f ${TAPE_DEV} rewind"
echo "---------------------------------------------------------------"
echo
${MT_CMD} -f ${TAPE_DEV} rewind
num=0
lnum=0
while [ "$num" -lt "$index" ]; do
DEVICE_NAME=${device_names[$num]}
SESSION_NAME=${session_names[$num]}
BEFORE_CMD=${before_cmds[$num]}
AFTER_CMD=${after_cmds[$num]}
let "num += 1"
date
echo "---------------------------------------------------------------"
echo "測試備份內容 ${DEVICE_NAME}"
echo "---------------------------------------------------------------"
echo "cmd: ${DD_CMD} bs=${BLOCK_SIZE} conv=sync if=${TAPE_DEV} | ${ZIP_CMD} -tqv"
${DD_CMD} bs=${BLOCK_SIZE} conv=sync if=${TAPE_DEV} | ${ZIP_CMD} -tqv
echo
echo "---------------------------------------------------------------"
echo "如果要還原備份資料, 可以使用下面的指令:"
echo "${MT_CMD} -f ${TAPE_DEV} rewind"
echo "${MT_CMD} -f ${TAPE_DEV} fsf ${lnum}"
echo "${DD_CMD} bs=${BLOCK_SIZE} conv=sync if=${TAPE_DEV} | "
echo " ${ZIP_CMD} -dqv | "
echo " ${RESTORE_CMD} -p ${TIME_DISPLAY} -J - /path/to/restore/"
echo "---------------------------------------------------------------"
echo
let "lnum += 1"
done
fi
date
echo "---------------------------------------------------------------"
echo "將磁帶回轉"
echo "cmd: ${MT_CMD} -f ${TAPE_DEV} rewind"
echo "---------------------------------------------------------------"
echo
${MT_CMD} -f ${TAPE_DEV} rewind
date
exit 0