#
# options include:
# "--esp" to install to the ESP rather than to the system's root
-# filesystem. This is the default on Linux
+# filesystem. This is the default on Linux.
# "--usedefault {devicefile}" to install as default
# (/EFI/BOOT/BOOTX64.EFI and similar) to the specified device
# (/dev/sdd1 or whatever) without registering with the NVRAM.
+# "--ownhfs {devicefile}" to install to an HFS+ volume that's NOT currently
+# an OS X boot volume.
# "--root {dir}" to specify installation using the specified directory
# as the system's root
# "--alldrivers" to install all drivers along with regular files
#
# Revision history:
#
+# 0.7.6 -- Added --ownhfs {device-filename} option
+# 0.7.5 -- Fixed bug when installing to ESP on recent versions of OS X
# 0.7.2 -- Fixed code that could be confused by use of autofs to mount the ESP
# 0.7.0 -- Added support for the new Btrfs driver
# 0.6.12 -- Added support for PreLoader as well as for shim
case $1 in
--esp | --ESP) InstallToEspOnMac=1
;;
+ --ownhfs) OwnHfs=1
+ TargetPart="$2"
+ TargetDir=/System/Library/CoreServices
+ shift
+ ;;
--usedefault) TargetDir=/EFI/BOOT
TargetPart="$2"
TargetX64="bootx64.efi"
;;
--yes) AlwaysYes=1
;;
- * ) echo "Usage: $0 [--esp | --usedefault {device-file} | --root {directory} ]"
+ * ) echo "Usage: $0 [--esp | --usedefault {device-file} | --root {directory} |"
+ echo " --ownhfs {device-file} ]"
echo " [--nodrivers | --alldrivers] [--shim {shim-filename}]"
echo " [--localkeys] [--yes]"
exit 1
echo "You may use --root OR --esp, but not both! Aborting!"
exit 1
fi
+ if [[ "$TargetDir" != '/System/Library/CoreServices' && "$OwnHfs" == '1' ]] ; then
+ echo "If you use --ownhfs, you may NOT use --usedefault! Aborting!"
+ exit 1
+ fi
RLConfFile="$RootDir/boot/refind_linux.conf"
EtcKeysDir="$RootDir/etc/refind.d/keys"
cp "$ThisDir/keys/refind.crt" "$EtcKeysDir" 2> /dev/null
fi
fi
+ if [[ "$TargetDir" == '/System/Library/CoreServices' ]] ; then
+ SetupMacHfs $TargetX64
+ fi
elif [[ $Platform == 'EFI32' ]] ; then
cp "$RefindDir/refind_ia32.efi" "$InstallDir/$TargetDir/$TargetIA32"
if [[ $? != 0 ]] ; then
CopyDrivers ia32
CopyTools ia32
Refind="refind_ia32.efi"
+ if [[ "$TargetDir" == '/System/Library/CoreServices' ]] ; then
+ SetupMacHfs $TargetIA32
+ fi
else
echo "Unknown platform! Aborting!"
exit 1
fi
} # CopyRefindFiles()
-# Mount the partition the user specified with the --usedefault option
+# Mount the partition the user specified with the --usedefault or --ownhfs option
MountDefaultTarget() {
InstallDir=/tmp/refind_install
mkdir -p "$InstallDir"
+ UnmountEsp=1
if [[ $OSName == 'Darwin' ]] ; then
- mount -t msdos "$TargetPart" "$InstallDir"
+ if [[ $OwnHfs == '1' ]] ; then
+ Temp=`diskutil info "$TargetPart" | grep "Mount Point"`
+ InstallDir=`echo $Temp | cut -f 3-30 -d ' '`
+ if [[ $InstallDir == '' ]] ; then
+ InstallDir=/tmp/refind_install
+ mount -t hfs "$TargetPart" "$InstallDir"
+ else
+ UnmountEsp=0
+ fi
+ else
+ mount -t msdos "$TargetPart" "$InstallDir"
+ fi
elif [[ $OSName == 'Linux' ]] ; then
mount -t vfat "$TargetPart" "$InstallDir"
fi
rmdir "$InstallDir"
exit 1
fi
- UnmountEsp=1
+ echo "UnmountEsp = $UnmountEsp"
} # MountDefaultTarget()
#
MountOSXESP() {
# Identify the ESP. Note: This returns the FIRST ESP found;
# if the system has multiple disks, this could be wrong!
- Temp=`diskutil list | grep " EFI "`
- Esp=/dev/`echo $Temp | cut -f 5 -d ' '`
+ Temp=`diskutil list | grep " EFI " | grep -o 'disk.*'`
+ Esp=/dev/`echo $Temp`
# If the ESP is mounted, use its current mount point....
- Temp=`df | grep "$Esp"`
+ Temp=`df -P | grep "$Esp"`
InstallDir=`echo $Temp | cut -f 6 -d ' '`
if [[ "$InstallDir" == '' ]] ; then
mkdir /Volumes/ESP &> /dev/null
fi
} # MountOSXESP()
+# Set up for booting from Mac HFS+ volume that boots rEFInd in MJG's way
+# (http://mjg59.dreamwidth.org/7468.html)
+# Must be passed the original rEFInd binary filename (without a path).
+SetupMacHfs() {
+ if [[ -s "$InstallDir/mach_kernel" ]] ; then
+ echo "Attempt to install rEFInd to a partition with a /mach_kernel file! Aborting!"
+ exit 1
+ fi
+ cp -n "$InstallDir/$TargetDir/boot.efi" "$InstallDir/$TargetDir/boot.efi-backup" &> /dev/null
+ ln -f "$InstallDir/$TargetDir/$1" "$InstallDir/$TargetDir/boot.efi"
+ touch "$InstallDir/mach_kernel"
+ cp -n "$RefindDir/icons/os_refind.icns" "$InstallDir/.VolumeIcon.icns" &> /dev/null
+ rm "$InstallDir/$TargetDir/SystemVersion.plist" &> /dev/null
+ cat - << ENDOFHERE >> "$InstallDir/$TargetDir/SystemVersion.plist"
+<xml version="1.0" encoding="UTF-8"?>
+<plist version="1.0">
+<dict>
+ <key>ProductBuildVersion</key>
+ <string></string>
+ <key>ProductName</key>
+ <string>rEFInd</string>
+ <key>ProductVersion</key>
+ <string>0.7.6</string>
+</dict>
+</plist>
+ENDOFHERE
+} # SetupMacHfs()
+
# Control the OS X installation.
# Sets Problems=1 if problems found during the installation.
InstallOnOSX() {
echo "Installing rEFInd on OS X...."
- if [[ "$TargetDir" == "/EFI/BOOT" ]] ; then
+ if [[ "$TargetDir" == "/EFI/BOOT" || "$OwnHfs" == '1' ]] ; then
MountDefaultTarget
elif [[ "$InstallToEspOnMac" == "1" ]] ; then
MountOSXESP
if [[ -n "$InstallDir" ]] ; then
EspFilesystem=`grep "$InstallDir" /etc/mtab | uniq | grep -v autofs | cut -d " " -f 3`
fi
- echo "EspFilesystem is '$EspFilesystem'"
if [[ $EspFilesystem != 'vfat' ]] ; then
echo "$RootDir/boot/efi doesn't seem to be on a VFAT filesystem. The ESP must be"
echo "mounted at $RootDir/boot or $RootDir/boot/efi and it must be VFAT! Aborting!"
echo "rename the $Refind binary to the default name (EFI/boot/bootx64.efi"
echo "on x86-64 systems or EFI/boot/bootia32.efi on x86 systems) to have it run!"
echo
+ else
+ echo "rEFInd has been set as the default boot manager."
fi
} # AddBootEntry()
if [[ -f "$RLConfFile" ]] ; then
echo "Existing $RLConfFile found; not overwriting."
else
+ echo "Creating $RLConfFile; edit it to adjust kernel options."
if [[ -f "$RootDir/etc/default/grub" ]] ; then
# We want the default options used by the distribution, stored here....
source "$RootDir/etc/default/grub"
+ echo "Setting default boot options based on $RootDir/etc/default/grub"
fi
RootFS=`df "$RootDir" | grep dev | cut -f 1 -d " "`
StartOfDevname=`echo "$RootFS" | cut -b 1-7`
fi
fi
DefaultOptions="$GRUB_CMDLINE_LINUX $GRUB_CMDLINE_LINUX_DEFAULT"
- echo "\"Boot with standard options\" \"ro root=$RootFS $DefaultOptions \"" > $RLConfFile
- echo "\"Boot to single-user mode\" \"ro root=$RootFS $DefaultOptions single\"" >> $RLConfFile
- echo "\"Boot with minimal options\" \"ro root=$RootFS\"" >> $RLConfFile
+ echo "\"Boot with standard options\" \"ro root=$RootFS $DefaultOptions \"" > $RLConfFile
+ echo "\"Boot to single-user mode\" \"ro root=$RootFS $DefaultOptions single\"" >> $RLConfFile
+ echo "\"Boot without EFI storage paranoia\" \"ro root=$RootFS $DefaultOptions efi_no_storage_paranoia\"" >> $RLConfFile
+ echo "\"Boot with minimal options\" \"ro root=$RootFS\"" >> $RLConfFile
fi
}
# Controls rEFInd installation under Linux.
# Sets Problems=1 if something goes wrong.
InstallOnLinux() {
+ if [[ "$TargetDir" == "/System/Library/CoreServices" ]] ; then
+ echo "You may not use the --ownhfs option under Linux! Aborting!"
+ exit 1
+ fi
echo "Installing rEFInd on Linux...."
modprobe efivars &> /dev/null
if [[ $TargetDir == "/EFI/BOOT" ]] ; then
echo
fi
-if [[ $UnmountEsp ]] ; then
+if [[ $UnmountEsp == '1' ]] ; then
echo "Unmounting install dir"
umount $InstallDir
fi