#!/bin/bash␊ |
␊ |
␊ |
diskloader="boot0"␊ |
diskloaderdualboot="boot0hfs"␊ |
partitionloaderhfs="boot1h"␊ |
partitionloaderfat="boot1f32"␊ |
filesystemloader="boot"␊ |
diskloader="/usr/standalone/i386/boot0"␊ |
diskloaderdualboot="/usr/standalone/i386/boot0hfs"␊ |
partitionloaderhfs="/usr/standalone/i386/boot1h"␊ |
partitionloaderfat="/usr/standalone/i386/boot1f32"␊ |
filesystemloader="/usr/standalone/i386/boot"␊ |
bootervolumename="EFI"␊ |
booterextensions="Extra/Extensions"␊ |
␊ |
bootresources="${0%/*}"␊ |
␊ |
diskmicrocodetype[1]="GRUB,47525542"␊ |
diskmicrocodetype[2]="LILO,4c494c4f"␊ |
␊ |
|
# $1 volume␊ |
␊ |
osxvolume="${@}"␊ |
bootresources="${0%/*}"␊ |
echo "$bootresources"␊ |
␊ |
if [ -z "${osxvolume}" ]; then␊ |
␉echo␊ |
␉echo "Cannot find the volume. Exiting."␊ |
␉echo␊ |
␉exit␊ |
fi␊ |
␊ |
osxbootdev=$( df "${osxvolume}" | sed -n '2p' | awk '{print $1}' )␊ |
bootdev=$( df "${osxvolume}" | sed -n '2p' | awk '{print $1}' )␊ |
␊ |
if [ "${osxbootdev}" = "${osxbootdev#*disk*s}" ]; then␊ |
if [ "${bootdev}" = "${bootdev#*disk*s}" ]; then␊ |
␉echo␊ |
␉echo "ERROR Volume does not use slices."␊ |
␉echo "Volume may be stored on a RAID array."␊ |
␉echo␊ |
␉exit␉␉␉␉␊ |
␉exit␊ |
fi␊ |
␊ |
bootuuid=$( diskutil info "$bootdev" | grep Volume\ UUID | awk {'print $3'} )␊ |
partitiontable=$( diskutil list ${bootdev%s*} | sed -n '3p' | awk '{print $2}' )␊ |
␊ |
if [ ${partitiontable} != "GUID_partition_scheme" ]; then␊ |
␉echo␊ |
␉echo "ERROR Volume is not on a GPT partitioned disc."␊ |
␉echo␊ |
␉exit␊ |
fi␊ |
␊ |
echo "==============================================="␊ |
echo "Partition Type Identified:"␊ |
echo "**************************"␊ |
echo "GPT found."␊ |
echo "-----------------------------------------------"␊ |
echo ""␊ |
echo ""␊ |
␊ |
␊ |
echo "==============================================="␊ |
echo "Installer Variables Part 1:"␊ |
echo "***************************"␊ |
echo "OS X Volume is ${osxvolume}"␊ |
echo "OX X Volume device is ${bootdev}"␊ |
echo "OS X Volume UUID is ${bootuuid}"␊ |
echo "-----------------------------------------------"␊ |
echo ""␊ |
echo ""␊ |
␊ |
␊ |
bootvolume="/Volumes/$bootervolumename"␊ |
bootdev=${osxbootdev%s*}s1␊ |
bootdev=${bootdev%s*}s1␊ |
bootrdev=${bootdev/disk/rdisk}␊ |
bootdisk=${bootdev%s*}␊ |
bootrdisk=${bootdisk/disk/rdisk}␊ |
bootslice=${bootdev#*disk*s}␊ |
␊ |
␊ |
echo "==============================================="␊ |
echo "Installer Variables:"␊ |
echo "********************"␊ |
echo "OS X Volume is ${osxvolume}"␊ |
echo "OX X Volume device is ${osxbootdev}"␊ |
echo "bootdev: EFI Volume device is ${bootdev}"␊ |
echo "bootrdev: EFI Volume raw device is ${bootrdev}"␊ |
echo "bootslice: EFI Volume slice is ${bootslice}"␊ |
echo "bootdisk: Disk device is ${bootdisk}"␊ |
echo "bootrdisk: Disk raw device is ${bootrdisk}"␊ |
echo "diskloader: Disk loader is ${diskloader}"␊ |
echo "diskloaderdualboot: Disk loader is ${diskloaderdualboot}"␊ |
echo "partitionloaderhfs: Partition loader is ${partitionloaderhfs}"␊ |
echo "partitionloaderfat: Partition loader is ${partitionloaderfat}"␊ |
echo "filesystemloader: Filesystem loader is ${filesystemloader}"␊ |
echo "bootresources: Boot Resources is ${bootresources}"␊ |
echo "Installer Variables Part 2:"␊ |
echo "***************************"␊ |
echo "EFI Volume device is ${bootdev}"␊ |
echo "EFI Volume raw device is ${bootrdev}"␊ |
echo "EFI Volume slice is ${bootslice}"␊ |
echo "Disk device is ${bootdisk}"␊ |
echo "Disk raw device is ${bootrdisk}"␊ |
echo "Disk loader normal is ${diskloader}"␊ |
echo "Disk loader dual boot is ${diskloaderdualboot}"␊ |
echo "Partition loader HFS is ${partitionloaderhfs}"␊ |
echo "Partition loader FAT is ${partitionloaderfat}"␊ |
echo "Filesystem loader is ${filesystemloader}"␊ |
echo "-----------------------------------------------"␊ |
echo ""␊ |
echo ""␊ |
}␊ |
␊ |
␊ |
checkdiskmicrocodetype ()␊ |
{␊ |
echo "==============================================="␊ |
echo "Diskmicrocodetype: CHECKED FOR EFI"␊ |
echo "Diskmicrocodetype:"␊ |
echo "******************"␊ |
␊ |
diskmicrocode=$( dd 2>/dev/null if=${bootdisk} count=1 | dd 2>/dev/null count=1 bs=437 | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
␊ |
diskmicrocodetypecounter=0␊ |
while [ ${diskmicrocodetypecounter} -lt ${#diskmicrocodetype[@]} ]; do␊ |
diskmicrocodetypecounter=$(( ${diskmicrocodetypecounter} + 1 ))␊ |
|
echo ""␊ |
}␊ |
␊ |
␊ |
checkdiskmicrocode ()␊ |
{␊ |
echo "==============================================="␊ |
echo "Diskmicrocode: CHECKED FOR EFI"␊ |
echo "Diskmicrocode:"␊ |
echo "*************"␊ |
␊ |
# Note: The checks for Boot0 and Boot0hfs assume the code doesn't change!!␊ |
|
diskmicrocode=$( dd 2>/dev/null if=${bootdisk} count=1 | dd 2>/dev/null count=1 bs=437 | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
diskmicrocodemd5=$( dd 2>/dev/null if=${bootdisk} count=1 | dd 2>/dev/null count=1 bs=437 | md5 )␊ |
␊ |
#echo "${diskmicrocode}"␊ |
␊ |
if [ $( echo "${diskmicrocode}" | awk -F0 '{print NF-1}' ) = 874 ]; then␊ |
␉echo "Diskmicrocode = 874 (Which means the first 437 bytes of the MBR Disk Sector is blank)"␊ |
␉if [ "${1}" = "set" ]; then␊ |
|
␉␉␉␉echo "diskupdate is now set to true."␊ |
␉␉␉fi␊ |
␉␉fi␊ |
␊ |
␉␊ |
␉␉# If neither a Windows or Chameleon Boot Loader exists␊ |
␉␉if [ "${stage0type}" != "0b807c" ] && [ "${stage0type}" != "0a803c" ] && [ "${windowsloader}" != "33c08ed0" ] ; then␊ |
␉␉␉test=$(echo "${diskmicrocode}" | awk -F0 '{print NF-1}' )␊ |
|
␉␉test=$(echo "${diskmicrocode}" | awk -F0 '{print NF-1}' )␊ |
␉␉echo "Disk microcode found: ${test}"␊ |
␉fi␊ |
␉echo "Disk microcode MD5 is ${diskmicrocodemd5}"␊ |
fi␊ |
echo "-----------------------------------------------"␊ |
echo ""␊ |
|
checkdisksignature ()␊ |
{␊ |
echo "==============================================="␊ |
echo "Find Disk Signature: CHECKED FOR EFI"␊ |
echo "Find Disk Signature:"␊ |
echo "*************"␊ |
␊ |
disksignature=$( dd 2>/dev/null if=${bootdisk} count=1 | dd 2>/dev/null count=4 bs=1 skip=440 | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
␊ |
echo "${disksignature}"␊ |
|
}␊ |
␊ |
␊ |
␊ |
checkpartitionbootcode ()␊ |
{␊ |
echo "==============================================="␊ |
echo "Find Partition Bootcode: CHECKED FOR EFI"␊ |
echo "Find Partition Bootcode:"␊ |
echo "************************"␊ |
␊ |
# 1 action ( check or set )␊ |
|
partitionbootcode=$( dd if=${bootrdev} count=1 2>/dev/null | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
partitionbootcodeextended=$( dd if=${bootrdev} count=1 skip=1 2>/dev/null | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
␊ |
echo "${partitionbootcode}"␊ |
␊ |
if [ $( echo "${partitionbootcode}" | awk -F0 '{print NF-1}' ) = 1024 ]; then␊ |
␉echo "partitionbootcode = 1024 (Which means the whole 512 bytes of the MBR Disk Sector is blank)"␊ |
␉if [ "${1}" = "set" ]; then␊ |
|
␉fi␊ |
␉echo "Partition bootcode MD5 is ${partitionbootcodemd5}"␊ |
fi␊ |
␊ |
echo "-----------------------------------------------"␊ |
echo ""␊ |
echo ""␊ |
}␊ |
␊ |
␊ |
#checkpartitionactive ()␊ |
#{␊ |
#partitionactive=$( fdisk440 -d ${bootrdisk} | grep -n "*" | awk -F: '{print $1}')␊ |
␊ |
#if [ -n "${partitionactive}" ]; then ␊ |
#␉echo "Partition flagged active is ${partitionactive}"␊ |
#else␊ |
#␉echo "No partition flagged active."␊ |
#fi␊ |
␊ |
#}␊ |
}␊ |
␊ |
␊ |
start ${3}␊ |
␊ |
␊ |
echo "==============================================="␊ |
echo "Check the format of the EFI partition"␊ |
echo "***************************"␊ |
echo "*************************************"␊ |
␊ |
if [ "$( df | grep ${bootdev} )" ]; then␊ |
␉echo "EFI partition is currently mounted, so un-mounting it"␊ |
#␉umount -f ${bootdev}␊ |
␉echo "${bootdev} is currently mounted, so un-mounting it"␊ |
␉umount -f ${bootdev}␊ |
else␊ |
␉echo "EFI partition is currently not mounted"␊ |
fi ␊ |
␊ |
#if [[ `dd if=/dev/disk${1}s1 count=8 bs=1 skip=82 | uuencode -m -|head -n 2|tail -n 1` != "RkFUMzIgICA=" ]]; then␊ |
#␉echo "${bootdev} isn't a FAT32 partition"␊ |
#␉newfs_msdos -v "${bootervolumename}" "${bootdev}"␊ |
#fi ␊ |
␊ |
if [ "$( fstyp ${bootdev} | grep hfs )" ]; then␊ |
␉echo "${bootdev} is a currently formatted as HFS"␊ |
␉efiformat="hfs"␊ |
|
if [ "$( fstyp ${bootdev} | grep msdos )" ]; then␊ |
␉echo "${bootdev} is currently formatted as msdos"␊ |
␉efiformat="msdos"␊ |
#␉echo "Executing command: newfs_hfs -v ${bootervolumename} ${bootdev}"␊ |
#␉newfs_hfs -v "${bootervolumename}" "${bootdev}"␊ |
fi␊ |
␉#echo "Executing command: newfs_msdos -F 32 ${bootdev}"␊ |
␉#newfs_msdos -F 32 "${bootdev}"␊ |
fi ␊ |
echo "-----------------------------------------------"␊ |
echo ""␊ |
echo ""␊ |
␊ |
␊ |
␊ |
␊ |
echo "==============================================="␊ |
echo "Determine Partition Scheme: CHANGED FOR EFI"␊ |
echo "***************************"␊ |
␊ |
partitiontable=$( dd 2>/dev/null if=${bootdisk} count=1 skip=1 | dd 2>/dev/null count=8 bs=1 | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
if [ "${partitiontable:0:16}" == "4546492050415254" ]; then␉␊ |
␉partitiontable=$( dd 2>/dev/null if=${bootdisk} count=1 | dd 2>/dev/null count=64 bs=1 skip=446 | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
␉if [ "${partitiontable:8:2}" == "ee" ]; then␊ |
␉␉echo "Found System ID 'EE' to identify GPT Partition"␊ |
␉␉if [ "${partitiontable:40:2}" == "00" ] && [ "${partitiontable:72:2}" == "00" ] && [ "${partitiontable:104:2}" == "00" ]; then␊ |
␉␉␉echo "Found System ID '00' for each remaining possible partition"␊ |
␉␉␉partitiontable="GPT"␊ |
␉ ␉else␊ |
␉␉␉partitiontable="GPT/MBR"␊ |
␉␉fi␊ |
␉fi␊ |
else␊ |
␉echo "ERROR Volume is not on a GPT partitioned disc."␊ |
␉exit␊ |
fi␊ |
␊ |
echo "${partitiontable} found."␊ |
echo "-----------------------------------------------"␊ |
echo ""␊ |
echo ""␊ |
␊ |
␊ |
diskupdate=false␊ |
␊ |
␊ |
|
checkdiskmicrocodetype␊ |
checkdiskmicrocode set␊ |
checkpartitionbootcode set␊ |
#checkpartitionactive␊ |
␊ |
␊ |
␊ |
echo "==============================================="␊ |
echo "Can we install the Chameleon bootloader files? : CHECKED FOR EFI"␊ |
echo "Can we install the Chameleon bootloader files?:"␊ |
echo "**********************************************"␊ |
␊ |
if ${diskupdate}; then␊ |
|
␉#---------------------------------------------------------------------␊ |
␊ |
␉if [ ${disksignature} == "00000000" ]; then␊ |
␉␉echo "Executing command: fdisk440 -u -f /usr/standalone/i386/${diskloader} -y ${bootdisk}"␊ |
␉␉fdisk440 -u -f "${bootvolume}/usr/standalone/i386/${diskloader}" -y ${bootdisk}␊ |
␉␉echo "Executing command: fdisk440 -u -f ${diskloader} -y ${bootdisk}"␊ |
␉␉fdisk440 -u -f "${osxvolume}/${diskloader}" -y ${bootdisk}␊ |
␉else␊ |
␉␉#---------------------------------------------------------------------␊ |
␉␉# If it exists then Windows is also installed on the HDD and we need to write boot0hfs␊ |
␉␉#---------------------------------------------------------------------␊ |
␉␉echo "Executing command: fdisk440 -u -f /usr/standalone/i386/${diskloaderdualboot} -y ${bootdisk}"␊ |
␉␉fdisk440 -u -f "${bootvolume}/usr/standalone/i386/${diskloaderdualboot}" -y ${bootdisk}␊ |
␊ |
␉␉echo "Executing command: fdisk440 -u -f ${diskloaderdualboot} -y ${bootdisk}"␊ |
␉␉fdisk440 -u -f "${osxvolume}/${diskloaderdualboot}" -y ${bootdisk}␊ |
␉fi␊ |
else␊ |
echo "Diskupdate is false, so no stage 0 file was written"␊ |
␉echo "Diskupdate is false, so no stage 0 file was written"␊ |
fi␊ |
␊ |
␊ |
#echo "Executing command: dd if=${partitionloader} of=${bootrdev}"␊ |
#dd if="${osxvolume}/${partitionloader}" of=${bootrdev}␊ |
␊ |
echo "Prepare Stage 1 loader"␊ |
␊ |
echo "Executing command: dd if=${bootrdev} count=1 bs=512 of=/tmp/origbs"␊ |
dd if=${bootrdev} count=1 bs=512 of=/tmp/origbs␊ |
␊ |
if [ ${efiformat} = "hfs" ]; then␊ |
␉echo "Executing command: dd if=/usr/standalone/i386/${partitionloaderhfs} of=${bootrdev}"␊ |
␉dd if="${bootvolume}/usr/standalone/i386/${partitionloaderhfs}" of=${bootrdev}␊ |
␉echo "Executing command: cp ${osxvolume}/${partitionloaderhfs} /tmp/newbs"␊ |
␉cp "${osxvolume}/${partitionloaderhfs}" /tmp/newbs␊ |
fi␊ |
␊ |
if [ ${efiformat} = "msdos" ]; then␊ |
␉echo "Executing command: dd if=/usr/standalone/i386/${partitionloaderfat} of=${bootrdev}"␊ |
␉dd if="${bootvolume}/usr/standalone/i386/${partitionloaderfat}" of=${bootrdev}␊ |
␉echo "Executing command: cp ${osxvolume}/${partitionloaderfat} /tmp/newbs"␊ |
␉cp "${osxvolume}/${partitionloaderfat}" /tmp/newbs␊ |
fi␊ |
␊ |
echo "Executing command: cp /usr/standalone/i386/${filesystemloader} ${bootvolume}"␊ |
cp "${bootvolume}/usr/standalone/i386/${filesystemloader}" "${bootvolume}"␊ |
echo "Executing command: dd if=/tmp/origbs of=/tmp/newbs skip=3 seek=3 bs=1 count=87 conv=notrunc"␊ |
dd if=/tmp/origbs of=/tmp/newbs skip=3 seek=3 bs=1 count=87 conv=notrunc␊ |
␊ |
echo "Executing command: ${bootresources}/Tools/SetFile -a V ${bootvolume}/${filesystemloader}"␊ |
"${bootresources}/Tools/SetFile" -a V "${bootvolume}/${filesystemloader}"␊ |
echo "Write Stage 1 loader"␊ |
␊ |
echo "Executing command: dd of=${bootrdev} count=1 bs=512 if=/tmp/newbs"␊ |
dd if=/tmp/newbs of=${bootrdev} count=1 bs=512␊ |
␊ |
echo "-----------------------------------------------"␊ |
echo ""␊ |
echo ""␊ |
␊ |
␊ |
echo "==============================================="␊ |
echo "Set Active Partition ONLY if Windows is not installed: CHECKED FOR EFI"␊ |
echo "Set Active Partition ONLY if Windows is not installed:"␊ |
echo "*****************************************************"␊ |
␊ |
# If table is MBR make the correct slice active. If table is GPT make the first partition active (BadAxe compatibility).␊ |
#[ "${partitiontable}" = "GUID_partition_scheme" ] && bootslice=1␊ |
#if [[ "${partitiontable}" = "FDisk_partition_scheme" || "${partitiontable}" = "GUID_partition_scheme" ]]; then␊ |
#␉fdisk440 -e ${bootdisk} <<-MAKEACTIVE␊ |
#␉print␊ |
#␉flag ${bootslice}␊ |
#␉write␊ |
#␉y␊ |
#␉quit␊ |
#␉MAKEACTIVE␊ |
#fi␊ |
␊ |
if [ ${disksignature} == "00000000" ]; then␊ |
␉# echo "Windows is not installed so let's change the active partition"␊ |
␊ |
|
echo ""␊ |
␊ |
␊ |
#checkdiskmicrocode check␊ |
#checkdisksignature␊ |
#checkpartitionbootcode check␊ |
#checkpartitionactive␊ |
␊ |
␊ |
echo "==============================================="␊ |
echo "Check EFI Partition:"␊ |
echo "***************************"␊ |
if [ -d /Volumes/EFI ]; then␊ |
␉umount -f /Volumes/EFI␊ |
␉rm -R -f /Volumes/EFI␊ |
echo "Mount EFI partition:"␊ |
echo "********************"␊ |
if [ ${efiformat} = "hfs" ]; then␊ |
␉[ -d "${bootvolume}" ] || mkdir -p "${bootvolume}"␊ |
␉echo "Executing command: mount_hfs -u 0 -g 0 ${bootdev} ${bootvolume}"␊ |
␉mount_hfs -u 0 -g 0 "${bootdev}" "${bootvolume}"␊ |
else␊ |
␉[ -d "${bootvolume}" ] || mkdir -p "${bootvolume}"␊ |
␉echo "Executing command: mount_msdos -u 0 -g 0 ${bootdev} ${bootvolume}"␊ |
␉mount_msdos -u 0 -g 0 "${bootdev}" "${bootvolume}"␊ |
fi␊ |
echo "-----------------------------------------------"␊ |
echo ""␊ |
echo ""␊ |
␊ |
␊ |
echo "==============================================="␊ |
echo "/Extra/Extensions Folder"␊ |
echo "*****************************************************"␊ |
if [ -d "${bootvolume}/Extra/Extensions" ]; then␊ |
␉echo "Duplicating Extra to ExtraBackup Folder"␊ |
␉mkdir -p "${bootvolume}/ExtraBackup"␊ |
␉cp -f -R "${bootvolume}/Extra" "${bootvolume}/ExtraBackup"␊ |
else␊ |
␉echo "Create /Extra/Extensions"␊ |
␉mkdir -p "${bootvolume}/Extra/Extensions"␊ |
fi␊ |
␉␊ |
echo "Write Stage 2 loader"␊ |
echo "********************"␊ |
␊ |
echo "Executing command: cp ${osxvolume}${filesystemloader} ${bootvolume}/boot"␊ |
cp "${osxvolume}${filesystemloader}" "${bootvolume}/boot"␊ |
echo "boot written"␊ |
␊ |
echo "-----------------------------------------------"␊ |
echo ""␊ |
echo ""␊ |
␊ |
# setup link for extras␊ |
#[ -h "${2}/.Chameleon" ] && unlink "${2}/.Chameleon"␊ |
#echo "Executing command: ln -s . ${2}/.Chameleon"␊ |
#ln -s "${2}" "${2}/.Chameleon"␊ |
#echo "Executing command: ln -s /Volumes/${bootervolumename} ${2}/.Chameleon"␊ |
#ln -s "/Volumes/${bootervolumename}" "${2}/.Chameleon" ␊ |
# setup link for extras␊ |
␊ |
exit |