blob: b15015ee68d2181586d656be0991ab50a986fb1b (
plain) (
tree)
|
|
# -----------------------------------------------------------------------------
#
# Copyright (c) 2009..2021 bwLehrpool-Projektteam
#
# This program/file is free software distributed under the GPL version 2.
# See https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
#
# If you have any feedback please consult https://bwlehrpool.de and
# send your feedback to support@bwlehrpool.de.
#
# General information about bwLehrpool can be found at https://bwlehrpool.de
#
# -----------------------------------------------------------------------------
# run-virt.include
# - qemu plugin for vmchooser run-virt
################################################################################
# BASH_SOURCE[0] contains the file being sourced, namely this one
declare -rg QEMU_PLUGIN_DIR="$(dirname "${BASH_SOURCE[0]}")"
declare -rg QEMU_INCLUDE_DIR="${QEMU_PLUGIN_DIR}/includes"
# Define which features the QEMU plugin supports
declare -rg PLUGIN_FEATURES="firewall printer usb slxfloppy sound netshares"
run_plugin() {
# include kernel command line utils and functions
$(safesource "${QEMU_INCLUDE_DIR}/kernel-cmdln.inc")
# include PCI passthrough utils and functions
$(safesource "${QEMU_INCLUDE_DIR}/passthrough-pci.inc")
# include mediated device passthrough utils and functions
$(safesource "${QEMU_INCLUDE_DIR}/passthrough-mdev.inc")
# setup RW image access for operation
local vm_diskfile
if notempty VM_DISKFILE_RO; then
# create copy-on-write layer for readonly image
vm_diskfile="${TMPDIR}/$(basename ${VM_DISKFILE_RO}).cow.qcow2"
local vm_diskfile_type="$(qemu-img info --output=json ${VM_DISKFILE_RO} | jq -r '.format')"
qemu-img create -F "${vm_diskfile_type}" -b "${VM_DISKFILE_RO}" -f qcow2 "${vm_diskfile}"
elif notempty VM_DISKFILE_RW; then
# use supplied RW disk image from run-virt
vm_diskfile="${VM_DISKFILE_RW}"
fi
# setup GPU passthrough and obtain PCI addresses and IDs if passthrough is enabled
pt_gpu_pci_ids=($(passthrough_pci_setup))
if [ "${?}" -ne 0 ]; then
writelog "Failed to set up PCI devices for GPU passthrough!"
fi
# setup GPU mediated device passthrough and obtain mediated device address
pt_gpu_mdev_id="$(passthrough_mdev_setup)"
if [ "${?}" -ne 0 ]; then
writelog "Failed to set up mediated device (Intel GVT-g) for GPU passthrough!"
fi
# set path to QEMU firmware specification files
local firmware_path="/usr/share/qemu/firmware"
# set debug related options
if [ "${DEBUG}" = "true" ]; then
# write finalized config in debug mode to temporary folder for debugging purposes
local vm_final_config="/tmp/qemu-last-config.xml"
# set configuration for virt-manager
local GSETTINGS_SCHEMA_NAME_PREFIX="org.virt-manager.virt-manager"
local GSETTINGS_SCHEMA_PATH_PREFIX="/org/virt-manager/virt-manager"
# per VM relocatable virt-manager settings
# scale a VM's output in fullscreen to fit the virt-manager's console size
gsettings set "${GSETTINGS_SCHEMA_NAME_PREFIX}.vm:${GSETTINGS_SCHEMA_PATH_PREFIX}/vm/" "scaling" "1"
# automatic resize of VM resolution to virt-manager's console resolution
gsettings set "${GSETTINGS_SCHEMA_NAME_PREFIX}.vm:${GSETTINGS_SCHEMA_PATH_PREFIX}/vm/" "resize-guest" "1"
fi
# set device passthrough debug mode
local debug_pth="false"
# Use cat here instead of redirect because of globbing
local cputhreads
cputhreads="$( cat /sys/devices/system/cpu/cpu*/topology/core_cpus_list | awk '!a[$1]{if(b)printf";";printf $1;a[$1]=1;b=1}' )"
# Try legacy name
[ -z "$cputhreads" ] && cputhreads="$( cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | awk '!a[$1]{if(b)printf";";printf $1;a[$1]=1;b=1}' )"
# call the Libvirt Java tool to finalize configuration and start VM
declare -rg VIRTCMD="java"
VIRTCMDOPTS=( "-jar" "${QEMU_PLUGIN_DIR}/runvirt-plugin-qemu.jar" )
notempty DEBUG && VIRTCMDOPTS+=( "-debug" "${DEBUG}" )
notempty debug_pth && VIRTCMDOPTS+=( "-debugpth" "${debug_pth}" )
notempty firmware_path && VIRTCMDOPTS+=( "-firmware" "${firmware_path}" )
notempty VM_CLEANNAME && VIRTCMDOPTS+=( "-vmname" "${VM_CLEANNAME}" )
notempty VM_DISPLAYNAME && VIRTCMDOPTS+=( "-vmdsplname" "${VM_DISPLAYNAME}" )
notempty VM_OS_TYPE && VIRTCMDOPTS+=( "-vmos" "${VM_OS_TYPE}" )
notempty TMPCONFIG && VIRTCMDOPTS+=( "-vmcfginp" "${TMPCONFIG}" )
notempty vm_final_config && VIRTCMDOPTS+=( "-vmcfgout" "${vm_final_config}" )
notempty IMGUUID && VIRTCMDOPTS+=( "-vmuuid" "${IMGUUID}" )
if notempty cputhreads; then
VIRTCMDOPTS+=( "-cputopo" "${cputhreads}" )
elif notempty HW_THREADS; then
VIRTCMDOPTS+=( "-vmncpus" "${HW_THREADS}" )
fi
notempty VM_MEM && VIRTCMDOPTS+=( "-vmmem" "${VM_MEM}" )
notempty VM_MAC_ADDR && VIRTCMDOPTS+=( "-vmmac0" "${VM_MAC_ADDR}" )
notempty vm_diskfile && VIRTCMDOPTS+=( "-vmhdd0" "${vm_diskfile}" )
VIRTCMDOPTS+=( "-vmfloppy0" "${FLOPPY_0}" )
notempty SLX_FLOPPY_IMG && VIRTCMDOPTS+=( "-vmfloppy1" "${SLX_FLOPPY_IMG}" )
notempty CDROM_0 && VIRTCMDOPTS+=( "-vmcdrom0" "${CDROM_0}" )
notempty CDROM_1 && VIRTCMDOPTS+=( "-vmcdrom1" "${CDROM_1}" )
notempty SERIAL0 && [ -w "${SERIAL0}" ] \
&& VIRTCMDOPTS+=( "-vmserial0" "${SERIAL0}" )
notempty PARALLEL0 && [ -w "${PARALLEL0}" ] \
&& VIRTCMDOPTS+=( "-vmparallel0" "${PARALLEL0}" )
notempty pt_gpu_mdev_id && VIRTCMDOPTS+=( "-vmilmdevid0" "${pt_gpu_mdev_id}" )
if $DEBUG; then
VIRTCMDOPTS+=( "-xmledit" )
fi
if [ "${SHARE_REMAP_MODE}" -gt 1 ]; then
notempty HOME_SHARE_PATH && VIRTCMDOPTS+=( "-vmfssrc0" "${HOME_SHARE_PATH}" )
notempty HOME_SHARE_NAME && VIRTCMDOPTS+=( "-vmfstgt0" "${HOME_SHARE_NAME}" )
notempty COMMON_SHARE_PATH && VIRTCMDOPTS+=( "-vmfssrc1" "${COMMON_SHARE_PATH}" )
notempty COMMON_SHARE_NAME && VIRTCMDOPTS+=( "-vmfstgt1" "${COMMON_SHARE_NAME}" )
fi
if notempty pt_gpu_pci_ids; then
for pt_gpu_pci_id in "${pt_gpu_pci_ids[@]}"; do
VIRTCMDOPTS+=( "-vmnvgpuids0" "${pt_gpu_pci_id}" )
done
fi
}
|