Skip to content

Instantly share code, notes, and snippets.

@dakanji
Last active April 29, 2024 22:37
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save dakanji/1ab88389c7aaffe4b156db9741687b3a to your computer and use it in GitHub Desktop.
Save dakanji/1ab88389c7aaffe4b156db9741687b3a to your computer and use it in GitHub Desktop.
Creates Bootable USB for Mac OS Lion to Monterey (Excluding Mavericks)
#!/usr/bin/env bash
# Install_USB_Maker.sh
# Copyright (c) 2020 - 2024 Dayo Akanji
# - dakanji@users.sourceforge.net
# Portions Copyright (c) Jeff Geerling
# - https://github.com/geerlingguy/macos-virtualbox-vm/blob/master/LICENSE
#
# MIT License
# Derived from:
# * https://apple.stackexchange.com/a/389830
# * https://github.com/geerlingguy/macos-virtualbox-vm/blob/master/prepare-iso.sh
#
# 1. Download Lion to Monterey (Excluding Mavericks)
# * From : https://support.apple.com/HT211683 (Lion to Sierra or Links to App Store)
# * : https://github.com/corpnewt/gibMacOS (High Sierra to Monterey)
# 2. Use Disk Utility to format a USB stick partition:
# * Name : USB_Maker
# * Size : Easiest to assume 16 GB but see details below:
# * : 08 GB (Min) For Lion to Sierra (if via Install DMG)
# * : 16 GB (Min) For Yosemite to Sierra (if via Installer App)
# * : 16 GB (Min) For High Sierra to Monterey (Always Installer App)
# * Format : Mac OS Extended Journaled (HFS+)
# 3. Make the downloaded "Install" package available to this script:
# * For Lion to Sierra:
# * Mount the downloaded "Install DMG" file
# * Close the Finder window for the DMG if displayed
# * For High Sierra to Monterey:
# * Place the install app in the 'Applications' folder
# * This can be done manually or by running the downloaded package
# * Placing manually in the folder containing this script also works
# * Installer Apps in the folder containing this script take precedence
# * For Yosemite to Sierra (Alternative Option):
# * Place the install app in the 'Applications' folder
# * This can be done manually or by running the downloaded package
# * Placing manually in the folder containing this script also works
# * Installer Apps in the folder containing this script take precedence
# 4. Make this script executable and run it in Terminal:
# * Unzip the package to show the script file in Finder
# * Type "chmod +x" without quotes, add a space, then drag the script file from Finder unto Terminal and press "Enter"
# * Type "sh" without quotes, add a space, then drag the script file from Finder unto Terminal again and press "Enter"
# 5. Install Mac OS with the USB Installer once done
# * Name : Install_{{MAC_OS_NAME}}
## CUSTOM COLOURS ##
msg_status() {
printf "\033[0;35m$1\033[0m\n"
}
msg_info() {
printf "\033[0;33m$1\033[0m\n"
}
msg_error() {
printf "\033[0;31m$1\033[0m\n"
}
chiil_msg() {
msg_info 'NB: Patience ... This takes a while to complete'
msg_info ' Type password and press "Enter" if prompted'
msg_info ' Your password is not displayed while typing'
}
# createISO by Jeff Geerling as modified by Dayo Akanji
# This function creates the ISO image.
# Inputs: $1 = The name of the installer - located in Applications folder or local folder/PATH.
function createISO() {
local installerAppName
local isoName
local error
local SparseImageFile
local InstallAppVol
local InstallAppBaseSystem
if [ -e "${SCRIPT_DIR}/${1}" ] ; then
installerAppName="${SCRIPT_DIR}/${1}"
elif [ -e "/Applications/${1}" ] ; then
installerAppName="/Applications/${1}"
else
echo; echo
msg_info 'ERROR!!'
msg_error "Could Not Find Installer App"
runExit 'Error' ;
fi
# Remove Spaces in 'INSTALL_NAME' and use as ISO name
isoName=$( echo "${INSTALL_NAME}" | sed 's/ //g' )
error=0
SparseImageFile="${INSTALL_TEMP}/${isoName}.sparseimage"
InstallAppVol='/Volumes/install_app'
InstallAppBaseSystem="${installerAppName}/Contents/SharedSupport/BaseSystem"
sudo -v
msg_info "Using Installer App:- '${installerAppName}'"
msg_status "STEP 01 of 13: Create a Blank 16GB Single Partition Apple Partition Map ISO Image"
# Create INSTALL_TEMP folder
mkdir -p "${INSTALL_TEMP}"
# Just in case - delete any previous sparseimage
[ -e "${SparseImageFile}" ] && rm -f "${SparseImageFile}"
# increased size to 16G - 8G is too small for Catalina
hdiutil create -o "${INSTALL_TEMP}/${isoName}" -size 16g -layout SPUD -fs HFS+J -type SPARSE
sudo -v; echo
msg_status "STEP 02 of 13: Mount Installer Image"
if [ "${isoName}" == "Monterey" ] || [ "${isoName}" == "BigSur" ] ; then
hdiutil attach "${SparseImageFile}" -noverify -nobrowse -mountpoint "${InstallAppVol}"
elif [ -e "${installerAppName}" ] ; then
hdiutil attach "${installerAppName}/Contents/SharedSupport/InstallESD.dmg" -noverify -nobrowse -mountpoint "${InstallAppVol}"
error=$?
else
error=999
fi
if [ ${error} -ne 0 ] ; then
echo; echo
msg_info 'ERROR!!'
msg_error "Failed to mount the InstallESD.dmg from the installer at ${installerAppName}"
msg_error "Exiting on 'Error Code: ${error}'"
runExit 'Error' ;
fi
sudo -v; echo
msg_status "STEP 03 of 13: Mount Sparse Bundle for Package Addition"
if [ "${isoName}" == "Monterey" ] || [ "${isoName}" == "BigSur" ] ; then
echo "N/A ... Skipped for ${INSTALL_NAME}"
else
hdiutil attach "${SparseImageFile}" -noverify -nobrowse -mountpoint '/Volumes/install_build'
fi
sudo -v; echo
msg_status "STEP 04 of 13: Restore Base System into '${isoName}' ISO Image"
if [ "${isoName}" == "Monterey" ] || [ "${isoName}" == "BigSur" ] ; then
echo "N/A ... Skipped for ${INSTALL_NAME}"
elif [ "${isoName}" == "Catalina" ] || [ "${isoName}" == "Mojave" ] || [ "${isoName}" == "HighSierra" ] ; then
# Note by Jeff Geerling
#following asr command returns an error and prints:
#"Personalization succeeded"
#"asr: Couldn't personalize volume /Volumes/macOS Base System - Operation not permitted"
#I disabled SIP and the error still occurs.
#This was reported in Issue #73 for Mojave
#Added '|| true' for now to prevent the script from exiting as the steps that follow still seem to work fine for Catalina
sudo asr restore -source "${InstallAppBaseSystem}.dmg" -target '/Volumes/install_build' -noprompt -noverify -erase || true
else
sudo asr restore -source "${InstallAppVol}/BaseSystem.dmg" -target '/Volumes/install_build' -noprompt -noverify -erase
fi
sudo -v; echo
msg_status "STEP 05 of 13: Remove Package Link and Replace with Actual Files"
chiil_msg ;
if [ "${isoName}" == "Monterey" ] || [ "${isoName}" == "BigSur" ] ; then
echo "N/A ... Skipped for ${INSTALL_NAME}"
elif [ "${isoName}" == "Catalina" ] || [ "${isoName}" == "Mojave" ] || [ "${isoName}" == "HighSierra" ] ; then
ditto -V "${InstallAppVol}/Packages" "${VOL_BASE_DIR}/System/Installation/"
else
rm -v "${VOL_BASE_DIR}/System/Installation/Packages"
cp -rpv "${InstallAppVol}/Packages" "${VOL_BASE_DIR}/System/Installation/"
fi
sudo -v; echo
msg_status "STEP 06 of 13: Copy '${INSTALL_TARGET}' Dependencies"
msg_info 'NB: Type password and press "Enter" if prompted'
msg_info ' Your password is not displayed while typing'
sudo -v
if [ "${isoName}" == "Monterey" ] || [ "${isoName}" == "BigSur" ] ; then
CurrentMacOS=$(sw_vers -productVersion)
if [[ "${CurrentMacOS}" == *"10.12."* ]] ; then
PostHiSierra="False"
elif [[ "${CurrentMacOS}" == *"10.11."* ]] ; then
PostHiSierra="False"
elif [[ "${CurrentMacOS}" == *"10.10."* ]] ; then
PostHiSierra="False"
elif [[ "${CurrentMacOS}" == *"10.9."* ]] ; then
PostHiSierra="False"
elif [[ "${CurrentMacOS}" == *"10.8."* ]] ; then
PostHiSierra="False"
elif [[ "${CurrentMacOS}" == *"10.7."* ]] ; then
PostHiSierra="False"
elif [[ "${CurrentMacOS}" == *"10.6."* ]] ; then
PostHiSierra="False"
elif [[ "${CurrentMacOS}" == *"10.5."* ]] ; then
PostHiSierra="False"
elif [[ "${CurrentMacOS}" == *"10.4."* ]] ; then
PostHiSierra="False"
else
PostHiSierra="True"
fi
if [ "${PostHiSierra}" == "True" ] ; then
sudo "${installerAppName}/Contents/Resources/createinstallmedia" --volume "${InstallAppVol}" --nointeraction
else
sudo "${installerAppName}/Contents/Resources/createinstallmedia" --volume "${InstallAppVol}" --applicationpath "${installerAppName}"
fi
elif [ "${isoName}" == "Catalina" ] || [ "${isoName}" == "Mojave" ] || [ "${isoName}" == "HighSierra" ] ; then
ditto -V "${InstallAppBaseSystem}.chunklist" "${VOL_BASE_SYS}.chunklist"
ditto -V "${InstallAppBaseSystem}.dmg" "${VOL_BASE_SYS}.dmg"
else
cp -rpv "${InstallAppVol}/BaseSystem.chunklist" "${VOL_BASE_SYS}.chunklist"
cp -rpv "${InstallAppVol}/BaseSystem.dmg" "${VOL_BASE_SYS}.dmg"
fi
sudo -v; echo
msg_status "STEP 07 of 13: Unmount Installer Image"
if [ "${isoName}" == "Monterey" ] || [ "${isoName}" == "BigSur" ] ; then
hdiutil detach "/Volumes/Install macOS ${INSTALL_NAME}" -force # NOTE: force because "Resource busy"
else
hdiutil detach "${InstallAppVol}"
fi
sudo -v; echo
msg_status 'STEP 08 of 13: Unmount Sparse Bundle'
if [ "${isoName}" == "Monterey" ] || [ "${isoName}" == "BigSur" ] ; then
echo "N/A ... Skipped for ${INSTALL_NAME}"
else
hdiutil detach "${VOL_BASE_DIR}/"
fi
sudo -v; echo
msg_status "STEP 09 of 13: Resize '${isoName}' Sparse Bundle to Remove Free Space"
hdiutil resize -size `hdiutil resize -limits "${SparseImageFile}" | tail -n 1 | awk '{ print $1 }'`b "${SparseImageFile}"
echo "Resized '${isoName}' Sparse Bundle"
sudo -v; echo
msg_status "STEP 10 of 13: Convert '${isoName}' Sparse Bundle to ISO/CD Master"
chiil_msg ;
hdiutil convert "${SparseImageFile}" -format UDTO -o "${INSTALL_TEMP}/${isoName}"
sudo rm -vf "${SparseImageFile}"
sudo -v; echo
msg_status 'STEP 11 of 13: Convert ISO/CD Master to Regular Image'
sudo rm -rf "${HOME}/Desktop/${INSTALL_TARGET}.iso" || true
sudo mv -vf "${INSTALL_TEMP}/${isoName}.cdr" "${INSTALL_TEMP}/${INSTALL_TARGET}.iso"
sudo -v; echo
msg_status "STEP 12 of 13: Rename '${INSTALL_ID}'..."
sudo diskutil rename "${INSTALL_ID}" "${INSTALL_TARGET}"
sudo -v; echo
msg_status "STEP 13 of 13: Finishing"
chiil_msg ;
sudo mv -vf "${INSTALL_TEMP}/${INSTALL_TARGET}.iso" "${HOME}/Desktop/${INSTALL_TARGET}.iso"
sudo rm -rf "${INSTALL_TEMP}" || true
echo; echo
msg_info 'Complete'
echo; echo
msg_status 'NB: Use a tool such as BalenaEtcher to create bootable USB'
msg_status " From: '${HOME}/Desktop/${INSTALL_TARGET}.iso'"
runExit ;
}
# installerExists by Jeff Geerling
# Returns 0 if the installer was found locally or in '/Applications'. 1 if not.
function installerExists() {
local installerAppName
local result
installerAppName="${1}"
result=1
if [ -e "${SCRIPT_DIR}/${installerAppName}" ] ; then
result=0
elif [ -e "/Applications/${installerAppName}" ] ; then
result=0
fi
return ${result}
}
## EXIT HANDLER ##
runExit() {
flag=${1:-Norm}
if [ "${flag}" != 'Norm' ] ; then
rm -rf "${INSTALL_TEMP}"
echo; echo
msg_info "Runtime Error!!"
msg_error "Could Not Create USB Installer"
echo; echo
exit 1
else
echo; echo
msg_info 'All Done!'
echo; echo
msg_info '################################'
msg_info ' ## Create Mac OS Install USB ##'
msg_info ' ################################'
echo; echo
exit 0
fi
}
## ERROR HANDLER ##
runErr() {
rm -rf "${INSTALL_TEMP}"
echo; echo
msg_info "Runtime Error!!"
msg_error "Could Not Create USB Installer"
echo; echo
exit 1
}
trap runErr ERR
##
## Start Procedural Code
##
INSTALL_TARGET='NotSet'
INSTALL_BASIC='Install OS X'
INSTALL_TYPE='NotSet'
INSTALL_NAME='NotSet'
INSTALL_TEMP='/tmp/VersionOSX'
INSTALL_BASE='OS X Base System'
INSTALL_APP='Mac OS Install'
INSTALL_ESD='/Volumes/TMP_ESD'
INSTALL_ID='USB_Maker'
INSTALL_X='InstallMacOSX'
TYPE_OSX="macOS"
TMP_STR='NotSet'
USE_APP='NotSet'
VOL_BASE_SYS='NotSet'
VOL_BASE_DIR='NotSet'
if [ ! -d "/Volumes/${INSTALL_ID}" ] ; then
err_msg="Connect a correctly sized USB stick labelled as '${INSTALL_ID}' and rerun this script."
echo; echo
msg_info 'ERROR!!'
msg_error "${err_msg}"
echo; echo
exit 1
fi
# Resolve TMP_SOURCE until the file is no longer a symlink
TMP_SOURCE=${BASH_SOURCE[0]}
while [ -L "${TMP_SOURCE}" ]; do
DIR=$( cd -P "$( dirname "${TMP_SOURCE}" )" >/dev/null 2>&1 && pwd )
TMP_SOURCE=$(readlink "${TMP_SOURCE}")
# if ${TMP_SOURCE} is relative symlink, resolve relative to symlink file location
[[ ${TMP_SOURCE} != /* ]] && TMP_SOURCE=${DIR}/${TMP_SOURCE}
done
SCRIPT_DIR=$( cd -P "$( dirname "${TMP_SOURCE}" )" >/dev/null 2>&1 && pwd )
sudo clear
echo; echo
msg_info ' ################################'
msg_info ' ## Create Mac OS Install USB ##'
msg_info '################################'
echo; echo
msg_info '## STAGE 1 of 4: Confirm Install Target ##'
msg_info '------------------------------------------'
msg_status 'STEP 01 of 02: Get Mac OS Target'
PS3='Enter Corresponding Number for Mac OS Version or Exit: '
options=("Monterey" "Big Sur" "Catalina" "Mojave" "High Sierra" "Sierra" "El Capitan" "Yosemite" "Mavericks" "Mountain Lion" "Lion" "Exit")
select opt in "${options[@]}"
do
case $opt in
"Monterey" | "Big Sur" | "Catalina" | "Mojave" | "High Sierra")
INSTALL_NAME="${opt}"
USE_APP='True'
break
;;
"Sierra")
INSTALL_X='InstallOS'
INSTALL_NAME="${opt}"
USE_APP='Maybe'
INSTALL_BASIC='Install macOS'
INSTALL_APP="Install Mac OS ${INSTALL_NAME}.app"
break
;;
"El Capitan" | "Yosemite")
INSTALL_NAME="${opt}"
USE_APP='Maybe'
INSTALL_APP="Install Mac OS X ${INSTALL_NAME}.app"
break
;;
"Mountain Lion")
INSTALL_NAME="${opt}"
USE_APP='False'
INSTALL_BASE='Mac OS X Base System'
INSTALL_BASIC='Install Mac OS X'
INSTALL_APP="Install OS X ${INSTALL_NAME}.app"
break
;;
"Lion")
INSTALL_NAME="${opt}"
USE_APP='False'
INSTALL_BASE='Mac OS X Base System'
INSTALL_BASIC='Install Mac OS X'
INSTALL_APP="Install Mac OS X ${INSTALL_NAME}.app"
break
;;
"Mavericks")
TMP_STR='Exit'
INSTALL_NAME="${opt}"
break
;;
"Exit")
TMP_STR='Exit'
break
;;
*)
echo; echo
msg_info 'ERROR!!'
msg_error "Invalid Selection:- '${REPLY}'"
echo; echo
exit 1
;;
esac
done
sudo -v; echo
msg_status "STEP 02 of 02: Returned '${INSTALL_NAME}'"
if [ "${TMP_STR}" == 'Exit' ] ; then
if [ "${INSTALL_NAME}" == 'Mavericks' ] ; then
echo; echo
msg_info 'NOTE:'
msg_status "Mavericks Installer *IS NOT* Supported"
fi
runExit 'Exit' ;
fi
sudo -v; echo
msg_info 'Completed Stage 1'
echo; echo
msg_info '## STAGE 2 of 4: Confirm Prerequisites ##'
msg_info '-----------------------------------------'
msg_status "STEP 01 of 02: Validate Installer Name..."
gotError="False"
INSTALL_TARGET=$( echo "Install_${INSTALL_NAME}" | sed 's/ //g' )
INSTALL_STICK="/Volumes/${INSTALL_TARGET}"
if [ -d "${INSTALL_STICK}" ] ; then
err_msg="Unmount conflicting '${INSTALL_TARGET}' volume and rerun this script"
gotError="True"
fi
TMP_STR='NotSet'
if [ "${gotError}" == 'False' ] ; then
sudo -v; echo
msg_status "STEP 02 of 02: Validate Misc Other..."
# Check if using installer app for Yosemite to Sierra
if [ "${USE_APP}" == 'Maybe' ] ; then
USE_APP='False'
if [ "${INSTALL_NAME}" == 'Sierra' ] ; then
TMP_STR='macOS'
elif [ "${INSTALL_NAME}" == 'El Capitan' ] || [ "${INSTALL_NAME}" == 'Yosemite' ] ; then
TMP_STR='OS X'
fi
if [ "${TMP_STR}" != 'NotSet' ] ; then
if installerExists "Install ${TMP_STR} ${INSTALL_NAME}.app" ; then
USE_APP='True'
fi
fi
fi
TMP_STR='NotSet'
if [ "${USE_APP}" == 'False' ] ; then
# Ensure DMG is mounted
if [ ! -d "/Volumes/${INSTALL_BASIC}" ] ; then
err_msg="Mount the '${INSTALL_X}.dmg' file and rerun this script."
gotError="True"
fi
else
# Note by Jeff Geerling
# Eject installer disks in case opened after download from App Store
# grep "partition_scheme" because "partition" finds too many lines
for disk in $(hdiutil info | grep /dev/disk | grep partition_scheme | cut -f 1); do
hdiutil detach -force ${disk}
done
fi
fi
# Error/Exit Handling
if [ "${gotError}" == 'True' ] ; then
echo; echo
msg_info 'ERROR!!'
msg_error "${err_msg}"
runExit 'Error' ;
fi
sudo -v; echo
msg_info 'Completed Stage 2'
if [ "${USE_APP}" == 'True' ] ; then
echo; echo
msg_info '## STAGE 3 of 4: Find Installer ##'
msg_info '----------------------------------'
msg_status "STEP 01 of 01: Checking for Installer App..."
if [[ "${INSTALL_NAME}" == "Monterey" || "${INSTALL_NAME}" == "Big Sur" || "${INSTALL_NAME}" == "Catalina" || "${INSTALL_NAME}" == "Mojave" ]] ; then
if installerExists "Install macOS ${INSTALL_NAME}.app" ; then
INSTALL_TYPE='macOS'
TYPE_OSX='macOS'
fi
elif [[ "${INSTALL_NAME}" == "High Sierra" || "${INSTALL_NAME}" == "Sierra" ]] ; then
# DA-TAG: The Sierras are odd with 'macOS' app name but 'OS X' elsewhere
if installerExists "Install macOS ${INSTALL_NAME}.app" ; then
INSTALL_TYPE='macOS'
TYPE_OSX='OS X'
fi
elif [[ "${INSTALL_NAME}" == "El Capitan" || "${INSTALL_NAME}" == "Yosemite" ]] ; then
if installerExists "Install OS X ${INSTALL_NAME}.app" ; then
INSTALL_TYPE='OS X'
TYPE_OSX='OS X'
fi
fi
if [ "${TYPE_OSX}" == 'NotSet' ] ; then
echo; echo
msg_info 'ERROR!!'
msg_error "Could not find valid installer app file"
runExit 'Error' ;
fi
echo "Found Installer App for ${INSTALL_NAME}"
VOL_BASE_DIR="/Volumes/${TYPE_OSX} Base System"
VOL_BASE_SYS="${VOL_BASE_DIR}/BaseSystem"
TMP_STR='NotSet'
sudo -v; echo
msg_info 'Completed Stage 3'
echo; echo
msg_info '## STAGE 4 of 4: Create ISO Image ##'
msg_info '------------------------------------'
createISO "Install ${INSTALL_TYPE} ${INSTALL_NAME}.app"
else
echo; echo
msg_info '## STAGE 3 of 4: Deconstruct Installer ##'
msg_info '-----------------------------------------'
msg_status "STEP 01 of 05: Clearing '${INSTALL_TEMP}'..."
rm -rfv "${INSTALL_TEMP}"
sudo -v; echo
msg_status "STEP 02 of 05: Creating '${INSTALL_TEMP}'..."
chiil_msg ;
pkgutil --expand "/Volumes/${INSTALL_BASIC}/${INSTALL_X}.pkg" "${INSTALL_TEMP}"
sudo -v; echo
msg_status "STEP 03 of 05: Ejecting '${INSTALL_BASIC}'..."
sudo diskutil eject "${INSTALL_BASIC}"
sudo -v; echo
msg_status 'STEP 04 of 05: Preparing and Attaching InstallESD...'
hdiutil attach "${INSTALL_TEMP}/${INSTALL_X}.pkg/InstallESD.dmg" -noverify -nobrowse -mountpoint "${INSTALL_ESD}"
sudo -v; echo
msg_status 'STEP 05 of 05: Preparing and Aligning BaseSystem...'
chiil_msg ;
sudo asr restore -source "${INSTALL_ESD}/BaseSystem.dmg" -target "/Volumes/${INSTALL_ID}" -noprompt -noverify -erase || true
sudo -v; echo
msg_info 'Completed Stage 3'
echo; echo
msg_info '## STAGE 4 of 4: Repackage Installer ##'
msg_info '---------------------------------------'
msg_status "STEP 01 of 04: Preparing Target..."
diskutil rename "${INSTALL_BASE}" "${INSTALL_TARGET}"
rm -v "${INSTALL_STICK}/System/Installation/Packages"
sudo -v; echo
msg_status 'STEP 02 of 04: Reconstituting ESD...'
chiil_msg ;
cp -rpv "${INSTALL_ESD}/BaseSystem.chunklist" "${INSTALL_STICK}/"
cp -rpv "${INSTALL_ESD}/Packages" "${INSTALL_STICK}/System/Installation"
cp -rpv "${INSTALL_ESD}/BaseSystem.dmg" "${INSTALL_STICK}/"
hdiutil detach "${INSTALL_ESD}" || true
sudo -v; echo
msg_status 'STEP 03 of 04: Relabelling Volume and Updating VolumeIcon...'
sudo bless --folder "${INSTALL_STICK}/System/Library/CoreServices" --label "${INSTALL_TARGET}"
InstallIcon="${INSTALL_STICK}/${INSTALL_APP}/Contents/Resources/InstallAssistant.icns"
if [ ! -f "${InstallIcon}" ]; then
INSTALL_APP="${INSTALL_STICK}/Install OS X ${INSTALL_NAME}.app"
InstallIcon="${INSTALL_APP}/Contents/Resources/InstallAssistant.icns"
if [ ! -f "${InstallIcon}" ]; then
INSTALL_APP="${INSTALL_STICK}/Install Mac OS X ${INSTALL_NAME}.app"
InstallIcon="${INSTALL_APP}/Contents/Resources/InstallAssistant.icns"
if [ ! -f "${InstallIcon}" ]; then
INSTALL_APP="${INSTALL_STICK}/Install Mac OS ${INSTALL_NAME}.app"
InstallIcon="${INSTALL_APP}/Contents/Resources/InstallAssistant.icns"
if [ ! -f "${InstallIcon}" ]; then
INSTALL_APP="${INSTALL_STICK}/Install macOS ${INSTALL_NAME}.app"
InstallIcon="${INSTALL_APP}/Contents/Resources/InstallAssistant.icns"
fi
fi
fi
fi
if [ -f "${InstallIcon}" ]; then
cp -v "${InstallIcon}" "${INSTALL_STICK}/.VolumeIcon.icns"
else
echo 'Skipped VolumeIcon Update ... Not Found'
fi
sudo -v; echo
msg_status 'STEP 04 of 04: Finishing...'
chiil_msg ;
cd "${HOME}" || true
sudo rm -rf "${INSTALL_TEMP}" || true
sudo diskutil eject "${INSTALL_TARGET}" || true
sudo -v; echo
msg_info 'Completed Stage 4'
runExit ;
fi
@johnpitchko
Copy link

This worked great for creating a bootable USB for OSX Lion for an old 2013 Macbook Air. The process was smooth, easy to follow, and comprehensive. Would be happy to send you some $$$ as a tip if you accept that. Thank you for building and sharing this!

@startergo
Copy link

Dayo why did you skip Mavericks? Some people have legitimate Mavericks apps.

@dakanji
Copy link
Author

dakanji commented Jan 27, 2024

Hi ... Didn't have one at the time but IIRC, the one I did get had a different structure and initial attempts failed.
Didn't try too hard to sort it out and moved on given that Apple was not offering it like the others anyway.

@onekingnqueen
Copy link

Hi,thanks for this scripts.I made several bootable macos,but it's wired that some Volume icons do not show up,see attched photo.For Lion,when running the scripts,it shows:Skipped ... VolumeIcon not found.I check the path of InstallAssistant.icns,this icns exists
Snipaste_2024-04-25_10-46-57

@startergo
Copy link

Is this path existing:

/Volumes/Lion Installer/Install OS X Lion/Contents/Resources/InstallAssistant.icns

@dakanji
Copy link
Author

dakanji commented Apr 25, 2024

@onekingnqueen ... Thanks for the report.

Should be fixed now.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment