X-Git-Url: https://code.grnet.gr/git/snf-image/blobdiff_plain/456b77f1a75bc7572fbef694b1bda4870d66668c..725a0f88e8733fb8a84abb7ee9b08b45e8a8edf7:/snf-image-host/create diff --git a/snf-image-host/create b/snf-image-host/create index 83dbf4c..9c063ac 100755 --- a/snf-image-host/create +++ b/snf-image-host/create @@ -1,33 +1,21 @@ #!/bin/bash -# Copyright 2011 GRNET S.A. All rights reserved. +# Copyright (C) 2011 GRNET S.A. # -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. # -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. # -# 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. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. set -e set -o pipefail @@ -36,15 +24,14 @@ set -o pipefail 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 [ "$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.$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." @@ -53,8 +40,7 @@ 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") \ + monitor="$PROGRESS_MONITOR \ -i $(printf "%q" "$INSTANCE_NAME") -r $image_size" fi @@ -62,22 +48,42 @@ fi # This is needed for file disks. if [ ! -b "$blockdev" ]; then original_blockdev="$blockdev" - blockdev=$("$LOSETUP" -sf "$blockdev") - add_cleanup "$LOSETUP" -d "$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" +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 + if [ "$IMAGE_TYPE" = "ntfsdump" ]; then + snf_export_PROPERTY_OSFAMILY="windows" + else + snf_export_PROPERTY_OSFAMILY="linux" + fi + ;; + diskdump|custom) + target="$blockdev" + ;; +esac -# 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 +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) @@ -87,6 +93,9 @@ snf_export_DEV=/dev/vda snf_export_TYPE="$IMG_FORMAT" snf_export_PASSWORD="$IMG_PASSWD" snf_export_HOSTNAME="$instance" +if [ -n "$IMG_PROPERTIES" ]; then + snf_export_PROPERTIES="$IMG_PROPERTIES" +fi if [ -n "$IMG_PERSONALITY" ]; then snf_export_PERSONALITY="$IMG_PERSONALITY" fi @@ -102,14 +111,16 @@ add_cleanup rm "$snapshot" "$QEMU_IMG" create -f qcow2 -b "$HELPER_IMG" "$snapshot" -"$TIMELIMIT" -t "$HELPER_SOFT_TIMEOUT" -T "$HELPER_HARD_TIMEOUT" \ +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="$root_dev",format=raw,if=virtio,cache=none \ + -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 @@ -126,9 +137,6 @@ if [ "x$result" != "xSUCCESS" ]; then exit 1 fi -# Install a new MBR -"$INSTALL_MBR" -p 1 -i n "$blockdev" - # Execute cleanups cleanup trap - EXIT