#!/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 if [ "$IMAGE_TYPE" = custom ]; then image_file=/dev/null image_size=\ $("$CURL" -sI "$IMAGE_NAME" | grep ^Content-Length: | cut -d" " -f2) else image_file="$IMAGE_DIR/$IMAGE_NAME-$ARCH.$IMAGE_TYPE" image_size="$(stat -L -c %s "$image_file")" fi 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 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 case "$IMAGE_TYPE" in ntfsdump|extdump) # Create partitions format_disk0 "$blockdev" "$IMAGE_TYPE" # Install a new MBR "$INSTALL_MBR" -p 1 -i n "$blockdev" target="$(map_disk0 "$blockdev")-1" #the root device add_cleanup unmap_disk0 "$blockdev" snf_export_PROPERTY_ROOT_PARTITION=1 ;; diskdump|custom) target="$blockdev" ;; esac if [ "$IMAGE_TYPE" = "custom" ]; then "$CURL" "$IMAGE_NAME" 2>/dev/null |\ $monitor dd bs=4M of="$target" oflag=direct else # 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="$target" oflag=direct fi # 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" snf_export_PROPERTIES="$IMG_PROPERTIES" 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" echo "$(date +%Y:%m:%d-%H:%M:%S.%N) Starting helper VM..." "$TIMELIMIT" -t "$HELPER_SOFT_TIMEOUT" -T "$HELPER_HARD_TIMEOUT" \ kvm -runas "$HELPER_USER" -drive file="$snapshot" \ -drive file="$blockdev",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 snf_image_activate_helper" \ 2>&1 | sed 's|^|HELPER: |g' echo "$(date +%Y:%m:%d-%H:%M:%S.%N) Helper VM finished." 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" | head -1) if [ "x$result" != "xSUCCESS" ]; then log_error "Helper VM returned error" exit 1 fi # Execute cleanups cleanup trap - EXIT exit 0 # vim: set sta sts=4 shiftwidth=4 sw=4 et ai :