#!/bin/bash # # Author: Mike La Spina # Date: Apr 3, 2009 # Version: 0.2 # # Function: Enumerate active VMFS volumes and create a backup of the header to a file. # # Rev 0.1 Initial # Rev 0.2 William Lam added folder and rolling backups ############################################################################### BACKUP_ROTATION_COUNT=10 BACKUP_NAMING_CONVENTION="$(date +%F)" VMFS_HEADER_BACKUP=/var/log/$(hostname -s)-vmfs-header-backup VDF_OUTPUT=/tmp/vdf_output #rotate backup function checkBackupRotation() { local DIR_PATH=$1 local NAMING_CONVENTION=$2 LIST_BACKUPS=$(ls -tr ${DIR_PATH}) #default rotation if variable is not defined if [ -z ${BACKUP_ROTATION_COUNT} ]; then BACKUP_ROTATION_COUNT=1 fi for DIR in ${LIST_BACKUPS}; do TMP_DIR="${DIR_PATH}/${DIR}" TMP=$(echo ${TMP_DIR##*--}) if [ ${TMP} = "${NAMING_CONVENTION}" ]; then NEW=${TMP}--1 mv "${DIR_PATH}/${DIR}" "${NEW}" elif [ $TMP -ge ${BACKUP_ROTATION_COUNT} ]; then rm -rf "${DIR_PATH}/${DIR}" else BASE=$(echo ${TMP_DIR%--*}) NEW=${BASE}--$((${TMP}+1)) mv "${DIR_PATH}/${DIR}" "$NEW" fi done } # create backupdir mkdir -p "${VMFS_HEADER_BACKUP}" # generate mapping of datastore name to UUID /usr/sbin/vdf -P > "${VDF_OUTPUT}" # Enumerate the VMFS volumes and create a block copy of the header to a file /usr/sbin/esxcfg-vmhbadevs -m | awk '{print $2 " " $3}' | while read VMHBADEVS_OUTPUT; do VMFS_DEVICE=$(echo ${VMHBADEVS_OUTPUT} | awk '{print $1}') UUID=$(echo ${VMHBADEVS_OUTPUT} | awk '{print $2}') DATASTORE=$(grep "$UUID" /tmp/vdf_output | awk -F "%" '{print $2}' | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//') DATASTORE=$(echo "${DATASTORE#*/vmfs/volumes/}") DATASTORE_BACKUP="${VMFS_HEADER_BACKUP}/${DATASTORE}/${BACKUP_NAMING_CONVENTION}" mkdir -p ${DATASTORE_BACKUP} dd if=${VMFS_DEVICE:0:8} of=${DATASTORE_BACKUP}/vmfs-header-${VMFS_DEVICE:5:3}.hex bs=512 count=4096 > /dev/null 2>&1 cp /vmfs/volumes/${UUID}/.vh.sf ${DATASTORE_BACKUP}/vmfs-metadata-${VMFS_DEVICE:5:3}-vh.sf.bu > /dev/null 2>&1 #rotate backups checkBackupRotation "${VMFS_HEADER_BACKUP}/${DATASTORE}" "${DATASTORE_BACKUP}" done # remove temp file rm "${VDF_OUTPUT}" exit 0