mirror of
https://github.com/OpenNebula/one.git
synced 2025-03-30 22:50:10 +03:00
Bug #1315: Support LVM DS migration
This commit is contained in:
parent
2e76908028
commit
ef912e65f6
@ -139,14 +139,14 @@ function exclusive
|
||||
( umask 0027; touch "${LOCK_FILE}" 2>/dev/null )
|
||||
|
||||
# open lockfile
|
||||
exec 2>/dev/null {FD}>"${LOCK_FILE}"
|
||||
{ exec {FD}>"${LOCK_FILE}"; } 2>/dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
log_error "Could not create or open lock ${LOCK_FILE}"
|
||||
exit -2
|
||||
fi
|
||||
|
||||
# acquire lock
|
||||
flock -w "${TIMEOUT}" "${FD}"
|
||||
flock -w "${TIMEOUT}" "${FD}" 2>/dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
log_error "Could not acquire exclusive lock on ${LOCK_FILE}"
|
||||
exit -2
|
||||
|
@ -29,14 +29,22 @@ DST=$2
|
||||
VMID=$3
|
||||
DSID=$4
|
||||
|
||||
#--------------------------------------------------------------------------------
|
||||
|
||||
if [ -z "${ONE_LOCATION}" ]; then
|
||||
TMCOMMON=/var/lib/one/remotes/tm/tm_common.sh
|
||||
LIB_LOCATION=/usr/lib/one
|
||||
else
|
||||
TMCOMMON=$ONE_LOCATION/var/remotes/tm/tm_common.sh
|
||||
LIB_LOCATION=$ONE_LOCATION/lib
|
||||
fi
|
||||
|
||||
DRIVER_PATH=$(dirname $0)
|
||||
|
||||
. $TMCOMMON
|
||||
|
||||
#--------------------------------------------------------------------------------
|
||||
|
||||
SRC=`fix_dir_slashes $SRC`
|
||||
DST=`fix_dir_slashes $DST`
|
||||
|
||||
@ -51,22 +59,90 @@ DST_DIR=`dirname $DST_PATH`
|
||||
SRC_DS_DIR=`dirname $SRC_PATH`
|
||||
SRC_VM_DIR=`basename $SRC_PATH`
|
||||
|
||||
SRC_DS_SYS_ID=$(echo $SRC_DS_DIR | $AWK -F '/' '{print $(NF-1)}')
|
||||
DST_DS_SYS_ID=$(echo $DST_DIR | $AWK -F '/' '{print $(NF-1)}')
|
||||
|
||||
# Activate the disk in the target host
|
||||
if [ `is_disk $DST_PATH` -eq 1 ]; then
|
||||
#---------------------------------------------------------------------------
|
||||
# Get Image information
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
DISK_ID=${SRC_VM_DIR##*.}
|
||||
|
||||
XPATH="${DRIVER_PATH}/../../datastore/xpath.rb --stdin"
|
||||
|
||||
unset i j XPATH_ELEMENTS
|
||||
|
||||
while IFS= read -r -d '' element; do
|
||||
XPATH_ELEMENTS[i++]="$element"
|
||||
done < <(onevm show -x $VMID | $XPATH \
|
||||
/VM/TEMPLATE/DISK[DISK_ID=$DISK_ID]/TYPE )
|
||||
|
||||
TYPE="${XPATH_ELEMENTS[j++]}"
|
||||
|
||||
####
|
||||
|
||||
if [ "${TYPE}" != "BLOCK" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
LV_NAME="lv-one-${VMID}-${DISK_ID}"
|
||||
SRC_VG_NAME="vg-one-${SRC_DS_SYS_ID}"
|
||||
SRC_DEV="/dev/${SRC_VG_NAME}/${LV_NAME}"
|
||||
DST_VG_NAME="vg-one-${DST_DS_SYS_ID}"
|
||||
DST_DEV="/dev/${DST_VG_NAME}/${LV_NAME}"
|
||||
|
||||
# copy volume between datastores
|
||||
if [ "${SRC_PATH}" != "${DST_PATH}" ]; then
|
||||
# create new volume
|
||||
CREATE_CMD=$(cat <<EOF
|
||||
set -e -o pipefail
|
||||
${SUDO} ${SYNC}
|
||||
${SUDO} ${LVSCAN}
|
||||
SIZE=\$(${SUDO} ${LVS} --noheadings --units B -o lv_size "${SRC_DEV}" | tr -d '[:blank:]')
|
||||
${SUDO} ${LVCREATE} --wipesignatures n -L"\${SIZE}" -n "${LV_NAME}" "${DST_VG_NAME}"
|
||||
EOF
|
||||
)
|
||||
|
||||
LOCK="tm-fs_lvm-${DST_DS_SYS_ID}.lock"
|
||||
exclusive "${LOCK}" 120 ssh_exec_and_log "${SRC_HOST}" "${CREATE_CMD}" \
|
||||
"Error creating LV named ${LV_NAME}"
|
||||
|
||||
# copy volume data
|
||||
ssh_exec_and_log "$SRC_HOST" \
|
||||
"${DD} if=${SRC_DEV} of=${DST_DEV} bs=64k" \
|
||||
"Error copying ${SRC} to ${DST}"
|
||||
|
||||
# delete old volume and update device symlinks
|
||||
DELETE_CMD=$(cat <<EOF
|
||||
${SUDO} ${LVREMOVE} -f ${SRC_DEV}
|
||||
${SUDO} ${SYNC}
|
||||
|
||||
rm -f "${SRC_PATH}"
|
||||
ln -s "${DST_DEV}" "${SRC_PATH}"
|
||||
EOF
|
||||
)
|
||||
|
||||
LOCK="tm-fs_lvm-${SRC_DS_SYS_ID}.lock"
|
||||
exclusive "${LOCK}" 120 ssh_exec_and_log "${SRC_HOST}" "${DELETE_CMD}" \
|
||||
"Error dumping ${SRC} to ${DST}"
|
||||
fi
|
||||
|
||||
# activate
|
||||
CMD=$(cat <<EOF
|
||||
set -ex -o pipefail
|
||||
if [ -L "$DST_PATH" ]; then
|
||||
DEVICE=\$(readlink "$DST_PATH")
|
||||
$SUDO $SYNC
|
||||
$SUDO $LVSCAN
|
||||
$SUDO $LVCHANGE -ay \$DEVICE
|
||||
fi
|
||||
${SUDO} ${SYNC}
|
||||
${SUDO} ${LVSCAN}
|
||||
${SUDO} ${LVCHANGE} -ay "${DST_DEV}"
|
||||
|
||||
hostname -f >"${DST_DIR}/.host" || :
|
||||
EOF
|
||||
)
|
||||
ssh_exec_and_log "$DST_HOST" "$CMD" \
|
||||
"Error activating disk $DST_PATH"
|
||||
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Return if the target path is the same as the source path. No need to move
|
||||
|
Loading…
x
Reference in New Issue
Block a user