<p>In addition to these quirks, you should be aware of some options that <tt>install.sh</tt> supports to enable you to customize your installation in various ways. The syntax for <tt>install.sh</tt> is as follows:</p>
<pre class="listing">
-install.sh [--esp | --usedefault <tt class="variable">device-file</tt> | --root <tt class="variable">mount-point</tt> ] \
+install.sh [--esp | --usedefault <tt class="variable">device-file</tt> | --root <tt class="variable">mount-point</tt> | \
+ --ownhfs <tt class="variable">device-file</tt> ] \
[--nodrivers | --alldrivers] [--shim <tt class="variable">shim-filename</tt>] [--localkeys] [--yes]
</pre>
<td><tt>--usedefault <tt class="variable">device-file</tt></tt></td>
<td>You can install rEFInd to a disk using the default/fallback filename of <tt>EFI/BOOT/bootx64.efi</tt> (and <tt>EFI/BOOT/bootia32.efi</tt>, if the 32-bit build is available) using this option. The <tt class="variable">device-file</tt> should be an <i>unmounted</i> ESP, or at least a FAT partition, as in <tt>--usedefault /dev/sdc1</tt>. Your computer's NVRAM entries will <i>not</i> be modified when installing in this way. The intent is that you can create a bootable USB flash drive or install rEFInd on a computer that tends to "forget" its NVRAM settings with this option. This option is mutually exclusive with <tt>--esp</tt> and <tt>--root</tt> (except for implicit use of <tt>--esp</tt> on Linux).</td>
</tr>
+<tr>
+ <td><tt>--ownhfs <tt class="variable">device-file</tt></tt></td>
+ <td>This option should be used <i>only</i> under OS X. It's used to install rEFInd to an HFS+ volume <i>other than</i> a standard Mac boot volume. The result should be that rEFInd will show up in the Mac's own boot manager. More importantly, suspend-to-RAM operations may work correctly. Note that this option requires an HFS+ volume that is <i>not</i> currently an OS X boot volume. This can be a data volume or a dedicated rEFInd partition. The ESP might also work, if it's converted to use HFS+.</td>
+</tr>
<tr>
<td><tt>--root <tt class="variable">/mount-point</tt></tt></td>
<td>This option is intended to help install rEFInd from a "live CD" or other emergency system. To use it, you should mount your regular installation at <tt class="variable">/mount-point</tt>, including your <tt>/boot</tt> directory (if it's separate) at <tt class="variable">/mount-point</tt><tt>/boot</tt> and (on Linux) your ESP at that location or at <tt class="variable">/mount-point</tt><tt>/boot/efi</tt>. The <tt>install.sh</tt> script then installs rEFInd to the appropriate location—on Linux, <tt class="variable">/mount-point</tt><tt>/boot/EFI/refind</tt> or <tt class="variable">/mount-point</tt><tt>/boot/efi/EFI/refind</tt>, depending on where you've mounted your ESP; or on OS X, to <tt class="variable">/mount-point</tt><tt>/EFI/refind</tt>. The script also adds an entry to your NVRAM for rEFInd at this location. You cannot use this option with either <tt>--esp</tt> or <tt>--usedefault</tt>, except for implicit use of <tt>--esp</tt> on Linux. Note that this option is <i>not</i> needed when doing a dual-boot Linux/OS X installation; just install normally in OS X.</td>
#
# 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
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()
#
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
# 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