技巧心得 |
XFS Backup/Restore By Tommy Wu <tommy at teatime.com.tw> 一般 unix base 的備份多使用 tar, cpio, dump 之類的軟體. 最常看見的應該 算是 tar 了. 不過 tar 目前只能備份標準的一些檔案屬性, 對於 XFS 來說, 額外的 ACL 屬性就沒有辦法了. 所以如果使用 XFS, 通常就會利用本身所提供 的工具來備份. 下面的 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 本文的最新版本可以由下列的網頁取得: http://www.teatime.com.tw/~tommy/doc/xfs_backup.txt |