sort-of resume support and WSL support
This commit is contained in:
+66
-26
@@ -2,7 +2,7 @@
|
|||||||
# One-key semi-automatic installer of macOS on VirtualBox
|
# One-key semi-automatic installer of macOS on VirtualBox
|
||||||
# (c) img2tab, licensed under GPL2.0 or higher
|
# (c) img2tab, licensed under GPL2.0 or higher
|
||||||
# url: https://github.com/img2tab/macos-guest-virtualbox
|
# url: https://github.com/img2tab/macos-guest-virtualbox
|
||||||
# version 0.49
|
# version 0.50
|
||||||
|
|
||||||
# Requirements: 33.5GB available storage on host
|
# Requirements: 33.5GB available storage on host
|
||||||
# Dependencies: bash>=4.0, unzip, wget, dmg2img,
|
# Dependencies: bash>=4.0, unzip, wget, dmg2img,
|
||||||
@@ -31,10 +31,11 @@ printf '
|
|||||||
One-key semi-automatic installation of macOS On VirtualBox - Mojave 10.14.3
|
One-key semi-automatic installation of macOS On VirtualBox - Mojave 10.14.3
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
This installer uses only open-source software and original,
|
This script installs only open-source software and unmodified Apple binaries.
|
||||||
unmodified Apple binaries.
|
|
||||||
|
|
||||||
The script checks for dependencies and will prompt to install them if unmet.
|
The script checks for dependencies and will prompt to install them if unmet.
|
||||||
|
Some stages may fail due to errant keyboard presses; run the script with
|
||||||
|
"'${whiteonblack}${0}' stages'${defaultcolor}'" to see how to run only certain stages.
|
||||||
|
|
||||||
For iCloud and iMessage connectivity, you will need to provide a valid
|
For iCloud and iMessage connectivity, you will need to provide a valid
|
||||||
Apple serial number. macOS will work without it, but not Apple-connected apps.
|
Apple serial number. macOS will work without it, but not Apple-connected apps.
|
||||||
@@ -99,6 +100,13 @@ if [ -z "$(VBoxManage -v 2>/dev/null)" ]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Windows Subsystem for Linux (WSL)
|
||||||
|
wsldir=""
|
||||||
|
if [[ "$(cat /proc/sys/kernel/osrelease 2>/dev/null)" == *"Microsoft"* ]]; then
|
||||||
|
wsldir="$(cmd /C cd)"
|
||||||
|
wsldir="${wsldir:0:-1}"'\'
|
||||||
|
fi
|
||||||
|
|
||||||
# dmg2img
|
# dmg2img
|
||||||
if [ -z "$(dmg2img -d 2>/dev/null)" ]; then
|
if [ -z "$(dmg2img -d 2>/dev/null)" ]; then
|
||||||
if [ -z "$(cygcheck -V 2>/dev/null)" ]; then
|
if [ -z "$(cygcheck -V 2>/dev/null)" ]; then
|
||||||
@@ -133,7 +141,8 @@ if [ -n "$(VBoxManage showvminfo "${vmname}")" ]; then
|
|||||||
VBoxManage unregistervm "${vmname}" --delete
|
VBoxManage unregistervm "${vmname}" --delete
|
||||||
else
|
else
|
||||||
printf '
|
printf '
|
||||||
'${whiteonblack}'Please assign a different VM name to variable "vmname" by editing the script.'${defaultcolor}
|
'${whiteonblack}'Please assign a different VM name to variable "vmname" by editing the script,'${defaultcolor}'
|
||||||
|
or skip this check manually as described in "'${0}' stages".'
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -175,7 +184,7 @@ or http://swscan.apple.com/content/catalogs/others/
|
|||||||
else
|
else
|
||||||
dmg2img "BaseSystem.dmg" "BaseSystem.img"
|
dmg2img "BaseSystem.dmg" "BaseSystem.img"
|
||||||
fi
|
fi
|
||||||
VBoxManage convertfromraw --format VDI "BaseSystem.img" "BaseSystem.vdi"
|
VBoxManage convertfromraw --format VDI "${wsldir}BaseSystem.img" "${wsldir}BaseSystem.vdi"
|
||||||
if [ -s BaseSystem.vdi ]; then
|
if [ -s BaseSystem.vdi ]; then
|
||||||
rm "BaseSystem.dmg" "BaseSystem.img" 2>/dev/null
|
rm "BaseSystem.dmg" "BaseSystem.img" 2>/dev/null
|
||||||
fi
|
fi
|
||||||
@@ -184,7 +193,7 @@ fi
|
|||||||
|
|
||||||
# Create the target virtual disk image:
|
# Create the target virtual disk image:
|
||||||
function create_target_vdi() {
|
function create_target_vdi() {
|
||||||
if [ -r "${vmname}.vdi" ]; then
|
if [ -w "${vmname}.vdi" ]; then
|
||||||
echo "${vmname}.vdi target system virtual disk image ready."
|
echo "${vmname}.vdi target system virtual disk image ready."
|
||||||
elif [ "${storagesize}" -lt 22000 ]; then
|
elif [ "${storagesize}" -lt 22000 ]; then
|
||||||
echo "Attempting to install macOS Mojave on a disk smaller than 22000MB will fail."
|
echo "Attempting to install macOS Mojave on a disk smaller than 22000MB will fail."
|
||||||
@@ -193,19 +202,19 @@ elif [ "${storagesize}" -lt 22000 ]; then
|
|||||||
else
|
else
|
||||||
echo "Creating ${vmname} target system virtual disk image."
|
echo "Creating ${vmname} target system virtual disk image."
|
||||||
VBoxManage createmedium --size="${storagesize}" \
|
VBoxManage createmedium --size="${storagesize}" \
|
||||||
--filename "${vmname}.vdi" \
|
--filename "${wsldir}${vmname}.vdi" \
|
||||||
--variant standard 2>/dev/tty
|
--variant standard 2>/dev/tty
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Create the installation media virtual disk image:
|
# Create the installation media virtual disk image:
|
||||||
function create_install_vdi() {
|
function create_install_vdi() {
|
||||||
if [ -r "Install ${vmname}.vdi" ]; then
|
if [ -w "Install ${vmname}.vdi" ]; then
|
||||||
echo "Installation media virtual disk image ready."
|
echo "Installation media virtual disk image ready."
|
||||||
else
|
else
|
||||||
echo "Creating ${vmname} installation media virtual disk image."
|
echo "Creating ${vmname} installation media virtual disk image."
|
||||||
VBoxManage createmedium --size=8000 \
|
VBoxManage createmedium --size=8000 \
|
||||||
--filename "Install ${vmname}.vdi" \
|
--filename "${wsldir}Install ${vmname}.vdi" \
|
||||||
--variant fixed 2>/dev/tty
|
--variant fixed 2>/dev/tty
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -215,11 +224,11 @@ fi
|
|||||||
function attach_initial_storage() {
|
function attach_initial_storage() {
|
||||||
VBoxManage storagectl "${vmname}" --add sata --name SATA --hostiocache on
|
VBoxManage storagectl "${vmname}" --add sata --name SATA --hostiocache on
|
||||||
VBoxManage storageattach "${vmname}" --storagectl SATA --port 0 \
|
VBoxManage storageattach "${vmname}" --storagectl SATA --port 0 \
|
||||||
--type hdd --nonrotational on --medium "${vmname}.vdi"
|
--type hdd --nonrotational on --medium "${wsldir}${vmname}.vdi"
|
||||||
VBoxManage storageattach "${vmname}" --storagectl SATA --port 1 \
|
VBoxManage storageattach "${vmname}" --storagectl SATA --port 1 \
|
||||||
--type hdd --nonrotational on --medium "Install ${vmname}.vdi"
|
--type hdd --nonrotational on --medium "${wsldir}Install ${vmname}.vdi"
|
||||||
VBoxManage storageattach "${vmname}" --storagectl SATA --port 2 \
|
VBoxManage storageattach "${vmname}" --storagectl SATA --port 2 \
|
||||||
--type hdd --nonrotational on --medium "BaseSystem.vdi"
|
--type hdd --nonrotational on --medium "${wsldir}BaseSystem.vdi"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Configure the VM
|
# Configure the VM
|
||||||
@@ -483,14 +492,15 @@ printf ${whiteonblack}'
|
|||||||
Shutting down virtual machine.
|
Shutting down virtual machine.
|
||||||
Press enter when the virtual machine shutdown is complete.'${defaultcolor}
|
Press enter when the virtual machine shutdown is complete.'${defaultcolor}
|
||||||
read -p ""
|
read -p ""
|
||||||
}
|
|
||||||
|
|
||||||
# Detach the original 2GB BaseSystem.vdi and boot from the new 8GB BaseSystem
|
|
||||||
function install_the_installer() {
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "Detaching initial base system and starting virtual machine."
|
echo "Detaching initial base system and starting virtual machine."
|
||||||
echo "The VM will boot from the new base system on the installer virtual disk."
|
# Detach the original 2GB BaseSystem.vdi
|
||||||
VBoxManage storageattach "${vmname}" --storagectl SATA --port 2 --medium none
|
VBoxManage storageattach "${vmname}" --storagectl SATA --port 2 --medium none
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_the_installer() {
|
||||||
|
#Boot from "Install.vdi" that contains the 2GB BaseSystem and 6GB free space
|
||||||
|
echo "The VM will boot from the new base system on the installer virtual disk."
|
||||||
VBoxManage startvm "${vmname}" 2>/dev/null
|
VBoxManage startvm "${vmname}" 2>/dev/null
|
||||||
|
|
||||||
promptlangutils
|
promptlangutils
|
||||||
@@ -615,27 +625,26 @@ echo "Shutting down virtual machine."
|
|||||||
printf ${whiteonblack}'
|
printf ${whiteonblack}'
|
||||||
Press enter when the virtual machine shutdown is complete.'${defaultcolor}
|
Press enter when the virtual machine shutdown is complete.'${defaultcolor}
|
||||||
read -p ""
|
read -p ""
|
||||||
|
|
||||||
|
# detach installer from virtual machine
|
||||||
|
VBoxManage storageattach "${vmname}" --storagectl SATA --port 1 --medium none
|
||||||
}
|
}
|
||||||
|
|
||||||
function boot_macos_installer() {
|
function boot_macos_installer() {
|
||||||
# detach installer from virtual machine
|
echo "The VM will boot from the target virtual disk image."
|
||||||
VBoxManage storageattach "${vmname}" --storagectl SATA --port 1 --medium none
|
|
||||||
|
|
||||||
# Start the virtual machine again.
|
|
||||||
# The VM will boot from the target virtual disk image and complete the installation.
|
|
||||||
VBoxManage startvm "${vmname}"
|
VBoxManage startvm "${vmname}"
|
||||||
|
|
||||||
printf '
|
printf '
|
||||||
macOS Mojave 10.14.3 will now install and start up.
|
macOS Mojave 10.14.3 will now install and start up.
|
||||||
|
|
||||||
'${whiteonred}'Delete temporary files?'${defaultcolor}
|
Temporary files are safe to delete. '${whiteonred}'Delete temporary files?'${defaultcolor}
|
||||||
delete=""
|
delete=""
|
||||||
read -n 1 -p " [y/n] " delete 2>/dev/tty
|
read -n 1 -p " [y/n] " delete 2>/dev/tty
|
||||||
echo ""
|
echo ""
|
||||||
if [ "${delete}" == "y" ]; then
|
if [ "${delete}" == "y" ]; then
|
||||||
# temporary files cleanup
|
# temporary files cleanup
|
||||||
VBoxManage closemedium "BaseSystem.vdi"
|
VBoxManage closemedium "${wsldir}BaseSystem.vdi"
|
||||||
VBoxManage closemedium "Install ${vmname}.vdi"
|
VBoxManage closemedium "Install ${wsldir}${vmname}.vdi"
|
||||||
rm "BaseSystem.vdi" "Install ${vmname}.vdi"
|
rm "BaseSystem.vdi" "Install ${vmname}.vdi"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -647,7 +656,38 @@ increased through Disk Utility inside the virtual machine by creating a new
|
|||||||
APFS container and subsequently deleting it, allowing the system APFS container
|
APFS container and subsequently deleting it, allowing the system APFS container
|
||||||
to take up the available space.
|
to take up the available space.
|
||||||
|
|
||||||
That'\''s it. Enjoy your virtual machine.'
|
That'\''s it. Enjoy your virtual machine.
|
||||||
|
'
|
||||||
|
}
|
||||||
|
|
||||||
|
function stages() {
|
||||||
|
printf '
|
||||||
|
USAGE: '${whiteonblack}${0}' [STAGE]...'${defaultcolor}'
|
||||||
|
|
||||||
|
The script is divided into stages that run as separate functions.
|
||||||
|
Add one or more stage titles to the command line to run the corresponding
|
||||||
|
function. Some examples:
|
||||||
|
"'${0}' populate_virtual_disks install_the_installer"
|
||||||
|
These stages might be useful by themselves if the VDI files and the VM are
|
||||||
|
already set.
|
||||||
|
"'${0}' configure_vm"
|
||||||
|
This stage might be useful after copying an existing VDI to a different
|
||||||
|
VirtualBox installation and having the script automatically configure the VM.
|
||||||
|
|
||||||
|
Available stage titles:
|
||||||
|
welcome
|
||||||
|
check_dependencies
|
||||||
|
prompt_delete_existing_vm
|
||||||
|
create_vm
|
||||||
|
create_basesystem_vdi
|
||||||
|
create_target_vdi
|
||||||
|
create_install_vdi
|
||||||
|
attach_initial_storage
|
||||||
|
configure_vm
|
||||||
|
populate_virtual_disks
|
||||||
|
install_the_installer
|
||||||
|
boot_macos_installer
|
||||||
|
'
|
||||||
}
|
}
|
||||||
|
|
||||||
if [ -z "${1}" ]; then
|
if [ -z "${1}" ]; then
|
||||||
|
|||||||
Reference in New Issue
Block a user