summaryrefslogtreecommitdiffstats
path: root/core/modules/vbox-src/data/opt/openslx/vmchooser/plugins/virtualbox/includes/finalize_machine_config.inc
blob: 5b672f028f0032e2bbdf91a73f117a90a5bcefd4 (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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
################################################################################
# Include: write final machine configuration file                              #
################################################################################

setup_disk_image() {
	# set disk image path and uuid
	set_attr \
		"/VirtualBox/Machine/MediaRegistry/HardDisks/HardDisk" \
		"location" "${VBOX_HDD_LINK}"
	set_attr \
		"/VirtualBox/Machine/MediaRegistry/HardDisks/HardDisk" \
		"uuid" "{${HDD_UUID}}"
	
	if isset SNAPSHOT_UUID; then
		# read-only mode, add snapshot to main disk
		add_node \
			"/VirtualBox/Machine/MediaRegistry/HardDisks/HardDisk" "HardDisk" \
			"uuid={${SNAPSHOT_UUID}}" \
			"location=$VBOX_SNAPSHOT_DIR/{${SNAPSHOT_UUID}}.vdi" \
			"format=VDI" \
			"type=Normal"

		# set snapshot dir
		set_attr "/VirtualBox/Machine" "snapshotFolder" "${VBOX_SNAPSHOT_DIR}"
	fi

	# "attach" VBOX_HDD_UUID (either the snapshot's or the disk's)
	# NOTE: exactly one <AttachedDevice> node should be present in the downloaded xml
	set_attr \
		"/VirtualBox/Machine/StorageControllers/StorageController/AttachedDevice/Image" \
		"uuid" "{${VBOX_HDD_UUID}}"
}

setup_floppies() {
	# add storage controller and 2 floppies to it
	if ! node_exists '/VirtualBox/Machine/StorageControllers/StorageController[@name="Floppy"]'; then
		add_node \
			"/VirtualBox/Machine/StorageControllers" "StorageController" \
			"name=Floppy" \
			"type=I82078" \
			"PortCount=1" \
			"useHostIOCache=true"
	fi
	add_node \
		'/VirtualBox/Machine/StorageControllers/StorageController[@name="Floppy"]' "AttachedDevice" \
		"type=Floppy" \
		"hotpluggable=false" \
		"port=0" \
		"device=0"
	if notempty FLOPPY_0; then
		add_node \
			'/VirtualBox/Machine/StorageControllers/StorageController[@name="Floppy"]/AttachedDevice[@device="0"]' \
			"HostDrive" \
			"src=${FLOPPY_0}"
	fi
	add_node \
		'/VirtualBox/Machine/StorageControllers/StorageController[@name="Floppy"]' "AttachedDevice" \
		"type=Floppy" \
		"hotpluggable=false" \
		"port=0" \
		"device=1"

	# add the slx floppy to the second drive
	add_node \
		'/VirtualBox/Machine/StorageControllers/StorageController/AttachedDevice[@device="1"]' "Image" \
		"uuid={${SLX_FLOPPY_UUID}}"
}

setup_optical_drives() {
	if isempty CDROM_0 && isempty CDROM_1; then
		writelog "No host CD-ROM detected."
		return 1
	fi
	local controller='StorageController[@type="AHCI"]'
	local devnum=1
	if node_exists '/VirtualBox/Machine/StorageControllers/'"$controller"; then
		# TODO validating port count...
		writelog "AHCI controller found, will add CDROMs to it."
	else
		writelog "Adding SATA controller for CDROMs."
		add_node \
			"/VirtualBox/Machine/StorageControllers" "StorageController" \
			"name=SATA-CDROM" \
			"type=AHCI" \
			"PortCount=1" \
			"useHostIOCache=true"
		controller='StorageController[@name="SATA-CDROM"]'
		devnum=0
	fi
	# now add the devices
	for cdrom in $CDROM_0 $CDROM_1; do
		writelog "Adding passthrough CDROM"
		add_node \
			'/VirtualBox/Machine/StorageControllers/'"$controller" "AttachedDevice" \
			"type=DVD" \
			"passthrough=true" \
			"hotpluggable=false" \
			"port=1" \
			"device=$devnum"
		(( devnum ++ ))
		add_node \
			'/VirtualBox/Machine/StorageControllers/'"$controller"'/AttachedDevice[@type="DVD"]' "HostDrive" \
			"src=${cdrom}"
	done
}

setup_shared_folders() {
	# TODO common share through shared folders?
	if isempty SHARED_FOLDERS HOME_SHARE_NAME HOME_SHARE_PATH; then
		writelog "Missing information to setup shared folders."
		return 1
	fi
	add_node \
		"/VirtualBox/Machine/Hardware/SharedFolders" "SharedFolder" \
		"name=${HOME_SHARE_NAME}" \
		"hostPath=${HOME_SHARE_PATH}" \
		"writable=true" \
		"autoMount=true"
}

setup_ethernet() {
	# remove ':' from MAC address and set it to the main network adapter
	VM_MAC_ADDR="$(sed 's/://g' <<< ${VM_MAC_ADDR})"
	set_attr "/VirtualBox/Machine/Hardware/Network/Adapter" "MACAddress" "${VM_MAC_ADDR}"

	# TODO bridge other nics
}

setup_cpu_ram() {
	# set vm's memory
	set_attr "/VirtualBox/Machine/Hardware/Memory" "RAMSize" "${VM_MEM}"

	# Shouldn't be needed / should be set do "Default" anyways which does
	# the right thing depending on guest
	#set_attr "/VirtualBox/Machine/Hardware/Paravirt" "provider" "KVM"
	# Let vbox config decide about PAE etc.
	# (PAE is true by default on 64 bit hosts anyways)

	# But explicitly disable acceleration if KVM is not available
	local kvm="false"
	local nested="false"
	local cores="1"
	local ioapic="false"
	if source /run/hwinfo && [ "${HW_KVM}" = "ENABLED" ]; then
		ioapic="true"
		kvm="true"
		cores="$CPU_CORES"
		# KVM is there -- all good, but check for NPT/EPT
		if detect_cpu_flag "npt" || detect_cpu_flag "ept"; then
			nested="true"
		fi
	fi
	set_attr "/VirtualBox/Machine/Hardware/CPU/HardwareVirtEx" "enabled" "$kvm"
	set_attr "/VirtualBox/Machine/Hardware/CPU/HardwareVirtExNestedPaging" "enabled" "$nested"

	# set cpu cores and features
	set_attr "/VirtualBox/Machine/Hardware/CPU" "count" "$cores"

	# activate IOAPIC needed for SMP, but disable for no VT-x machines
	set_attr "/VirtualBox/Machine/Hardware/BIOS/IOAPIC" "enabled" "$ioapic"

	# Don't enable this since it's off by default on Linux due to performance concerns
	# See src/VBox/Main/xml/Settings.cpp Hardware::Hardware()
	# Maybe even explicitly disable this in case the VM was created on 64Bit Windows?
	#set_attr "/VirtualBox/Machine/Hardware/CPU/HardwareVirtExLargePages" "enabled" "${PSE_SUPPORT}"
}

setup_usb() {
	# In case a VBox with USB 3.0 configured doesn't have working USB on
	# machines without a USB 3.0 controller, downgrade to 2.0, but otherwise,
	# USB speed is now dicated via the downloaded VM config
	add_node "/VirtualBox/Machine/Hardware/USB" "DevicesFilters"
	local count=1
	while read -r vendor product stuff; do
		add_node "/VirtualBox/Machine/Hardware/USB/DeviceFilters" "DeviceFilter" \
			"name=filter$count" \
			"active=true" \
			"vendorId=$vendor" \
			"productId=$product"
		(( count++ ))
	done < <(get_usb_devices '%VENDOR% %PRODUCT%')
}

setup_sound() {
	# force ALSA driver for now and change when others become available
	set_attr "/VirtualBox/Machine/Hardware/AudioAdapter" "driver" "ALSA"
}

finalize_machine_config() {

	# set the generated machine uuid
	set_attr "/VirtualBox/Machine" "uuid" "{${MACHINE_UUID}}"
	setup_usb
	setup_disk_image
	setup_floppies
	setup_optical_drives
	setup_ethernet
	setup_cpu_ram
	setup_sound
	notempty VBOX_SHARED_FOLDERS && setup_shared_folders

	if ! cp -p "$TMPCONFIG" "$VBOX_MACHINE_CONFIG"; then
		writelog "Could not copy '$TMPCONFIG' to '$VBOX_MACHINE_CONFIG'!"
	fi
}

call_post_source finalize_machine_config