X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=virt-p2v.sh;h=2bc82a492ada752703b775bc0575988777102cb8;hb=52433696d9755eb0e6cc5caa0f35b6690ace67fd;hp=ab62404aff1602db4a73efeb4e2cdcad4a03d3f9;hpb=73f18e249d542d8c2d406565b0690d7c47194100;p=virt-p2v.git diff --git a/virt-p2v.sh b/virt-p2v.sh index ab62404..2bc82a4 100755 --- a/virt-p2v.sh +++ b/virt-p2v.sh @@ -6,9 +6,27 @@ # Copyright (C) 2007 Red Hat Inc. # Written by Richard W.M. Jones # +# 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. +# +# 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. +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# # $Id$ +# Because we're running from a start-up script, we don't have much +# of a login environment, so set one up. export PATH=/usr/sbin:/sbin:/usr/local/bin:/usr/kerberos/bin:/usr/bin:/bin +export HOME=/root +export LOGNAME=root # The defaults here make a generic virt-p2v.sh script, but if you want # to build a partially-/fully-automatic P2V solution, then you can set @@ -44,12 +62,27 @@ override_root_filesystem="" override_network="" #---------------------------------------------------------------------- -# Logging. +# General script setup and logging. + +exec 2>> /tmp/virt-p2v.log function log { - echo "$@" >> /tmp/virt-p2v.log + echo "$@" 1>&2 } +log +log virt-p2v starting up at `date` + +# The first and only parameter must be the tty. Connect +# stdin/stdout to this device. +if [ -n "$1" ]; then + log connecting to /dev/$1 + exec /dev/$1 +fi + +# We can safely write files into /tmp without modifying anything. +cd /tmp + #---------------------------------------------------------------------- # Helper functions. @@ -82,12 +115,12 @@ function word_in_list { # Use the function read_line instead of the shell built-in read. # It reads from the console. function read_line { - read "$*" /dev/console 2>&1 + PS1='\u@\h:\w\$ ' bash } #---------------------------------------------------------------------- @@ -151,7 +184,17 @@ function device_of_lvs_device { # Get list of physical block devices. Sets variable $devices # to something like "sda sdb". function search_devices { - devices=$(cd /sys/block && /bin/ls -d [hs]d*) + devices1=$(cd /sys/block && /bin/ls -d [hs]d*) + log search_devices: devices1: $devices1 + # Ignore devices which fail 'blockdev --getsize' - probably + # removable devices or other strange ones. + devices="" + for d in $devices1; do + if blockdev --getsize /dev/$d > /dev/null; then + devices="$devices${devices:+ }$d" + fi + done + log search_devices: devices: $devices } # Get list of partitions from a physical block device. Sets @@ -233,10 +276,17 @@ function search_parts { # $parts is returned. } +# This generates a snapshot device name from a device name. +# eg. sda -> snap_sda +# Sets $dname. +function snap_name { + dname=`echo -n snap_"$1" | tr -cs '[:alnum:]' _` +} + #---------------------------------------------------------------------- # Network configuration functions. -# `auto_network $fs' tries to configure the network from the +# `auto_network' tries to configure the network from the # root filesystem. Returns true or false. function auto_network { # Make sure this file exists, otherwise Fedora gives a warning. @@ -272,7 +322,7 @@ function auto_network { echo "(Hint: if not sure, there is a shell on console [ALT] [F2])" echo -n " (y/n) " local line - read_line line /mnt/root/etc/fstab +#---------------------------------------------------------------------- +# XXX Look for other files which might need to be changed here ... +# We've now finished with /mnt/root (the real root filesystem), +# so unmount it and synch everything. +umount /mnt/root +sync + +#---------------------------------------------------------------------- +# Send the device snapshots (underlying device + changes in ramdisk) +# to the remote server. + +log sending disks + +# XXX Effectively this is using the hostname derived from network +# configuration, but we might want to ask the user instead. +# XXX How do we ensure that we won't overwrite target files? Currently +# tries to use the current date as a uniquifier. + +# Names will be something like +# p2v-oirase-200709011249-hda.img +basename=p2v-`hostname -s|tr -cd '[0-9a-zA-Z]'`-`date +'%Y%m%d%H%M'` + +for dev in $devices_to_send; do + rdev=`echo $dev | sed 's|^sd|hd|'` + name="$basename-$rdev.img" + log sending $dev to $name + + snap_name $dev + + sectors=`blockdev --getsize /dev/mapper/$dname` + + gigs=$(($sectors/2/1024/1024)) + echo "Sending /dev/$dev (${gigs} GB) to remote machine" + + dd if=/dev/mapper/$dname | gzip --best | + case "$remote_transport" in + ssh) + ssh -p "$remote_port" "$remote_host" \ + "zcat > $remote_directory/$name" + ;; + tcp) + echo "p2v $name $sectors" > header + echo > newline + cat header - newline | nc "$remote_host" "$remote_port" + ;; + esac +done + + #---------------------------------------------------------------------- # Clean up. -umount /mnt/root -drop_snapshot snap +#for d in $devices_to_send; do +# snap_name $d +# kpartx -d /dev/mapper/$dname +# drop_snapshot $dname +#done # This file must end with a newline