Skip to content

Commit

Permalink
Add support for shared disks
Browse files Browse the repository at this point in the history
  • Loading branch information
Denis Valitov committed Aug 19, 2020
1 parent cfd21ee commit 6e702e3
Showing 1 changed file with 59 additions and 23 deletions.
82 changes: 59 additions & 23 deletions run
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,8 @@ options:
-f, --force stop running VM
-c, --clean remove kernel and initramfs volumes after VM
shutdown
--shared using scsi disks as shared disk (The qcow2
format is also replaced with raw.) Work if -f is enabled.
-G, --gdb [HOST]:PORT Enable QEMU GDB stub via HOST:PORT
-k, --kopt PARAM pass a kernel option
-K, --keep don't shutdown VM immediately
Expand Down Expand Up @@ -225,6 +227,9 @@ parse_options(){
elif [ "$1" == "-K" -o "$1" == "--keep" ]; then
[ -t 1 ] && KOPT+=("ktest.keep")
shift
elif [ "$1" == "--shared" ]; then
SHARED=1
shift
elif [ "$1" == "--disable-kdump" ]; then
DISABLE_KDUMP=y
shift
Expand Down Expand Up @@ -259,6 +264,7 @@ parse_options(){
exit 1
fi

DISK_OWNER=$OWNER
KERNEL="${POSITIONAL[0]}"
[ -r "$KERNEL" ] || die "Can't read kernel: $KERNEL"
[ -n "$ENTRY_POINT" ] && KOPT+=("ktest.start=$ENTRY_POINT")
Expand Down Expand Up @@ -394,28 +400,52 @@ make_xml(){
local bus=scsi
((sidx++))
fi
xml ed --inplace \
-s //devices -t elem -n disk -v '' \
-a '//devices/disk[last()]' -t attr -n type -v volume \
-a '//devices/disk[last()]' -t attr -n device -v disk \
-s '//devices/disk[last()]' -t elem -n driver -v '' \
-a '//devices/disk[last()]/driver' -t attr -n name -v qemu \
-a '//devices/disk[last()]/driver' -t attr -n type -v "${v[2]}" \
-s '//devices/disk[last()]' -t elem -n source -v '' \
-a '//devices/disk[last()]/source' -t attr -n pool -v "$4" \
-a '//devices/disk[last()]/source' -t attr -n volume -v "${v[0]}" \
-s '//devices/disk[last()]' -t elem -n target -v '' \
-a '//devices/disk[last()]/target' -t attr -n bus -v $bus \
-a '//devices/disk[last()]/target' -t attr -n dev -v $dev \
"$xml"

if [ -n "$SHARED" ] && [ "$bus" == "scsi" ]; then
xml ed --inplace \
-s //devices -t elem -n disk -v '' \
-a '//devices/disk[last()]' -t attr -n type -v file \
-a '//devices/disk[last()]' -t attr -n device -v disk \
-a '//devices/disk[last()]' -t attr -n snapshot -v no \
-s '//devices/disk[last()]' -t elem -n driver -v '' \
-a '//devices/disk[last()]/driver' -t attr -n name -v qemu \
-a '//devices/disk[last()]/driver' -t attr -n type -v "${v[2]}" \
-a '//devices/disk[last()]/driver' -t attr -n cache -v writeback \
-a '//devices/disk[last()]/driver' -t attr -n error_policy -v stop \
-s '//devices/disk[last()]' -t elem -n source -v '' \
-a '//devices/disk[last()]/source' -t attr -n file -v /var/lib/libvirt/images/"${v[0]}" \
-s '//devices/disk[last()]' -t elem -n backingStore -v '' \
-s '//devices/disk[last()]' -t elem -n target -v '' \
-a '//devices/disk[last()]/target' -t attr -n bus -v $bus \
-a '//devices/disk[last()]/target' -t attr -n dev -v $dev \
-s '//devices/disk[last()]' -t elem -n shareable -v '' \
-s '//devices/disk[last()]' -t elem -n vendor -v 'YADRO' \
-s '//devices/disk[last()]' -t elem -n product -v 'shared_disk' \
"$xml"
else
xml ed --inplace \
-s //devices -t elem -n disk -v '' \
-a '//devices/disk[last()]' -t attr -n type -v volume \
-a '//devices/disk[last()]' -t attr -n device -v disk \
-s '//devices/disk[last()]' -t elem -n driver -v '' \
-a '//devices/disk[last()]/driver' -t attr -n name -v qemu \
-a '//devices/disk[last()]/driver' -t attr -n type -v "${v[2]}" \
-s '//devices/disk[last()]' -t elem -n source -v '' \
-a '//devices/disk[last()]/source' -t attr -n pool -v "$4" \
-a '//devices/disk[last()]/source' -t attr -n volume -v "${v[0]}" \
-s '//devices/disk[last()]' -t elem -n target -v '' \
-a '//devices/disk[last()]/target' -t attr -n bus -v $bus \
-a '//devices/disk[last()]/target' -t attr -n dev -v $dev \
"$xml"
fi

if [ "$bus" == "scsi" ]; then
xml ed --inplace \
-s '//devices/disk[last()]' -t elem -n address -v '' \
-a '//devices/disk[last()]/address' -t attr -n controller -v '0' \
-a '//devices/disk[last()]/address' -t attr -n type -v 'drive' \
-a '//devices/disk[last()]/address' -t attr -n unit -v $sidx \
"$xml"
xml ed --inplace \
-s '//devices/disk[last()]' -t elem -n address -v '' \
-a '//devices/disk[last()]/address' -t attr -n controller -v '0' \
-a '//devices/disk[last()]/address' -t attr -n type -v 'drive' \
-a '//devices/disk[last()]/address' -t attr -n unit -v $sidx \
"$xml"
fi

if [ -n "${v[4]}" ]; then
Expand Down Expand Up @@ -660,9 +690,15 @@ done

for d in "${DISKS[@]}"; do
IFS=':' read -ra disk <<< "$d"
disk_path="$USR_CACHE_DIR/$VMNAME/disk-${disk[0]}.qcow2"
log qemu-img create -f qcow2 "$disk_path" ${disk[2]}
VOLUMES+=("disk-${disk[0]}-$OWNER:$disk_path:qcow2:${disk[1]}:${disk[0]}")
if [ -n "$SHARED" ]; then
disk_path="$USR_CACHE_DIR/$VMNAME/disk-${disk[0]}.raw"
log qemu-img create -f raw "$disk_path" ${disk[2]}
VOLUMES+=("disk-${disk[0]}-$DISK_OWNER:$disk_path:raw:${disk[1]}:${disk[0]}")
else
disk_path="$USR_CACHE_DIR/$VMNAME/disk-${disk[0]}.qcow2"
log qemu-img create -f qcow2 "$disk_path" ${disk[2]}
VOLUMES+=("disk-${disk[0]}-$OWNER:$disk_path:qcow2:${disk[1]}:${disk[0]}")
fi
done

notify "Discover hypervisor..."
Expand Down

0 comments on commit 6e702e3

Please sign in to comment.