#!/bin/bash # Copyright 2011 GRNET S.A. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # The views and conclusions contained in the software and documentation are # those of the authors and should not be interpreted as representing official # policies, either expressed or implied, of GRNET S.A. set -e . common.sh ganeti_os_main case "$IMAGE_TYPE" in extdump) IMAGE_FILE="${IMAGE_DIR}/${IMAGE_NAME}-${ARCH}.extdump";; ntfsdump) IMAGE_FILE="${IMAGE_DIR}/${IMAGE_NAME}-${ARCH}.ntfsdump";; *) log_error "Unknown image type: \`$IMAGE_TYPE'."; exit 1 esac if [ ! -e "$IMAGE_FILE" ]; then log_error "Image file \`$IMAGE_FILE' does not exit." exit 1 fi MONITOR="" #Empty if progress monitor support is disabled if [ "$progress_monitor_support" = "yes" ]; then IMAGE_SIZE="$(stat -L -c %s ${IMAGE_FILE})" MONITOR="$PROGRESS_MONITOR -i ${INSTANCE_NAME} -r ${IMAGE_SIZE}" fi # If the target device is not a real block device we'll first losetup it. # This is needed for file disks. if [ ! -b $blockdev ]; then ORIGINAL_BLOCKDEV=$blockdev blockdev=$($LOSETUP -sf $blockdev) CLEANUP+=("$LOSETUP -d $blockdev") fi format_disk0 $blockdev ${IMAGE_TYPE} filesystem_dev=$(map_disk0 $blockdev) CLEANUP+=("unmap_disk0 $blockdev") root_dev="${filesystem_dev}-1" # dd the dump to its new home :-) # Deploying an image file on a target block device is a streaming # copy operation. Enable the direct I/O flag on the output fd to # avoid polluting the host cache with useless data. $MONITOR dd bs=4M if=$IMAGE_FILE of=$root_dev oflag=direct # Create a floppy image floppy=$(mktemp --tmpdir floppy.XXXXXXXX) CLEANUP+=("rm -f $floppy") snf_export_DEV=/dev/vda snf_export_TYPE=${IMG_FORMAT} snf_export_PASSWORD=${IMG_PASSWD} snf_export_HOSTNAME=${instance} if [ -n "$IMG_PERSONALITY" ]; then snf_export_PERSONALITY=${IMG_PERSONALITY} fi create_floppy $floppy # Invoke the helper vm to do the dirty job... result_file=$(mktemp --tmpdir result.XXXXXXXX) CLEANUP+=("rm -f $result_file") $TIMELIMIT -t $HELPER_SOFT_TIMEOUT -T $HELPER_HARD_TIMEOUT \ kvm -runas $HELPER_USER -drive file=${HELPER_IMG},snapshot=on \ -drive file=$root_dev,format=raw,if=virtio,cache=none \ -boot c -serial stdio -serial file:$result_file -fda $floppy \ -vga none -nographic -parallel none -monitor null -nographic \ -kernel ${HELPER_KERNEL} -initrd ${HELPER_INITRD} \ -append "quiet ro root=/dev/sda1 console=ttyS0,9600n8" \ 2>&1 | sed 's|^|HELPER: |g' if [ $? -ne 0 ]; then if [ $? -gt 128 ]; then log_error "Helper was terminated. Did not finish on time." fi exit 1 fi # Read the first line. This will remove \r and \n chars result=$(sed 's|\r||g' $result_file | xargs echo) if [ "x$result" != "xSUCCESS" ]; then log_error "Helper VM returned error" exit 1 fi # Install a new MBR $INSTALL_MBR -p 1 -i n ${blockdev} # Execute cleanups cleanup trap - EXIT exit 0 # vim: set sta sts=4 shiftwidth=4 sw=4 et ai :