mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-25 16:37:42 +01:00
0c04c6d83c
- Retro compatibility since OS X Maveriks (10.9). - Search update ability of Clover.app. - Auto mount of the selected ESP. - After the installation, if the target is an EFI system partition, that partition will be umounted. - French translation by Ellibz. - Code corrections and improvements.
168 lines
4.6 KiB
Bash
Executable File
168 lines
4.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Created by vector sigma on 04/11/2019.
|
|
# Copyright © 2019 CloverHackyColor. All rights reserved.
|
|
|
|
cd /tmp
|
|
|
|
boot1install="/tmp/boot1-install" # must be there
|
|
|
|
# arguments
|
|
disk="${1}" # disk0s1
|
|
filesystem="${2}" # fat32, hfs, exfat
|
|
partition_scheme="${3}" # FDisk_partition_scheme, GUID_partition_scheme
|
|
boot0="/tmp/${4}" # /tmp/boot0af, /tmp/boot0ss
|
|
boot1="/tmp/${5}" # /tmp/boot1h, /tmp/boot1f32, /tmp/boot1x etc.
|
|
ESP="${6}" # ESP, OTHER
|
|
|
|
bootdev="/dev/${disk}"
|
|
bootrdev=${bootdev/disk/rdisk}
|
|
bootdisk="${bootdev%s*}"
|
|
bootrdisk="${bootdisk/disk/rdisk}"
|
|
bootslice="${bootdev#*disk*s}"
|
|
|
|
keepmounted=0
|
|
journaled=0
|
|
|
|
echo
|
|
echo "Installing boot sectors (version of Wed 27 Nov 2019, 22:16)"
|
|
echo
|
|
echo "disk: ${disk}"
|
|
echo "bootdev: ${bootdev}"
|
|
echo "bootrdev: ${bootrdev}"
|
|
echo "bootdisk: ${bootdisk}"
|
|
echo "bootrdisk: ${bootrdisk}"
|
|
echo "bootslice: ${bootslice}"
|
|
echo "filesystem: ${filesystem}"
|
|
echo "partition_scheme: ${partition_scheme}"
|
|
echo
|
|
|
|
if [[ "$disk" != disk*s* ]]; then
|
|
echo "Error: target disk not specified or not in the correct format as diskXsY."
|
|
exit 1
|
|
fi
|
|
|
|
if [ "${partition_scheme}" != FDisk_partition_scheme ] && \
|
|
[ "${partition_scheme}" != GUID_partition_scheme ]; then
|
|
echo "Error: unsupported Partition Scheme Map \"${partition_scheme}\"."
|
|
exit 1
|
|
fi
|
|
|
|
|
|
if [ "${filesystem}" != fat32 ] && \
|
|
[ "${filesystem}" != exfat ] && \
|
|
[ "${filesystem}" != hfs ]; then
|
|
echo "Error: unsupported filesystem \"${filesystem}\""
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -f "${boot0}" ]]; then
|
|
echo "Error: cannot found /tmp/boot0[af-ss] sector."
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -f "${boot1}" ]]; then
|
|
echo "Error: cannot found /tmp/boot1[1f32-h-x] sector."
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -f "${boot1install}" ]]; then
|
|
echo "Error: cannot found /tmp/boot1-install."
|
|
exit 1
|
|
fi
|
|
|
|
# chmod +x "${boot1install}"
|
|
|
|
rootdisk=$(LC_ALL=C /usr/sbin/diskutil info / | grep -i 'device identifier:' | awk '{print $NF}')
|
|
|
|
if [[ "${rootdisk}" == "${disk}" ]]; then
|
|
keepmounted=1
|
|
fi
|
|
|
|
echo
|
|
LC_ALL=C /usr/sbin/diskutil list
|
|
echo
|
|
|
|
# hfs can cause a panic writing boot sectors if journaled
|
|
# panic(cpu 0 caller 0xffffff7fa32683ad): "jnl: end_tr: !!!DANGER!!! bp 0xffffff8134a09650 flags (0x101) not LOCKED & DELWRI\n"@/
|
|
|
|
# code:
|
|
# panic("jnl: end_tr: !!!DANGER!!! bp %p flags (0x%x) not LOCKED & DELWRI\n", bp, buf_flags(bp));
|
|
|
|
# fix? disable the journal (will be reactivated later)
|
|
if [[ $(LC_ALL=C /usr/sbin/diskutil info "${disk}" | grep -i 'file system personality:') == *ournaled* ]]; then
|
|
/usr/sbin/diskutil disableJournal "${disk}"
|
|
journaled=1
|
|
fi
|
|
|
|
# Try to unmount the partition first
|
|
mnt_pt=$(LC_ALL=C /sbin/mount | egrep "^$bootdev on" | sed 's/^.* on *//;s/ ([^(]*//')
|
|
if [[ $keepmounted -eq 0 ]]; then
|
|
if [[ -n "$mnt_pt" ]]; then
|
|
# Try to umount the partition with umount
|
|
/sbin/umount $bootdev 2>/dev/null
|
|
if [[ $? -ne 0 ]]; then
|
|
# If it doesn't work try with diskutil
|
|
/usr/sbin/diskutil unmount $bootdev 2>/dev/null
|
|
[[ $? -ne 0 ]] && mnt_pt=''
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
### Stage 0 ###
|
|
echo
|
|
echo "Stage 0 - Writing ${boot0} to ${bootrdisk}"
|
|
echo "Executing: dd if=${bootrdisk} count=1 bs=512 of=/tmp/CloverOrigMBR"
|
|
/bin/dd if="${bootrdisk}" count=1 bs=512 of=/tmp/CloverOrigMBR
|
|
echo "Executing: cp /tmp/CloverOrigMBR /tmp/CloverNewMBR"
|
|
/bin/cp -R /tmp/CloverOrigMBR /tmp/CloverNewMBR
|
|
echo "Executing: dd if=${boot0} of=/tmp/CloverNewMBR bs=440 count=1 conv=notrunc"
|
|
/bin/dd if="${boot0}" of=/tmp/CloverNewMBR bs=440 count=1 conv=notrunc
|
|
echo "Executing: fdisk -f /tmp/CloverNewMBR -u -y ${bootrdisk}"
|
|
/usr/sbin/fdisk -f /tmp/CloverNewMBR -u -y "${bootrdisk}"
|
|
|
|
### Stage 1 ###
|
|
echo
|
|
echo "Stage 1 - Writing ${boot1} to ${bootrdev}"
|
|
if [[ $keepmounted -eq 1 ]]; then
|
|
echo "Executing: boot1-install -y -f -M ${boot1} ${bootrdev}"
|
|
"$boot1install" -y -f -M "${boot1}" "${bootrdev}"
|
|
else
|
|
echo "Executing: boot1-install -y -f ${boot1} ${bootrdev}"
|
|
"$boot1install" -y -f "${boot1}" "${bootrdev}"
|
|
fi
|
|
|
|
if [[ "${partition_scheme}" == FDisk_partition_scheme && "$boot0" == "/tmp/boot0af" ]]; then
|
|
echo "Setup Active Partition to be: ${bootslice}"
|
|
/usr/sbin/fdisk -e "${bootrdisk}" <<-MAKEACTIVE
|
|
print
|
|
flag "${bootslice}"
|
|
write
|
|
y
|
|
quit
|
|
MAKEACTIVE
|
|
|
|
partitionactive=$( /usr/sbin/fdisk -d "${bootrdisk}" | grep -n "*" | awk -F: '{print $1}')
|
|
echo "New Active Partition: ${partitionactive}"
|
|
echo ""
|
|
fi
|
|
|
|
sleep 2
|
|
# Now try to remount the partition
|
|
if [[ "${ESP}" != ESP ]]; then
|
|
if [[ -n "$mnt_pt" ]]; then
|
|
/usr/sbin/diskutil mount "$bootdev"
|
|
fi
|
|
fi
|
|
|
|
if [[ $journaled -ne 0 ]]; then
|
|
/usr/sbin/diskutil enableJournal "${disk}"
|
|
fi
|
|
|
|
/bin/rm -rf /tmp/Clover*
|
|
/bin/rm -rf /tmp/boot1*
|
|
/bin/rm -rf /tmp/boot2*
|
|
/bin/rm -rf /tmp/bootsec*
|
|
|
|
exit 0
|