#!/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 set -o pipefail . 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="$(printf "%q" "$PROGRESS_MONITOR") \ -i $(printf "%q" "$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") add_cleanup "$LOSETUP" -d "$blockdev" fi format_disk0 "$blockdev" "$IMAGE_TYPE" filesystem_dev=$(map_disk0 "$blockdev") add_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.XXXXXX) add_cleanup rm "$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.XXXXXX) add_cleanup rm "$result_file" snapshot=$(mktemp --tmpdir helperXXXXXX.img) add_cleanup rm "$snapshot" "$QEMU_IMG" create -f qcow2 -b "$HELPER_IMG" "$snapshot" "$TIMELIMIT" -t "$HELPER_SOFT_TIMEOUT" -T "$HELPER_HARD_TIMEOUT" \ kvm -runas "$HELPER_USER" -drive file="$snapshot" \ -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 \ -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 :