blob: 07f7e170e775df8980547cd0e16ba88c40ed81c6 (
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
|
################################################################################
# Include: write final machine configuration file #
################################################################################
setup_disk_image() {
# set read-only 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}}"
# add a HardDisk node for the snapshot
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}"
# set snapshot uuid
# there should only be exactly one <AttachedDevice> node from the xml
# retrieved from the server
set_attr \
"/VirtualBox/Machine/StorageControllers/StorageController/AttachedDevice/Image" \
"uuid" "{${SNAPSHOT_UUID}}"
}
setup_floppies() {
# add storage controller and 2 floppies to it
add_node \
"/VirtualBox/Machine/StorageControllers" "StorageController" \
"name=Floppy" \
"type=I82078" \
"PortCount=1" \
"useHostIOCache=true"
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}"
# set cpu cores and features
set_attr "/VirtualBox/Machine/Hardware/CPU" "count" "${CPU_CORES}"
# check if KVM is available and activate it if so
if source /run/hwinfo && [ "${HW_KVM}" = "ENABLED" ]; then
set_attr "/VirtualBox/Machine/Hardware/Paravirt" "provider" "KVM"
fi
# activate IOAPIC needed for multi core (?)
if [ $CPU_CORES -gt 1 ]; then
set_attr "/VirtualBox/Machine/Hardware/BIOS/IOAPIC" "enabled" "true"
fi
# PAE support?
local PAE_SUPPORT="false"
detect_cpu_flag "pae" && PAE_SUPPORT="true"
set_attr "/VirtualBox/Machine/Hardware/CPU/PAE" "enabled" "${PAE_SUPPORT}"
# LongMode?
local LM_SUPPORT="false"
detect_cpu_flag "lm" && LM_SUPPORT="true"
set_attr "/VirtualBox/Machine/Hardware/CPU/LongMode" "enabled" "${LM_SUPPORT}"
# Page size extensions?
local PSE_SUPPORT="false"
detect_cpu_flag "pse" && PSE_SUPPORT="true"
set_attr "/VirtualBox/Machine/Hardware/CPU/HardwareVirtExLargePages" "enabled" "${PSE_SUPPORT}"
}
setup_usb() {
## Currently not used
# EXPERIMENTAL: check for USB 3 support and activate it
local XHCI_OK="$(lsusb -t | grep xhci)"
if [ -n "$XHCI_OK" ]; then
# Afaik, there is no way to configure more than one USB controller
# through the GUI, but it is technically possible through xml editing.
# To avoid potential problems, we only add a xHCI controller
# and delete the others, just as the GUI would configure it.
if node_exists "/VirtualBox/Machine/Hardware/USB"; then
del_node "/VirtualBox/Machine/Hardware/USB"
add_node "/VirtualBox/Machine/Hardware/USB/Controllers" "Controller" "name=xHCI" "type=XHCI"
fi
fi
}
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_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
|