summaryrefslogtreecommitdiffstats
path: root/core/modules/qemu/data/opt/openslx/scripts/systemd-qemu_env
blob: ffa54ce1a9fd36de6e95a0230b6a0eabafbd22d2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/bin/bash
# -----------------------------------------------------------------------------
#
# Copyright (c) 2017..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
#
# -----------------------------------------------------------------------------
# systemd-qemu_env
#    - This is the preparation script for the configuration of QEMU on Linux.
################################################################################

#
# load general KVM module
#
modprobe "kvm" || slxlog "qemu" "Could not load 'kvm' kernel modul!"

#
# load CPU specific KVM implementation
#
virt=$(egrep -m1 -w '^flags[[:blank:]]*:' /proc/cpuinfo | egrep -wo '(vmx|svm)') || true

if [ "${virt}" = "vmx" ]; then
	kmod="kvm_intel"
elif [ "${virt}" = "svm" ]; then
	kmod="kvm_amd"
else
	slxlog "qemu" "CPU does not support KVM extensions!"
	exit 1
fi

modprobe "${kmod}" || slxlog "qemu" "Could not load '${kmod}' kernel modul!"

#
# check that the KVM exposed device exists
#
if [ ! -e /dev/kvm ]; then
	slxlog "qemu" "/dev/kvm not found! Missing kvm kernel module(s)?"
	exit 1
fi

#
# create and setup Intel GVT-g mediated device instance for passthrough if Intel GVT-g is enabled
#
source /opt/openslx/vmchooser/plugins/qemukvm/includes/kernel-cmdln.inc
source /opt/openslx/vmchooser/plugins/qemukvm/includes/passthrough-mdev.inc

if passthrough_mdev_enabled; then
	# check if passthrough is configured properly
	if ! passthrough_mdev_check; then
		slxlog "qemu" "mediated device passthrough is enabled but not setup properly!"
		exit 2;
	fi

	# load required kernel modules for mediated device passthrough
	modprobe "vfio-mdev" || { slxlog "qemu" "Could not load 'vfio-mdev' kernel modul!"; exit 3; }
	modprobe "kvmgt" || { slxlog "qemu" "Could not load 'kvmgt' kernel modul!"; exit 4; }

	# get Intel integrated GPU mediated device for passthrough
	local pt_mdev_device="$(passthrough_mdev_device_get_intel_igd)"
	if [ -z "${pt_mdev_device}" ]; then
		slxlog "qemu" "Could find any Intel integrated GPU with mediated device (Intel GVT-g) support!"
		exit 5;
	fi

	# get Intel GVT-g mediated device instance type
	local pt_mdev_device_type="$(passthrough_mdev_type_get "${pt_mdev_device}")"
	if [ -z "${pt_mdev_device_type}" ]; then
		slxlog "qemu" "Could obtain the mediated device instance type of the Intel integrated GPU (${pt_mdev_device})"
		exit 6;
	fi

	# generate UUID for Intel GVT-g mediated device instance
	local pt_mdev_uuid="$(uuidgen)"

	# create Intel GVT-g mediated device instance
	passthrough_mdev_instance_create "${pt_mdev_device}" "${pt_mdev_device_type}" "${pt_mdev_uuid}"
	if [ "${?}" -eq 0 ]; then
		slxlog "qemu" "Successfully created Intel GVT-g mediated device instance (${pt_mdev_uuid})"
	else
		slxlog "qemu" "Failed to create Intel GVT-g mediated device instance!"
	fi
fi