From: srs5694 Date: Mon, 11 Nov 2013 23:05:36 +0000 (-0500) Subject: Added --ownhfs {target} option to install.sh, to install to non-root X-Git-Url: https://code.delx.au/refind/commitdiff_plain/42c8c8f5e0edcc6591f9588f1b237e7e7c6137df Added --ownhfs {target} option to install.sh, to install to non-root HFS+ volume on Macs. --- diff --git a/NEWS.txt b/NEWS.txt index 8c255a8..ec97a1b 100644 --- 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 diff --git a/docs/refind/installing.html b/docs/refind/installing.html index 20d4890..9d7bfc7 100644 --- a/docs/refind/installing.html +++ b/docs/refind/installing.html @@ -350,7 +350,8 @@ Installation has completed successfully.

In addition to these quirks, you should be aware of some options that install.sh supports to enable you to customize your installation in various ways. The syntax for install.sh is as follows:

-install.sh [--esp | --usedefault device-file | --root mount-point ] \
+install.sh [--esp | --usedefault device-file | --root mount-point | \
+            --ownhfs device-file ] \
            [--nodrivers | --alldrivers] [--shim shim-filename] [--localkeys] [--yes]
 
@@ -369,6 +370,10 @@ install.sh [--esp | --usedefault device-file | --root --usedefault device-file You can install rEFInd to a disk using the default/fallback filename of EFI/BOOT/bootx64.efi (and EFI/BOOT/bootia32.efi, if the 32-bit build is available) using this option. The device-file should be an unmounted ESP, or at least a FAT partition, as in --usedefault /dev/sdc1. Your computer's NVRAM entries will not 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 --esp and --root (except for implicit use of --esp on Linux). + + --ownhfs device-file + This option should be used only under OS X. It's used to install rEFInd to an HFS+ volume other than 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 not 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+. + --root /mount-point 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 /mount-point, including your /boot directory (if it's separate) at /mount-point/boot and (on Linux) your ESP at that location or at /mount-point/boot/efi. The install.sh script then installs rEFInd to the appropriate location—on Linux, /mount-point/boot/EFI/refind or /mount-point/boot/efi/EFI/refind, depending on where you've mounted your ESP; or on OS X, to /mount-point/EFI/refind. The script also adds an entry to your NVRAM for rEFInd at this location. You cannot use this option with either --esp or --usedefault, except for implicit use of --esp on Linux. Note that this option is not needed when doing a dual-boot Linux/OS X installation; just install normally in OS X. diff --git a/install.sh b/install.sh index fd7bb1f..d00c6a8 100755 --- a/install.sh +++ b/install.sh @@ -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" + + + + ProductBuildVersion + + ProductName + rEFInd + ProductVersion + 0.7.6 + + +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