|
|
@ -143,6 +143,7 @@ function vm_boot() { |
|
|
|
local BALLOON="-device virtio-balloon" |
|
|
|
local BALLOON="-device virtio-balloon" |
|
|
|
local CPU="" |
|
|
|
local CPU="" |
|
|
|
local DISK_USED="" |
|
|
|
local DISK_USED="" |
|
|
|
|
|
|
|
local DISPLAY_DEVICE="" |
|
|
|
local EFI_CODE="" |
|
|
|
local EFI_CODE="" |
|
|
|
local EFI_VARS="" |
|
|
|
local EFI_VARS="" |
|
|
|
local GUEST_CPU_CORES="" |
|
|
|
local GUEST_CPU_CORES="" |
|
|
@ -152,9 +153,12 @@ function vm_boot() { |
|
|
|
local HOST_CPU_SMT="" |
|
|
|
local HOST_CPU_SMT="" |
|
|
|
local HOST_CPU_SOCKETS="" |
|
|
|
local HOST_CPU_SOCKETS="" |
|
|
|
local HOST_CPU_VENDOR="" |
|
|
|
local HOST_CPU_VENDOR="" |
|
|
|
local DISPLAY_DEVICE="" |
|
|
|
|
|
|
|
local GL="on" |
|
|
|
local GL="on" |
|
|
|
local GUEST_TWEAKS="" |
|
|
|
local GUEST_TWEAKS="" |
|
|
|
|
|
|
|
local KERNEL_NAME="Unknown" |
|
|
|
|
|
|
|
local KERNEL_NODE="" |
|
|
|
|
|
|
|
local KERNEL_VER="?" |
|
|
|
|
|
|
|
local LSB_DESCRIPTION="" |
|
|
|
local MAC_BOOTLOADER="" |
|
|
|
local MAC_BOOTLOADER="" |
|
|
|
local MAC_MISSING="" |
|
|
|
local MAC_MISSING="" |
|
|
|
local MAC_DISK_DEV="ide-hd,bus=ahci.2" |
|
|
|
local MAC_DISK_DEV="ide-hd,bus=ahci.2" |
|
|
@ -164,82 +168,23 @@ function vm_boot() { |
|
|
|
local QEMU_VER="" |
|
|
|
local QEMU_VER="" |
|
|
|
local USB_HOST_PASSTHROUGH_CONTROLLER="qemu-xhci" |
|
|
|
local USB_HOST_PASSTHROUGH_CONTROLLER="qemu-xhci" |
|
|
|
local VIDEO="" |
|
|
|
local VIDEO="" |
|
|
|
QEMU_VER=$(${QEMU} -version | head -n1 | cut -d' ' -f4 | cut -d'(' -f1) |
|
|
|
|
|
|
|
echo "Quickemu ${VERSION} starting ${VM}" |
|
|
|
|
|
|
|
echo " - QEMU: ${QEMU} v${QEMU_VER}" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Force to lowercase. |
|
|
|
|
|
|
|
boot=${boot,,} |
|
|
|
|
|
|
|
guest_os=${guest_os,,} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Always Boot macOS using EFI |
|
|
|
|
|
|
|
if [ "${guest_os}" == "macos" ]; then |
|
|
|
|
|
|
|
boot="efi" |
|
|
|
|
|
|
|
echo " - BOOT: EFI (${guest_os})" |
|
|
|
|
|
|
|
if [ -e "${VMDIR}/OVMF_CODE.fd" ] && [ -e "${VMDIR}/OVMF_VARS-1024x768.fd" ]; then |
|
|
|
|
|
|
|
EFI_CODE="${VMDIR}/OVMF_CODE.fd" |
|
|
|
|
|
|
|
EFI_VARS="${VMDIR}/OVMF_VARS-1024x768.fd" |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
MAC_MISSING="Firmware" |
|
|
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if [ -e "${VMDIR}/OpenCore.qcow2" ]; then |
|
|
|
KERNEL_NAME=$(uname --kernel-name) |
|
|
|
MAC_BOOTLOADER="${VMDIR}/OpenCore.qcow2" |
|
|
|
KERNEL_NODE="($(uname --nodename))" |
|
|
|
elif [ -e "${VMDIR}/ESP.qcow2" ]; then |
|
|
|
KERNEL_VER=$(uname --kernel-release | cut -d'.' -f1-2) |
|
|
|
# Backwards compatibility for Clover |
|
|
|
|
|
|
|
MAC_BOOTLOADER="${VMDIR}/ESP.qcow2" |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
MAC_MISSING="Bootloader" |
|
|
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if [ -n "${MAC_MISSING}" ]; then |
|
|
|
|
|
|
|
echo "ERROR! macOS ${MAC_MISSING} was not found." |
|
|
|
|
|
|
|
echo " Use 'quickget' to download the required files." |
|
|
|
|
|
|
|
exit 1 |
|
|
|
|
|
|
|
fi |
|
|
|
|
|
|
|
elif [[ "${boot}" == *"efi"* ]]; then |
|
|
|
|
|
|
|
EFI_VARS="${VMDIR}/OVMF_VARS.fd" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Preserve backward compatibility |
|
|
|
if command -v lsb_release &>/dev/null; then |
|
|
|
if [ -e "${VMDIR}/${VMNAME}-vars.fd" ]; then |
|
|
|
LSB_DESCRIPTION=$(lsb_release --description --short) |
|
|
|
mv "${VMDIR}/${VMNAME}-vars.fd" "${EFI_VARS}" |
|
|
|
|
|
|
|
elif [ -e "${VMDIR}/OVMF_VARS_4M.fd" ]; then |
|
|
|
|
|
|
|
mv "${VMDIR}/OVMF_VARS_4M.fd" "${EFI_VARS}" |
|
|
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if [ -e "/usr/share/OVMF/OVMF_CODE_4M.fd" ] || |
|
|
|
|
|
|
|
[ -e "/usr/share/OVMF/x64/OVMF_CODE.fd" ] || |
|
|
|
|
|
|
|
[ -e "/usr/share/OVMF/OVMF_CODE.fd" ]; then |
|
|
|
|
|
|
|
echo " - BOOT: EFI (${guest_os})" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if [ -e "/usr/share/OVMF/OVMF_CODE_4M.fd" ]; then |
|
|
|
|
|
|
|
EFI_CODE="/usr/share/OVMF/OVMF_CODE_4M.fd" |
|
|
|
|
|
|
|
elif [ -e "/usr/share/OVMF/x64/OVMF_CODE.fd" ]; then |
|
|
|
|
|
|
|
EFI_CODE="/usr/share/OVMF/x64/OVMF_CODE.fd" |
|
|
|
|
|
|
|
elif [ -e "/usr/share/OVMF/OVMF_CODE.fd" ]; then |
|
|
|
|
|
|
|
EFI_CODE="/usr/share/OVMF/OVMF_CODE.fd" |
|
|
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if [ ! -e "${EFI_VARS}" ]; then |
|
|
|
|
|
|
|
if [ -e "/usr/share/OVMF/OVMF_VARS_4M.fd" ]; then |
|
|
|
|
|
|
|
cp "/usr/share/OVMF/OVMF_VARS_4M.fd" "${EFI_VARS}" |
|
|
|
|
|
|
|
elif [ -e "/usr/share/OVMF/x64/OVMF_VARS.fd" ]; then |
|
|
|
|
|
|
|
cp "/usr/share/OVMF/x64/OVMF_VARS.fd" "${EFI_VARS}" |
|
|
|
|
|
|
|
elif [ -e "/usr/share/OVMF/OVMF_VARS.fd" ]; then |
|
|
|
|
|
|
|
cp "/usr/share/OVMF/OVMF_VARS.fd" "${EFI_VARS}" |
|
|
|
|
|
|
|
fi |
|
|
|
|
|
|
|
fi |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
boot="legacy" |
|
|
|
|
|
|
|
echo " - BOOT: Legacy BIOS (${guest_os}) - EFI requested but no EFI firmware found." |
|
|
|
|
|
|
|
fi |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
echo " - BOOT: Legacy BIOS (${guest_os})" |
|
|
|
|
|
|
|
fi |
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QEMU_VER=$(${QEMU} -version | head -n1 | cut -d' ' -f4 | cut -d'(' -f1) |
|
|
|
|
|
|
|
echo "Quickemu ${VERSION} starting ${VM} on ${LSB_DESCRIPTION} ${KERNEL_NODE}" |
|
|
|
|
|
|
|
echo " - QEMU: ${QEMU} v${QEMU_VER} on ${KERNEL_NAME} ${KERNEL_VER}" |
|
|
|
|
|
|
|
|
|
|
|
HOST_CPU_CORES=$(nproc --all) |
|
|
|
HOST_CPU_CORES=$(nproc --all) |
|
|
|
HOST_CPU_VENDOR=$(lscpu | grep -E 'Vendor' | cut -d':' -f2 | sed 's/ //g') |
|
|
|
HOST_CPU_MODEL=$(lscpu | grep '^Model name:' | cut -d':' -f2 | sed 's/ //g') |
|
|
|
HOST_CPU_SOCKETS=$(lscpu | grep -E 'Socket' | cut -d':' -f2 | sed 's/ //g') |
|
|
|
HOST_CPU_SOCKETS=$(lscpu | grep -E 'Socket' | cut -d':' -f2 | sed 's/ //g') |
|
|
|
|
|
|
|
HOST_CPU_VENDOR=$(lscpu | grep -E 'Vendor' | cut -d':' -f2 | sed 's/ //g') |
|
|
|
|
|
|
|
|
|
|
|
# A CPU with Intel VT-x / AMD SVM support is required |
|
|
|
# A CPU with Intel VT-x / AMD SVM support is required |
|
|
|
if [ "${HOST_CPU_VENDOR}" == "AuthenticIntel" ]; then |
|
|
|
if [ "${HOST_CPU_VENDOR}" == "AuthenticIntel" ]; then |
|
|
@ -289,7 +234,8 @@ function vm_boot() { |
|
|
|
fi |
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
local SMP="-smp cores=${GUEST_CPU_LOGICAL_CORES},threads=${GUEST_CPU_THREADS},sockets=${HOST_CPU_SOCKETS}" |
|
|
|
local SMP="-smp cores=${GUEST_CPU_LOGICAL_CORES},threads=${GUEST_CPU_THREADS},sockets=${HOST_CPU_SOCKETS}" |
|
|
|
echo -n " - CPU: ${HOST_CPU_SOCKETS} Socket(s), ${GUEST_CPU_LOGICAL_CORES} Core(s), ${GUEST_CPU_THREADS} Thread(s)" |
|
|
|
echo " - CPU: ${HOST_CPU_MODEL}" |
|
|
|
|
|
|
|
echo -n " - CPU VM: ${HOST_CPU_SOCKETS} Socket(s), ${GUEST_CPU_LOGICAL_CORES} Core(s), ${GUEST_CPU_THREADS} Thread(s)" |
|
|
|
|
|
|
|
|
|
|
|
local RAM_VM="2G" |
|
|
|
local RAM_VM="2G" |
|
|
|
if [ -z "${ram}" ]; then |
|
|
|
if [ -z "${ram}" ]; then |
|
|
@ -318,6 +264,75 @@ function vm_boot() { |
|
|
|
fi |
|
|
|
fi |
|
|
|
fi |
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Force to lowercase. |
|
|
|
|
|
|
|
boot=${boot,,} |
|
|
|
|
|
|
|
guest_os=${guest_os,,} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Always Boot macOS using EFI |
|
|
|
|
|
|
|
if [ "${guest_os}" == "macos" ]; then |
|
|
|
|
|
|
|
boot="efi" |
|
|
|
|
|
|
|
echo " - BOOT: EFI (${guest_os})" |
|
|
|
|
|
|
|
if [ -e "${VMDIR}/OVMF_CODE.fd" ] && [ -e "${VMDIR}/OVMF_VARS-1024x768.fd" ]; then |
|
|
|
|
|
|
|
EFI_CODE="${VMDIR}/OVMF_CODE.fd" |
|
|
|
|
|
|
|
EFI_VARS="${VMDIR}/OVMF_VARS-1024x768.fd" |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
MAC_MISSING="Firmware" |
|
|
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if [ -e "${VMDIR}/OpenCore.qcow2" ]; then |
|
|
|
|
|
|
|
MAC_BOOTLOADER="${VMDIR}/OpenCore.qcow2" |
|
|
|
|
|
|
|
elif [ -e "${VMDIR}/ESP.qcow2" ]; then |
|
|
|
|
|
|
|
# Backwards compatibility for Clover |
|
|
|
|
|
|
|
MAC_BOOTLOADER="${VMDIR}/ESP.qcow2" |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
MAC_MISSING="Bootloader" |
|
|
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if [ -n "${MAC_MISSING}" ]; then |
|
|
|
|
|
|
|
echo "ERROR! macOS ${MAC_MISSING} was not found." |
|
|
|
|
|
|
|
echo " Use 'quickget' to download the required files." |
|
|
|
|
|
|
|
exit 1 |
|
|
|
|
|
|
|
fi |
|
|
|
|
|
|
|
elif [[ "${boot}" == *"efi"* ]]; then |
|
|
|
|
|
|
|
EFI_VARS="${VMDIR}/OVMF_VARS.fd" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Preserve backward compatibility |
|
|
|
|
|
|
|
if [ -e "${VMDIR}/${VMNAME}-vars.fd" ]; then |
|
|
|
|
|
|
|
mv "${VMDIR}/${VMNAME}-vars.fd" "${EFI_VARS}" |
|
|
|
|
|
|
|
elif [ -e "${VMDIR}/OVMF_VARS_4M.fd" ]; then |
|
|
|
|
|
|
|
mv "${VMDIR}/OVMF_VARS_4M.fd" "${EFI_VARS}" |
|
|
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if [ -e "/usr/share/OVMF/OVMF_CODE_4M.fd" ] || |
|
|
|
|
|
|
|
[ -e "/usr/share/OVMF/x64/OVMF_CODE.fd" ] || |
|
|
|
|
|
|
|
[ -e "/usr/share/OVMF/OVMF_CODE.fd" ]; then |
|
|
|
|
|
|
|
echo " - BOOT: EFI (${guest_os})" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if [ -e "/usr/share/OVMF/OVMF_CODE_4M.fd" ]; then |
|
|
|
|
|
|
|
EFI_CODE="/usr/share/OVMF/OVMF_CODE_4M.fd" |
|
|
|
|
|
|
|
elif [ -e "/usr/share/OVMF/x64/OVMF_CODE.fd" ]; then |
|
|
|
|
|
|
|
EFI_CODE="/usr/share/OVMF/x64/OVMF_CODE.fd" |
|
|
|
|
|
|
|
elif [ -e "/usr/share/OVMF/OVMF_CODE.fd" ]; then |
|
|
|
|
|
|
|
EFI_CODE="/usr/share/OVMF/OVMF_CODE.fd" |
|
|
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if [ ! -e "${EFI_VARS}" ]; then |
|
|
|
|
|
|
|
if [ -e "/usr/share/OVMF/OVMF_VARS_4M.fd" ]; then |
|
|
|
|
|
|
|
cp "/usr/share/OVMF/OVMF_VARS_4M.fd" "${EFI_VARS}" |
|
|
|
|
|
|
|
elif [ -e "/usr/share/OVMF/x64/OVMF_VARS.fd" ]; then |
|
|
|
|
|
|
|
cp "/usr/share/OVMF/x64/OVMF_VARS.fd" "${EFI_VARS}" |
|
|
|
|
|
|
|
elif [ -e "/usr/share/OVMF/OVMF_VARS.fd" ]; then |
|
|
|
|
|
|
|
cp "/usr/share/OVMF/OVMF_VARS.fd" "${EFI_VARS}" |
|
|
|
|
|
|
|
fi |
|
|
|
|
|
|
|
fi |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
boot="legacy" |
|
|
|
|
|
|
|
echo " - BOOT: Legacy BIOS (${guest_os}) - EFI requested but no EFI firmware found." |
|
|
|
|
|
|
|
fi |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
echo " - BOOT: Legacy BIOS (${guest_os})" |
|
|
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
# Make any OS specific adjustments |
|
|
|
# Make any OS specific adjustments |
|
|
|
case ${guest_os} in |
|
|
|
case ${guest_os} in |
|
|
|
freebsd|linux) |
|
|
|
freebsd|linux) |
|
|
|