X-Git-Url: https://code.delx.au/refind/blobdiff_plain/b31a5cb1adf04c45cb96e877815523cc4d48a1e6..8cd838bfacced99d1045a36d1618ebd9cc86ab7b:/install.sh diff --git a/install.sh b/install.sh index a4675f1..a31dbb3 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,8 @@ # # 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 @@ -93,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" @@ -114,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 @@ -134,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" @@ -331,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 @@ -339,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 @@ -380,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 @@ -394,7 +426,7 @@ MountDefaultTarget() { rmdir "$InstallDir" exit 1 fi - UnmountEsp=1 + echo "UnmountEsp = $UnmountEsp" } # MountDefaultTarget() # @@ -408,10 +440,10 @@ 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 @@ -425,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 @@ -638,7 +698,6 @@ FindLinuxESP() { 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!" @@ -695,6 +754,8 @@ AddBootEntry() { 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() @@ -703,6 +764,7 @@ GenerateRefindLinuxConf() { 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" @@ -718,9 +780,10 @@ GenerateRefindLinuxConf() { 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 } @@ -830,6 +893,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 @@ -938,7 +1005,7 @@ else echo fi -if [[ $UnmountEsp ]] ; then +if [[ $UnmountEsp == '1' ]] ; then echo "Unmounting install dir" umount $InstallDir fi