standardize vars_with_underscores and built-in [[ ]] test

This commit is contained in:
Jack
2020-02-23 21:07:15 +02:00
parent 852ef63bf8
commit c4208f771e
+137 -137
View File
@@ -2,7 +2,7 @@
# Push-button installer of macOS on VirtualBox
# (c) myspaghetti, licensed under GPL2.0 or higher
# url: https://github.com/myspaghetti/macos-guest-virtualbox
# version 0.87.6
# version 0.87.7
# Requirements: 40GB available storage on host
# Dependencies: bash >= 4.3, xxd, gzip, unzip, wget, dmg2img,
@@ -10,12 +10,12 @@
function set_variables() {
# Customize the installation by setting these variables:
vmname="macOS" # name of the VirtualBox virtual machine
vm_name="macOS" # name of the VirtualBox virtual machine
macOS_release_name="Mojave" # install "HighSierra" "Mojave" or "Catalina"
storagesize=80000 # VM disk image size in MB. Minimum 22000
cpucount=2 # VM CPU cores, minimum 2
memorysize=4096 # VM RAM in MB, minimum 2048
gpuvram=128 # VM video RAM in MB, minimum 34, maximum 128
storage_size=80000 # VM disk image size in MB. Minimum 22000
cpu_count=2 # VM CPU cores, minimum 2
memory_size=4096 # VM RAM in MB, minimum 2048
gpu_vram=128 # VM video RAM in MB, minimum 34, maximum 128
resolution="1280x800" # VM display resolution
# The following commented commands, when run on a genuine Mac,
@@ -73,12 +73,12 @@ clear_input_buffer_then_read
# custom settings prompt
printf '
vmname="'"${vmname}"'" # name of the VirtualBox virtual machine
vm_name="'"${vm_name}"'" # name of the VirtualBox virtual machine
macOS_release_name="'"${macOS_release_name}"'" # install "HighSierra" "Mojave" or "Catalina"
storagesize='"${storagesize}"' # VM disk image size in MB. minimum 22000
cpucount='"${cpucount}"' # VM CPU cores, minimum 2
memorysize='"${memorysize}"' # VM RAM in MB, minimum 2048
gpuvram='"${gpuvram}"' # VM video RAM in MB, minimum 34, maximum 128
storage_size='"${storage_size}"' # VM disk image size in MB. minimum 22000
cpu_count='"${cpu_count}"' # VM CPU cores, minimum 2
memory_size='"${memory_size}"' # VM RAM in MB, minimum 2048
gpu_vram='"${gpu_vram}"' # VM video RAM in MB, minimum 34, maximum 128
resolution="'"${resolution}"'" # VM display resolution
These values may be customized by editing them at the top of the script file.
@@ -90,24 +90,24 @@ clear_input_buffer_then_read
# check dependencies
function check_bash_version() {
if [ -z "${BASH_VERSION}" ]; then
if [[ -z "${BASH_VERSION}" ]]; then
echo "Can't determine BASH_VERSION. Exiting."
exit
elif [ "${BASH_VERSION:0:1}" -lt 4 ]; then
elif [[ "${BASH_VERSION:0:1}" -lt 4 ]]; then
echo "Please run this script on Bash 4.3 or higher."
if [ -n "$(sw_vers 2>/dev/null)" ]; then
if [[ -n "$(sw_vers 2>/dev/null)" ]]; then
echo "macOS detected. Make sure the script is not running on"
echo "the default /bin/bash which is version 3."
fi
exit
elif [ "${BASH_VERSION:0:1}" -eq 4 -a "${BASH_VERSION:2:1}" -le 2 ]; then
elif [[ "${BASH_VERSION:0:1}" -eq 4 && "${BASH_VERSION:2:1}" -le 2 ]]; then
echo "Please run this script on Bash 4.3 or higher."
exit
fi
}
function check_gnu_coreutils_prefix() {
if [ -n "$(gcsplit --help 2>/dev/null)" ]; then
if [[ -n "$(gcsplit --help 2>/dev/null)" ]]; then
function csplit() {
gcsplit "$@"
}
@@ -132,30 +132,30 @@ fi
function check_dependencies() {
# check if running on macOS and non-GNU coreutils
if [ -n "$(sw_vers 2>/dev/null)" ]; then
if [[ -n "$(sw_vers 2>/dev/null)" ]]; then
# Add Homebrew GNU coreutils to PATH if path exists
homebrew_gnubin="/usr/local/opt/coreutils/libexec/gnubin"
if [ -d "${homebrew_gnubin}" ]; then
if [[ -d "${homebrew_gnubin}" ]]; then
PATH="${homebrew_gnubin}:${PATH}"
fi
# if csplit isn't GNU variant, exit
if [ -z "$(csplit --help 2>/dev/null)" ]; then
if [[ -z "$(csplit --help 2>/dev/null)" ]]; then
echo ""
printf 'macOS detected.\nPlease use a package manager such as '"${highlight_color}"'homebrew'"${default_color}"', '"${highlight_color}"'pkgsrc'"${default_color}"', '"${highlight_color}"'nix'"${default_color}"', or '"${highlight_color}"'MacPorts'"${default_color}"'.\n'
echo "Please make sure the following packages are installed and that"
echo "their path is in the PATH variable:"
printf "${highlight_color}"'bash coreutils wget unzip dmg2img'"${default_color}"'\n'
printf "${highlight_color}"'bash coreutils dmg2igm gzip unzip wget xxd'"${default_color}"'\n'
echo "Please make sure Bash and coreutils are the GNU variant."
exit
fi
fi
# check for xxd, gzip, unzip, coreutils, wget
if [ -z "$(echo "xxd" | xxd -p 2>/dev/null)" \
-o -z "$(gzip --help 2>/dev/null)" \
-o -z "$(unzip -hh 2>/dev/null)" \
-o -z "$(csplit --help 2>/dev/null)" \
-o -z "$(wget --version 2>/dev/null)" ]; then
if [[ -z "$(echo "xxd" | xxd -p 2>/dev/null)" || \
-z "$(gzip --help 2>/dev/null)" || \
-z "$(unzip -hh 2>/dev/null)" || \
-z "$(csplit --help 2>/dev/null)" || \
-z "$(wget --version 2>/dev/null)" ]]; then
echo "Please make sure the following packages are installed:"
echo "coreutils gzip unzip xxd wget"
echo "Please make sure the coreutils package is the GNU variant."
@@ -171,8 +171,8 @@ fi
# VirtualBox in ${PATH}
# Cygwin
if [ -n "$(cygcheck -V 2>/dev/null)" ]; then
if [ -n "$(cmd.exe /d /s /c call VBoxManage.exe -v 2>/dev/null)" ]; then
if [[ -n "$(cygcheck -V 2>/dev/null)" ]]; then
if [[ -n "$(cmd.exe /d /s /c call VBoxManage.exe -v 2>/dev/null)" ]]; then
function VBoxManage() {
cmd.exe /d /s /c call VBoxManage.exe "$@"
}
@@ -180,7 +180,7 @@ if [ -n "$(cygcheck -V 2>/dev/null)" ]; then
cmd_path_VBoxManage='C:\Program Files\Oracle\VirtualBox\VBoxManage.exe'
echo "Can't find VBoxManage in PATH variable,"
echo "checking ${cmd_path_VBoxManage}"
if [ -n "$(cmd.exe /d /s /c call "${cmd_path_VBoxManage}" -v 2>/dev/null)" ]; then
if [[ -n "$(cmd.exe /d /s /c call "${cmd_path_VBoxManage}" -v 2>/dev/null)" ]]; then
function VBoxManage() {
cmd.exe /d /s /c call "${cmd_path_VBoxManage}" "$@"
}
@@ -213,7 +213,7 @@ elif [[ "$(cat /proc/sys/kernel/osrelease 2>/dev/null)" =~ [Mm]icrosoft ]]; then
printf "${highlight_color}"'Press enter to continue, CTRL-C to exit.'"${default_color}"
clear_input_buffer_then_read
fi
if [ -n "$(VBoxManage.exe -v 2>/dev/null)" ]; then
if [[ -n "$(VBoxManage.exe -v 2>/dev/null)" ]]; then
function VBoxManage() {
VBoxManage.exe "$@"
}
@@ -221,7 +221,7 @@ elif [[ "$(cat /proc/sys/kernel/osrelease 2>/dev/null)" =~ [Mm]icrosoft ]]; then
wsl_path_VBoxManage='/mnt/c/Program Files/Oracle/VirtualBox/VBoxManage.exe'
echo "Can't find VBoxManage in PATH variable,"
echo "checking ${wsl_path_VBoxManage}"
if [ -n "$("${wsl_path_VBoxManage}" -v 2>/dev/null)" ]; then
if [[ -n "$("${wsl_path_VBoxManage}" -v 2>/dev/null)" ]]; then
PATH="${PATH}:${wsl_path_VBoxManage%/*}"
function VBoxManage() {
VBoxManage.exe "$@"
@@ -235,7 +235,7 @@ elif [[ "$(cat /proc/sys/kernel/osrelease 2>/dev/null)" =~ [Mm]icrosoft ]]; then
fi
fi
# everything else (not cygwin and not wsl)
elif [ -z "$(VBoxManage -v 2>/dev/null)" ]; then
elif [[ -z "$(VBoxManage -v 2>/dev/null)" ]]; then
echo "Please make sure VirtualBox version 6.0 or higher is installed,"
echo "and that the path to the VBoxManage executable is in the PATH variable."
exit
@@ -244,7 +244,7 @@ fi
# VirtualBox version
vbox_version="$(VBoxManage -v 2>/dev/null)"
vbox_version="$( printf ${vbox_version} | tr -d '\r')"
if [ -z "${vbox_version}" -o -z "${vbox_version:2:1}" ]; then
if [[ -z "${vbox_version}" || -z "${vbox_version:2:1}" ]]; then
echo "Can't determine VirtualBox version. Exiting."
exit
elif [[ ( "${vbox_version:0:1}" -lt 5 ) || ( "${vbox_version:0:1}" = 5 && "${vbox_version:2:1}" -lt 2 ) ]]; then
@@ -265,8 +265,8 @@ fi
# Oracle VM VirtualBox Extension Pack
extpacks="$(VBoxManage list extpacks 2>/dev/null)"
if [ "$(expr match "${extpacks}" '.*Oracle VM VirtualBox Extension Pack')" -le "0" \
-o "$(expr match "${extpacks}" '.*Usable:[[:blank:]]*false')" -gt "0" ]; then
if [[ "$(expr match "${extpacks}" '.*Oracle VM VirtualBox Extension Pack')" -le "0" || \
"$(expr match "${extpacks}" '.*Usable:[[:blank:]]*false')" -gt "0" ]]; then
echo "Please make sure Oracle VM VirtualBox Extension Pack is installed, and that"
echo "all installed VirtualBox extensions are listed as usable when"
echo "running the command \"VBoxManage list extpacks\""
@@ -274,16 +274,16 @@ if [ "$(expr match "${extpacks}" '.*Oracle VM VirtualBox Extension Pack')" -le "
fi
# dmg2img
if [ -z "$(dmg2img -d 2>/dev/null)" ]; then
if [ -z "$(cygcheck -V 2>/dev/null)" ]; then
if [[ -z "$(dmg2img -d 2>/dev/null)" ]]; then
if [[ -z "$(cygcheck -V 2>/dev/null)" ]]; then
echo "Please install the package dmg2img."
exit
elif [ -z "$(${PWD}/dmg2img -d 2>/dev/null)" ]; then
elif [[ -z "$(${PWD}/dmg2img -d 2>/dev/null)" ]]; then
echo "Locally installing dmg2img"
wget "http://vu1tur.eu.org/tools/dmg2img-1.6.6-win32.zip" \
${wgetargs} \
--output-document="dmg2img-1.6.6-win32.zip"
if [ ! -s dmg2img-1.6.6-win32.zip ]; then
if [[ ! -s dmg2img-1.6.6-win32.zip ]]; then
echo "Error downloading dmg2img. Please provide the package manually."
exit
fi
@@ -325,18 +325,18 @@ print_dimly "${macOS_release_name} selected to be downloaded and installed"
function prompt_delete_existing_vm() {
print_dimly "stage: prompt_delete_existing_vm"
if [ -n "$(VBoxManage showvminfo "${vmname}" 2>/dev/null)" ]; then
if [[ -n "$(VBoxManage showvminfo "${vm_name}" 2>/dev/null)" ]]; then
echo ''
echo 'A virtual machine named "'"${vmname}"'" already exists.'
printf "${warning_color}"'Delete existing virtual machine "'"${vmname}"'"?'"${default_color}"
echo 'A virtual machine named "'"${vm_name}"'" already exists.'
printf "${warning_color}"'Delete existing virtual machine "'"${vm_name}"'"?'"${default_color}"
delete=""
read -n 1 -p ' [y/N] ' delete
echo ""
if [ "${delete,,}" == "y" ]; then
VBoxManage unregistervm "${vmname}" --delete
if [[ "${delete,,}" == "y" ]]; then
VBoxManage unregistervm "${vm_name}" --delete
else
echo ""
printf "${highlight_color}"'Please assign a different VM name to variable "vmname" by editing the script,'"${default_color}"
printf "${highlight_color}"'Please assign a different VM name to variable "vm_name" by editing the script,'"${default_color}"
echo "or skip this check manually as described when running the following command:"
would_you_like_to_know_less
exit
@@ -344,16 +344,16 @@ if [ -n "$(VBoxManage showvminfo "${vmname}" 2>/dev/null)" ]; then
fi
}
# Attempt to create new virtual machine named "${vmname}"
# Attempt to create new virtual machine named "${vm_name}"
function create_vm() {
print_dimly "stage: create_vm"
if [ -n "$( VBoxManage createvm --name "${vmname}" --ostype "MacOS1013_64" --register 2>&1 >/dev/null )" ]; then
printf '\nError: Could not create virtual machine "'"${vmname}"'".
'"${highlight_color}"'Please delete exising "'"${vmname}"'" VirtualBox configuration files '"${warning_color}"'manually'"${default_color}"'.
if [[ -n "$( VBoxManage createvm --name "${vm_name}" --ostype "MacOS1013_64" --register 2>&1 >/dev/null )" ]]; then
printf '\nError: Could not create virtual machine "'"${vm_name}"'".
'"${highlight_color}"'Please delete exising "'"${vm_name}"'" VirtualBox configuration files '"${warning_color}"'manually'"${default_color}"'.
Error message:
'
VBoxManage createvm --name "${vmname}" --ostype "MacOS1013_64" --register 2>/dev/tty
VBoxManage createvm --name "${vm_name}" --ostype "MacOS1013_64" --register 2>/dev/tty
exit
fi
}
@@ -368,11 +368,11 @@ wget "${sucatalog}" \
--output-document="${macOS_release_name}_sucatalog"
# if file was not downloaded correctly
if [ ! -s "${macOS_release_name}_sucatalog" ]; then
if [[ ! -s "${macOS_release_name}_sucatalog" ]]; then
wget --debug -O /dev/null -o "${macOS_release_name}_wget.log" "${sucatalog}"
echo ""
echo "Couldn't download the Apple software update catalog."
if [ "$(expr match "$(cat "${macOS_release_name}_wget.log")" '.*ERROR[[:print:]]*is not trusted')" -gt "0" ]; then
if [[ "$(expr match "$(cat "${macOS_release_name}_wget.log")" '.*ERROR[[:print:]]*is not trusted')" -gt "0" ]]; then
printf '
Make sure certificates from a certificate authority are installed.
Certificates are often installed through the package manager with
@@ -482,7 +482,7 @@ function generate_nvram_bin_file() {
# calculate crc32 using gzip, flip crc32 bytes into big-endian
local crc32="$(printf "${entry}" | xxd -r -p | gzip -c | tail -c8 | od -tx4 -N4 -An --endian=big)"
# save binary data
printf -- "${entry} ${crc32}" | xxd -r -p - "${vmname}_${filename}.bin"
printf -- "${entry} ${crc32}" | xxd -r -p - "${vm_name}_${filename}.bin"
}
# MLB
@@ -493,7 +493,7 @@ generate_nvram_bin_file MLB "${MLB_b16}" "4D1EDE05-38C7-4A6A-9CC6-4BCCA8B38C14"
# Convert the mixed-ASCII-and-base16 ROM value
# into an ASCII string that represents a base16 number.
ROM_b16="$(for (( i=0; i<${#ROM}; )); do let j=i+1;
if [ "${ROM:${i}:1}" == "%" ]; then
if [[ "${ROM:${i}:1}" == "%" ]]; then
echo -n "${ROM:${j}:2}"; let i=i+3;
else
x="$(echo -n "${ROM:${i}:1}" | od -t x1 -An | tr -d ' ')";
@@ -512,12 +512,12 @@ generate_nvram_bin_file csr-active-config "${SYSTEM_INTEGRITY_PROTECTION}" "7C43
function create_macos_installation_files_viso() {
print_dimly "stage: create_macos_installation_files_viso"
echo "Creating EFI startup script"
echo 'echo -off' > "${vmname}_startup.nsh"
echo 'echo -off' > "${vm_name}_startup.nsh"
if [[ ( "${vbox_version:0:1}" -lt 6 ) || ( "${vbox_version:0:1}" = 6 && "${vbox_version:2:1}" = 0 ) ]]; then
echo 'load fs0:\EFI\OC\Drivers\AppleImageLoader.efi
load fs0:\EFI\OC\Drivers\AppleUiSupport.efi
load fs0:\EFI\OC\Drivers\ApfsDriverLoader.efi
map -r' >> "${vmname}_startup.nsh"
map -r' >> "${vm_name}_startup.nsh"
fi
echo 'if exist "fs0:\EFI\NVRAM\MLB.bin" then
dmpstore -all -l fs0:\EFI\NVRAM\MLB.bin
@@ -542,7 +542,7 @@ for %a run (1 5)
if exist "fs%a:\System\Library\CoreServices\boot.efi" then
"fs%a:\System\Library\CoreServices\boot.efi"
endif
endfor' >> "${vmname}_startup.nsh"
endfor' >> "${vm_name}_startup.nsh"
echo ""
echo "Creating VirtualBox 6 virtual ISO containing the"
@@ -559,12 +559,12 @@ for filename in "BaseSystem.chunklist" \
"AppleDiagnostics.dmg" \
"AppleDiagnostics.chunklist" \
"BaseSystem.dmg" ; do
if [ -s "${macOS_release_name}_${filename}" ]; then
if [[ -s "${macOS_release_name}_${filename}" ]]; then
echo "/${filename}=\"${macOS_release_name}_${filename}\"" >> "${macOS_release_name}_Installation_files.viso"
fi
done
if [ -s "${macOS_release_name}_InstallESD.part00" ]; then
if [[ -s "${macOS_release_name}_InstallESD.part00" ]]; then
for part in "${macOS_release_name}_InstallESD.part"*; do
echo "/InstallESD${part##*InstallESD}=\"${part}\"" >> "${macOS_release_name}_Installation_files.viso"
done
@@ -572,41 +572,41 @@ fi
# NVRAM binary files
for filename in "MLB.bin" "ROM.bin" "csr-active-config.bin" "system-id.bin"; do
if [ -s "${vmname}_${filename}" ]; then
echo "/ESP/EFI/NVRAM/${filename}=\"${vmname}_${filename}\"" >> "${macOS_release_name}_Installation_files.viso"
if [[ -s "${vm_name}_${filename}" ]]; then
echo "/ESP/EFI/NVRAM/${filename}=\"${vm_name}_${filename}\"" >> "${macOS_release_name}_Installation_files.viso"
fi
done
# EFI drivers for VirtualBox 6.0 and 5.2
for filename in "ApfsDriverLoader.efi" "AppleImageLoader.efi" "AppleUiSupport.efi"; do
if [ -s "${filename}" ]; then
if [[ -s "${filename}" ]]; then
echo "/ESP/EFI/OC/Drivers/${filename}=\"${filename}\"" >> "${macOS_release_name}_Installation_files.viso"
fi
done
# EFI startup script
echo "/ESP/startup.nsh=\"${vmname}_startup.nsh\"" >> "${macOS_release_name}_Installation_files.viso"
echo "/ESP/startup.nsh=\"${vm_name}_startup.nsh\"" >> "${macOS_release_name}_Installation_files.viso"
}
# Create the macOS base system virtual disk image
function create_basesystem_vdi() {
print_dimly "stage: create_basesystem_vdi"
if [ -s "${macOS_release_name}_BaseSystem.vdi" ]; then
if [[ -s "${macOS_release_name}_BaseSystem.vdi" ]]; then
echo "${macOS_release_name}_BaseSystem.vdi bootstrap virtual disk image exists."
elif [ ! -s "${macOS_release_name}_BaseSystem.dmg" ]; then
elif [[ ! -s "${macOS_release_name}_BaseSystem.dmg" ]]; then
echo ""
echo "Could not find ${macOS_release_name}_BaseSystem.dmg; exiting."
exit
else
echo "Converting to BaseSystem.dmg to BaseSystem.img"
if [ -n "$("${PWD}/dmg2img.exe" -d 2>/dev/null)" ]; then
if [[ -n "$("${PWD}/dmg2img.exe" -d 2>/dev/null)" ]]; then
"${PWD}/dmg2img.exe" "${macOS_release_name}_BaseSystem.dmg" "${macOS_release_name}_BaseSystem.img"
else
dmg2img "${macOS_release_name}_BaseSystem.dmg" "${macOS_release_name}_BaseSystem.img"
fi
VBoxManage convertfromraw --format VDI "${macOS_release_name}_BaseSystem.img" "${macOS_release_name}_BaseSystem.vdi"
if [ -s "${macOS_release_name}_BaseSystem.vdi" ]; then
if [[ -s "${macOS_release_name}_BaseSystem.vdi" ]]; then
rm "${macOS_release_name}_BaseSystem.img" 2>/dev/null
fi
fi
@@ -615,20 +615,20 @@ fi
# Create the target virtual disk image
function create_target_vdi() {
print_dimly "stage: create_target_vdi"
if [ -w "${vmname}.vdi" ]; then
echo "${vmname}.vdi target system virtual disk image exists."
elif [ "${macOS_release_name}" = "Catalina" -a "${storagesize}" -lt 25000 ]; then
if [[ -w "${vm_name}.vdi" ]]; then
echo "${vm_name}.vdi target system virtual disk image exists."
elif [[ "${macOS_release_name}" = "Catalina" && "${storage_size}" -lt 25000 ]]; then
echo "Attempting to install macOS Catalina on a disk smaller than 25000MB will fail."
echo "Please assign a larger virtual disk image size. Exiting."
exit
elif [ "${storagesize}" -lt 22000 ]; then
elif [[ "${storage_size}" -lt 22000 ]]; then
echo "Attempting to install macOS on a disk smaller than 22000MB will fail."
echo "Please assign a larger virtual disk image size. Exiting."
exit
else
echo "Creating ${vmname} target system virtual disk image."
VBoxManage createmedium --size="${storagesize}" \
--filename "${vmname}.vdi" \
echo "Creating ${vm_name} target system virtual disk image."
VBoxManage createmedium --size="${storage_size}" \
--filename "${vm_name}.vdi" \
--variant standard 2>/dev/tty
fi
}
@@ -636,27 +636,27 @@ fi
# Create the installation media virtual disk image
function create_install_vdi() {
print_dimly "stage: create_install_vdi"
if [ -w "Install ${macOS_release_name}.vdi" ]; then
if [[ -w "Install ${macOS_release_name}.vdi" ]]; then
echo '"'"Install ${macOS_release_name}.vdi"'" virtual disk image exists.'
printf "${warning_color}"'Delete "'"Install ${macOS_release_name}.vdi"'"?'"${default_color}"
delete=""
read -n 1 -p " [y/N] " delete
echo ""
if [ "${delete,,}" == "y" ]; then
if [[ "$( VBoxManage list runningvms )" =~ \""${vmname}"\" ]];
if [[ "${delete,,}" == "y" ]]; then
if [[ "$( VBoxManage list runningvms )" =~ \""${vm_name}"\" ]];
then
echo '"'"Install ${macOS_release_name}.vdi"'" may be deleted'
echo "only when the virtual machine is powered off."
echo "Exiting."
exit
else
VBoxManage storagectl "${vmname}" --remove --name SATA >/dev/null 2>&1
VBoxManage storagectl "${vm_name}" --remove --name SATA >/dev/null 2>&1
VBoxManage closemedium "Install ${macOS_release_name}.vdi" >/dev/null 2>&1
rm "Install ${macOS_release_name}.vdi"
fi
fi
fi
if [ ! -e "Install ${macOS_release_name}.vdi" ]; then
if [[ ! -e "Install ${macOS_release_name}.vdi" ]]; then
echo "Creating ${macOS_release_name} installation media virtual disk image."
VBoxManage createmedium --size=12000 \
--filename "Install ${macOS_release_name}.vdi" \
@@ -666,39 +666,39 @@ fi
function configure_vm() {
print_dimly "stage: configure_vm"
VBoxManage modifyvm "${vmname}" --cpus "${cpucount}" --memory "${memorysize}" \
--vram "${gpuvram}" --pae on --boot1 none --boot2 none --boot3 none \
VBoxManage modifyvm "${vm_name}" --cpus "${cpu_count}" --memory "${memory_size}" \
--vram "${gpu_vram}" --pae on --boot1 none --boot2 none --boot3 none \
--boot4 none --firmware efi --rtcuseutc on --usbxhci on --chipset ich9 \
--mouse usbtablet --keyboard usb --audiocontroller hda --audiocodec stac9221
VBoxManage setextradata "${vmname}" \
VBoxManage setextradata "${vm_name}" \
"VBoxInternal2/EfiGraphicsResolution" "${resolution}"
VBoxManage setextradata "${vmname}" \
VBoxManage setextradata "${vm_name}" \
"VBoxInternal/Devices/efi/0/Config/DmiSystemFamily" "${DmiSystemFamily}"
VBoxManage setextradata "${vmname}" \
VBoxManage setextradata "${vm_name}" \
"VBoxInternal/Devices/efi/0/Config/DmiSystemProduct" "${DmiSystemProduct}"
VBoxManage setextradata "${vmname}" \
VBoxManage setextradata "${vm_name}" \
"VBoxInternal/Devices/efi/0/Config/DmiSystemSerial" "${DmiSystemSerial}"
VBoxManage setextradata "${vmname}" \
VBoxManage setextradata "${vm_name}" \
"VBoxInternal/Devices/efi/0/Config/DmiSystemUuid" "${DmiSystemUuid}"
VBoxManage setextradata "${vmname}" \
VBoxManage setextradata "${vm_name}" \
"VBoxInternal/Devices/efi/0/Config/DmiOEMVBoxVer" "${DmiOEMVBoxVer}"
VBoxManage setextradata "${vmname}" \
VBoxManage setextradata "${vm_name}" \
"VBoxInternal/Devices/efi/0/Config/DmiOEMVBoxRev" "${DmiOEMVBoxRev}"
VBoxManage setextradata "${vmname}" \
VBoxManage setextradata "${vm_name}" \
"VBoxInternal/Devices/efi/0/Config/DmiBIOSVersion" "${DmiBIOSVersion}"
VBoxManage setextradata "${vmname}" \
VBoxManage setextradata "${vm_name}" \
"VBoxInternal/Devices/efi/0/Config/DmiBoardProduct" "${DmiBoardProduct}"
VBoxManage setextradata "${vmname}" \
VBoxManage setextradata "${vm_name}" \
"VBoxInternal/Devices/efi/0/Config/DmiBoardSerial" "${DmiBoardSerial}"
VBoxManage setextradata "${vmname}" \
VBoxManage setextradata "${vm_name}" \
"VBoxInternal/Devices/efi/0/Config/DmiSystemVendor" "Apple Inc."
VBoxManage setextradata "${vmname}" \
VBoxManage setextradata "${vm_name}" \
"VBoxInternal/Devices/efi/0/Config/DmiSystemVersion" "1.0"
VBoxManage setextradata "${vmname}" \
VBoxManage setextradata "${vm_name}" \
"VBoxInternal/Devices/smc/0/Config/DeviceKey" \
"ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc"
VBoxManage setextradata "${vmname}" \
VBoxManage setextradata "${vm_name}" \
"VBoxInternal/Devices/smc/0/Config/GetKeyFromRealSMC" 0
}
@@ -706,22 +706,22 @@ function populate_virtual_disks() {
print_dimly "stage: populate_virtual_disks"
# Attach virtual disk images of the base system, installation, and target
# to the virtual machine
VBoxManage storagectl "${vmname}" --remove --name SATA >/dev/null 2>&1
VBoxManage storagectl "${vm_name}" --remove --name SATA >/dev/null 2>&1
if [[ -n $(
2>&1 VBoxManage storagectl "${vmname}" --add sata --name SATA --hostiocache on >/dev/null
2>&1 VBoxManage storageattach "${vmname}" --storagectl SATA --port 0 \
--type hdd --nonrotational on --medium "${vmname}.vdi" >/dev/null
2>&1 VBoxManage storageattach "${vmname}" --storagectl SATA --port 1 --hotpluggable on \
2>&1 VBoxManage storagectl "${vm_name}" --add sata --name SATA --hostiocache on >/dev/null
2>&1 VBoxManage storageattach "${vm_name}" --storagectl SATA --port 0 \
--type hdd --nonrotational on --medium "${vm_name}.vdi" >/dev/null
2>&1 VBoxManage storageattach "${vm_name}" --storagectl SATA --port 1 --hotpluggable on \
--type hdd --nonrotational on --medium "Install ${macOS_release_name}.vdi" >/dev/null
2>&1 VBoxManage storageattach "${vmname}" --storagectl SATA --port 2 --hotpluggable on \
2>&1 VBoxManage storageattach "${vm_name}" --storagectl SATA --port 2 --hotpluggable on \
--type hdd --nonrotational on --medium "${macOS_release_name}_BaseSystem.vdi" >/dev/null
2>&1 VBoxManage storageattach "${vmname}" --storagectl SATA --port 3 \
2>&1 VBoxManage storageattach "${vm_name}" --storagectl SATA --port 3 \
--type dvddrive --medium "${macOS_release_name}_Installation_files.viso" >/dev/null
) ]]; then
echo "One or more virtual storage files could not be loaded. Exiting."; exit
fi
echo "Starting virtual machine ${vmname}. This should take a couple of minutes."
( VBoxManage startvm "${vmname}" >/dev/null 2>&1 )
echo "Starting virtual machine ${vm_name}. This should take a couple of minutes."
( VBoxManage startvm "${vm_name}" >/dev/null 2>&1 )
prompt_lang_utils
prompt_terminal_ready
print_dimly "Please wait"
@@ -732,7 +732,7 @@ kbstring='disks="$(diskutil list | grep -o "\*[0-9][^ ]* GB *disk[0-9]$" | grep
'disks=(${disks[@]}) && '\
'if [ -z "${disks}" ]; then echo "Could not find disks"; fi && '\
'[ -n "${disks[0]}" ] && '\
'diskutil partitionDisk "/dev/${disks[0]}" 1 GPT APFS "'"${vmname}"'" R && '\
'diskutil partitionDisk "/dev/${disks[0]}" 1 GPT APFS "'"${vm_name}"'" R && '\
'diskutil partitionDisk "/dev/${disks[1]}" 1 GPT JHFS+ "Install" R && '
send_keys
# Create secondary base system on the Install disk
@@ -767,9 +767,9 @@ detached from the VM and released from VirtualBox.
print_dimly "If the partitioning fails, exit the script by pressing CTRL-C.
Otherwise, please wait."
# Detach the original 2GB BaseSystem.vdi
while [[ "$( VBoxManage list runningvms )" =~ \""${vmname}"\" ]]; do sleep 2 >/dev/null 2>&1; done;
while [[ "$( VBoxManage list runningvms )" =~ \""${vm_name}"\" ]]; do sleep 2 >/dev/null 2>&1; done;
# Release basesystem vdi from VirtualBox configuration
VBoxManage storageattach "${vmname}" --storagectl SATA --port 2 --medium none >/dev/null 2>&1
VBoxManage storageattach "${vm_name}" --storagectl SATA --port 2 --medium none >/dev/null 2>&1
VBoxManage closemedium "${macOS_release_name}_BaseSystem.vdi" >/dev/null 2>&1
echo "${macOS_release_name}_BaseSystem.vdi detached from the virtual machine"
echo "and released from VirtualBox Manager."
@@ -777,24 +777,24 @@ echo "and released from VirtualBox Manager."
function populate_macos_target() {
print_dimly "stage: populate_macos_target"
if [[ "$( VBoxManage list runningvms )" =~ \""${vmname}"\" ]]; then
if [[ "$( VBoxManage list runningvms )" =~ \""${vm_name}"\" ]]; then
printf "${highlight_color}"'Please '"${warning_color}"'manually'"${highlight_color}"' shut down the virtual machine and press enter to continue.'"${default_color}"
clear_input_buffer_then_read
fi
VBoxManage storagectl "${vmname}" --remove --name SATA >/dev/null 2>&1
VBoxManage storagectl "${vm_name}" --remove --name SATA >/dev/null 2>&1
if [[ -n $(
2>&1 VBoxManage storagectl "${vmname}" --add sata --name SATA --hostiocache on >/dev/null
2>&1 VBoxManage storageattach "${vmname}" --storagectl SATA --port 0 \
--type hdd --nonrotational on --medium "${vmname}.vdi" >/dev/null
2>&1 VBoxManage storageattach "${vmname}" --storagectl SATA --port 1 --hotpluggable on \
2>&1 VBoxManage storagectl "${vm_name}" --add sata --name SATA --hostiocache on >/dev/null
2>&1 VBoxManage storageattach "${vm_name}" --storagectl SATA --port 0 \
--type hdd --nonrotational on --medium "${vm_name}.vdi" >/dev/null
2>&1 VBoxManage storageattach "${vm_name}" --storagectl SATA --port 1 --hotpluggable on \
--type hdd --nonrotational on --medium "Install ${macOS_release_name}.vdi" >/dev/null
2>&1 VBoxManage storageattach "${vmname}" --storagectl SATA --port 2 \
2>&1 VBoxManage storageattach "${vm_name}" --storagectl SATA --port 2 \
--type dvddrive --medium "${macOS_release_name}_Installation_files.viso" >/dev/null
) ]]; then
echo "One or more virtual storage files could not be loaded. Exiting."; exit
fi
echo "The VM will boot from the populated installer base system virtual disk."
( VBoxManage startvm "${vmname}" >/dev/null 2>&1 )
( VBoxManage startvm "${vm_name}" >/dev/null 2>&1 )
prompt_lang_utils
prompt_terminal_ready
add_another_terminal
@@ -809,9 +809,9 @@ echo ""
kbstring='disks="$(diskutil list | grep -o "[0-9][^ ]* GB *disk[0-9]$" | sort -gr | grep -o disk[0-9])" && '\
'disks=(${disks[@]}) && '\
'printf '"'"'trap "exit 0" SIGUSR1; while true; do sleep 10; done;'"'"' | sh && '\
'mkdir -p "/Volumes/'"${vmname}"'/tmp/mount_efi" && '\
'mount_msdos /dev/${disks[0]}s1 "/Volumes/'"${vmname}"'/tmp/mount_efi" && '\
'cp -r "/Volumes/'"${macOS_release_name:0:5}-files"'/ESP/"* "/Volumes/'"${vmname}"'/tmp/mount_efi/" && '\
'mkdir -p "/Volumes/'"${vm_name}"'/tmp/mount_efi" && '\
'mount_msdos /dev/${disks[0]}s1 "/Volumes/'"${vm_name}"'/tmp/mount_efi" && '\
'cp -r "/Volumes/'"${macOS_release_name:0:5}-files"'/ESP/"* "/Volumes/'"${vm_name}"'/tmp/mount_efi/" && '\
'installer_pid=$(ps | grep startosinstall | cut -d '"'"' '"'"' -f 3) && '\
'kill -SIGUSR1 ${installer_pid}'
send_keys
@@ -826,7 +826,7 @@ cycle_through_terminal_windows
kbstring='background_pid="$(ps | grep '"'"' sh$'"'"' | cut -d '"'"' '"'"' -f 3)" && '\
'app_path="$(ls -d /Install*.app)" && '\
'cd "/${app_path}/Contents/Resources/" && '\
'./startosinstall --agreetolicense --pidtosignal ${background_pid} --rebootdelay 500 --volume "/Volumes/'"${vmname}"'"'
'./startosinstall --agreetolicense --pidtosignal ${background_pid} --rebootdelay 500 --volume "/Volumes/'"${vm_name}"'"'
send_keys
send_enter
if [[ ( "${vbox_version:0:1}" -lt 6 ) || ( "${vbox_version:0:1}" = 6 && "${vbox_version:2:1}" = 0 ) ]]; then
@@ -834,12 +834,12 @@ if [[ ( "${vbox_version:0:1}" -lt 6 ) || ( "${vbox_version:0:1}" = 6 && "${vbox_
powers off the virtual machine and detaches the device "'"Install ${macOS_release_name}.vdi"'" to avoid
booting into the initial installer environment again.'
clear_input_buffer_then_read
VBoxManage controlvm "${vmname}" poweroff >/dev/null 2>&1
VBoxManage controlvm "${vm_name}" poweroff >/dev/null 2>&1
for (( i=10; i>5; i-- )); do printf ' \r'"${i}"; sleep 0.5; done
VBoxManage storagectl "${vmname}" --remove --name SATA >/dev/null 2>&1
VBoxManage storagectl "${vmname}" --add sata --name SATA --hostiocache on >/dev/null 2>&1
VBoxManage storageattach "${vmname}" --storagectl SATA --port 0 \
--type hdd --nonrotational on --medium "${vmname}.vdi"
VBoxManage storagectl "${vm_name}" --remove --name SATA >/dev/null 2>&1
VBoxManage storagectl "${vm_name}" --add sata --name SATA --hostiocache on >/dev/null 2>&1
VBoxManage storageattach "${vm_name}" --storagectl SATA --port 0 \
--type hdd --nonrotational on --medium "${vm_name}.vdi"
echo ""
for (( i=5; i>0; i-- )); do printf ' \r'"${i}"; sleep 0.5; done
fi
@@ -855,7 +855,7 @@ printf '\n'"${highlight_color}"'That'"'"'s it! Enjoy your virtual machine.'"${de
function delete_temporary_files() {
print_dimly "stage: delete_temporary_files"
if [[ ! "$(VBoxManage showvminfo "${vmname}")" =~ State:[\ \t]*powered\ off ]];
if [[ ! "$(VBoxManage showvminfo "${vm_name}")" =~ State:[\ \t]*powered\ off ]];
then
printf 'Temporary files may be deleted when the virtual machine is powered off
and without a suspended state by running the following command at the script'"'"'s
@@ -864,10 +864,10 @@ working directory:
'"${highlight_color}${0} delete_temporary_files${default_color}"'\n'
else
# detach temporary VDIs and attach the macOS target disk
VBoxManage storagectl "${vmname}" --remove --name SATA >/dev/null 2>&1
VBoxManage storagectl "${vmname}" --add sata --name SATA --hostiocache on >/dev/null 2>&1
VBoxManage storageattach "${vmname}" --storagectl SATA --port 0 \
--type hdd --nonrotational on --medium "${vmname}.vdi"
VBoxManage storagectl "${vm_name}" --remove --name SATA >/dev/null 2>&1
VBoxManage storagectl "${vm_name}" --add sata --name SATA --hostiocache on >/dev/null 2>&1
VBoxManage storageattach "${vm_name}" --storagectl SATA --port 0 \
--type hdd --nonrotational on --medium "${vm_name}.vdi"
VBoxManage closemedium "Install ${macOS_release_name}.vdi" >/dev/null 2>&1
VBoxManage closemedium "${macOS_release_name}_BaseSystem.vdi" >/dev/null 2>&1
printf 'The following temporary files are safe to delete:
@@ -875,12 +875,12 @@ else
"'"${macOS_release_name}_BaseSystem"*'"
"'"${macOS_release_name}_Install"*'"
"'"Install ${macOS_release_name}.vdi"'"
"'"${vmname}_"*".bin"'"
"'"${vmname}_startup.nsh"'"
"'"${vm_name}_"*".bin"'"
"'"${vm_name}_startup.nsh"'"
"'"ApfsDriverLoader.efi"'"
"'"Apple"*".efi"'"
"'"AppleSupport-v2.0.4-RELEASE.zip"'"\n'
if [ -w "dmg2img.exe" ]; then
if [[ -w "dmg2img.exe" ]]; then
printf ' "'"dmg2img.exe"'"\n'
fi
echo ""
@@ -888,13 +888,13 @@ else
delete=""
read -n 1 -p " [y/N] " delete
echo ""
if [ "${delete,,}" == "y" ]; then
if [[ "${delete,,}" == "y" ]]; then
rm "${macOS_release_name}_Apple"* \
"${macOS_release_name}_BaseSystem"* \
"${macOS_release_name}_Install"* \
"Install ${macOS_release_name}.vdi" \
"${vmname}_"*".bin" \
"${vmname}_startup.nsh" \
"${vm_name}_"*".bin" \
"${vm_name}_startup.nsh" \
"ApfsDriverLoader.efi" \
"Apple"*".efi" \
"AppleSupport-v2.0.4-RELEASE.zip" 2>/dev/null
@@ -1217,7 +1217,7 @@ function clear_input_buffer_then_read() {
function send_keys() {
scancode=$(for (( i=0; i < ${#kbstring}; i++ ));
do c[i]=${kbstring:i:1}; echo -n ${kscd[${c[i]}]}" "; done)
VBoxManage controlvm "${vmname}" keyboardputscancode ${scancode} 1>/dev/null 2>&1
VBoxManage controlvm "${vm_name}" keyboardputscancode ${scancode} 1>/dev/null 2>&1
}
# read variable kbspecial and send keystrokes by name,
@@ -1227,7 +1227,7 @@ function send_special() {
for keypress in ${kbspecial}; do
scancode="${scancode}${kscd[${keypress}]}"" "
done
VBoxManage controlvm "${vmname}" keyboardputscancode ${scancode} 1>/dev/null 2>&1
VBoxManage controlvm "${vm_name}" keyboardputscancode ${scancode} 1>/dev/null 2>&1
}
function send_enter() {
@@ -1277,7 +1277,7 @@ function cycle_through_terminal_windows() {
}
function would_you_like_to_know_less() {
if [ -z "$(less --version 2>/dev/null)" ]; then
if [[ -z "$(less --version 2>/dev/null)" ]]; then
printf ' '"${highlight_color}${0} documentation${default_color}"'\n'
else
printf ' '"${highlight_color}${0} documentation | less -R${default_color}"'\n'