Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

XFS Backup/Restore
post by tommy @ 21 七月, 2002 20:30
一般 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

Del.icio.us Furl HEMiDEMi Technorati MyShare
迴響
暱稱:
標題:
個人網頁:
電子郵件:
authimage

迴響

  

Bad Behavior 已經阻擋了 97 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS