]> code.delx.au - refind/commitdiff
Added --ownhfs {target} option to install.sh, to install to non-root
authorsrs5694 <srs5694@users.sourceforge.net>
Mon, 11 Nov 2013 23:05:36 +0000 (18:05 -0500)
committersrs5694 <srs5694@users.sourceforge.net>
Mon, 11 Nov 2013 23:05:36 +0000 (18:05 -0500)
HFS+ volume on Macs.

NEWS.txt
docs/refind/installing.html
install.sh

index 8c255a8866a03b1d6842549741eeca99fa0251a2..ec97a1b4ea4272770a598859a304374441dd04be 100644 (file)
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -1,4 +1,13 @@
-0.7.5 (11/??/2013):
+0.7.6 (11/??/2013):
+-------------------
+
+- Added --ownhfs {target} option to install.sh. This option causes rEFInd
+  to install to an HFS+ partition in a way that's more consistent with the
+  way the Mac's native boot loader is installed. Note that you should NOT
+  install to an already-bootable partition with this option, since it will
+  overwrite the existing boot loader, which would render OS X unbootable.
+
+0.7.5 (11/10/2013):
 -------------------
 
 - Fixed bug that caused unbootable exFAT partitions to show up as
index 20d4890505c150f1087d8de27dcf251348d4ee13..9d7bfc77265a87bb936a3157de6b9af075afba9c 100644 (file)
@@ -350,7 +350,8 @@ Installation has completed successfully.</pre>
 <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>
 
@@ -369,6 +370,10 @@ install.sh [--esp | --usedefault <tt class="variable">device-file</tt> | --root
    <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&mdash;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>
index fd7bb1f9c1236dcd1bc76ce75fbc55fcd1273568..d00c6a891b88c417f786581194b0b5c743fe8cc1 100755 (executable)
@@ -8,10 +8,12 @@
 #
 # 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
@@ -33,6 +35,7 @@
 #
 # 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
@@ -94,6 +97,11 @@ GetParams() {
       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"
@@ -115,7 +123,8 @@ GetParams() {
               ;;
          --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
@@ -135,6 +144,10 @@ GetParams() {
       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"
@@ -332,6 +345,9 @@ CopyRefindFiles() {
             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
@@ -340,6 +356,9 @@ CopyRefindFiles() {
       CopyDrivers ia32
       CopyTools ia32
       Refind="refind_ia32.efi"
+      if [[ "$TargetDir" == '/System/Library/CoreServices' ]] ; then
+         SetupMacHfs $TargetIA32
+      fi
    else
       echo "Unknown platform! Aborting!"
       exit 1
@@ -381,12 +400,24 @@ CopyRefindFiles() {
    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
@@ -395,7 +426,7 @@ MountDefaultTarget() {
       rmdir "$InstallDir"
       exit 1
    fi
-   UnmountEsp=1
+   echo "UnmountEsp = $UnmountEsp"
 } # MountDefaultTarget()
 
 #
@@ -426,11 +457,39 @@ MountOSXESP() {
    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
@@ -833,6 +892,10 @@ DetermineTargetDir() {
 # 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
@@ -941,7 +1004,7 @@ else
    echo
 fi
 
-if [[ $UnmountEsp ]] ; then
+if [[ $UnmountEsp == '1' ]] ; then
    echo "Unmounting install dir"
    umount $InstallDir
 fi