X-Git-Url: https://code.delx.au/refind/blobdiff_plain/e8d44d7578a450f6289abf45f841c65514a6d443..a7380794d3e5d2b6b1768d7b0671e89d64a44349:/install.sh diff --git a/install.sh b/install.sh index 93b4cde..eca8777 100755 --- a/install.sh +++ b/install.sh @@ -29,12 +29,18 @@ # to the current OS X boot partition. Under Linux, this script # installs to the ESP by default. # -# This program is copyright (c) 2012-2014 by Roderick W. Smith +# This program is copyright (c) 2012-2015 by Roderick W. Smith # It is released under the terms of the GNU GPL, version 3, # a copy of which should be included in the file COPYING.txt. # # Revision history: # +# 0.8.7 -- Better detection of Secure Boot mode & fixed errors when copying +# Shim & MokManager files over themselves; fixed bug that caused +# inappropriate installation to EFI/BOOT/bootx64.efi +# 0.8.6 -- Fixed bugs that caused misidentification of ESP on disks with +# partition numbers over 10 on OS X and misidentification of mount +# point if already-mounted ESP had space in path. # 0.8.5 -- Refinement/cleanup of new OS X ESP-as-default policy # 0.8.4 -- OS X default changed to install to ESP under /EFI/BOOT # 0.7.9 -- Fixed bug that caused errors if dmraid utility not installed @@ -196,6 +202,7 @@ CheckForFiles() { exit 1 fi + echo "ShimSource is $ShimSource" if [[ "$ShimSource" != "none" ]] ; then if [[ -f "$ShimSource" ]] ; then if [[ $ShimType == "shimx64.efi" || $ShimType == "shim.efi" ]] ; then @@ -220,15 +227,24 @@ CheckForFiles() { # Helper for CopyRefindFiles; copies shim files (including MokManager, if it's # available) to target. CopyShimFiles() { - cp -fb "$ShimSource" "$InstallDir/$TargetDir/$TargetShim" - if [[ $? != 0 ]] ; then - Problems=1 - fi - if [[ -f "$MokManagerSource" ]] ; then - cp -fb "$MokManagerSource" "$InstallDir/$TargetDir/" + local inode1=`ls -i "$ShimSource" 2> /dev/null | cut -f 1 -d " "` + local inode2=`ls -i "$InstallDir/$TargetDir/$TargetShim" 2> /dev/null | cut -f 1 -d " "` + if [[ $inode1 != $inode2 ]] ; then + cp -fb "$ShimSource" "$InstallDir/$TargetDir/$TargetShim" + if [[ $? != 0 ]] ; then + Problems=1 + fi fi - if [[ $? != 0 ]] ; then - Problems=1 + inode1=`ls -i "$MokManagerSource" 2> /dev/null | cut -f 1 -d " "` + local TargetMMName=`basename $MokManagerSource` + inode2=`ls -i "$InstallDir/$TargetDir/$TargetMMName" 2> /dev/null | cut -f 1 -d " "` + if [[ $inode1 != $inode2 ]] ; then + if [[ -f "$MokManagerSource" ]] ; then + cp -fb "$MokManagerSource" "$InstallDir/$TargetDir/" + fi + if [[ $? != 0 ]] ; then + Problems=1 + fi fi } # CopyShimFiles() @@ -293,17 +309,17 @@ SetVarsForMsBoot() { DetermineTargetDir() { Upgrade=0 - if [[ -f $InstallDir/EFI/BOOT/refind.conf ]] ; then + if [[ -f $InstallDir/EFI/BOOT/refind.conf && ! -f $InstallDir/EFI/refind/refind.conf ]] ; then SetVarsForBoot Upgrade=1 fi - if [[ -f $InstallDir/EFI/Microsoft/Boot/refind.conf ]] ; then + if [[ -f $InstallDir/EFI/Microsoft/Boot/refind.conf && ! -f $InstallDir/EFI/refind/refind.conf ]] ; then SetVarsForMsBoot Upgrade=1 fi - if [[ -f $InstallDir/EFI/refind/refind.conf ]] ; then + if [[ -f $InstallDir/EFI/refind/refind.conf && foofoo ]] ; then TargetDir="/EFI/refind" - if [[ "$OSName" == 'Darwin' ]] ; then + if [[ $ShimSource == "none" ]] ; then TargetX64="refind_x64.efi" TargetIA32="refind_ia32.efi" fi @@ -399,6 +415,8 @@ CopyDrivers() { ;; hfsplus) DriverType="hfs" ;; + ntfs) DriverType="ntfs" + ;; *) BootFS="" esac if [[ -n $BootFS ]] ; then @@ -597,8 +615,8 @@ MountOSXESP() { fi Esp=/dev/`echo $Temp` # If the ESP is mounted, use its current mount point.... - Temp=`df -P | grep "$Esp"` - InstallDir=`echo $Temp | cut -f 6 -d ' '` + Temp=`df -P | grep "$Esp "` + InstallDir=`echo $Temp | cut -f 6- -d ' '` if [[ "$InstallDir" == '' ]] ; then mkdir /Volumes/ESP &> /dev/null mount -t msdos "$Esp" /Volumes/ESP @@ -639,7 +657,7 @@ SetupMacHfs() { ProductName rEFInd ProductVersion - 0.7.6 + 0.8.7 ENDOFHERE @@ -661,7 +679,7 @@ InstallOnOSX() { Platform=`ioreg -l -p IODeviceTree | grep firmware-abi | cut -d "\"" -f 4` CopyRefindFiles if [[ $InstallToEspOnMac == "1" ]] ; then - bless --mount "$InstallDir" --setBoot --file "$InstallDir/$TargetDir/$Refind" + bless --mount "$InstallDir" --setBoot --file "$InstallDir/$TargetDir/$Refind" --shortform elif [[ "$TargetDir" != "/EFI/BOOT" ]] ; then bless --setBoot --folder "$InstallDir/$TargetDir" --file "$InstallDir/$TargetDir/$Refind" fi @@ -697,20 +715,18 @@ InstallOnOSX() { # appropriate options haven't been set, warn the user and offer to abort. # If we're NOT in Secure Boot mode but the user HAS specified the --shim # or --localkeys option, warn the user and offer to abort. -# -# FIXME: Although I checked the presence (and lack thereof) of the -# /sys/firmware/efi/vars/SecureBoot* files on my Secure Boot test system -# before releasing this script, I've since found that they are at least -# sometimes present when Secure Boot is absent. This means that the first -# test can produce false alarms. A better test is highly desirable. CheckSecureBoot() { - VarFile=`ls -d /sys/firmware/efi/vars/SecureBoot* 2> /dev/null` - if [[ -n "$VarFile" && "$TargetDir" != '/EFI/BOOT' && "$ShimSource" == "none" ]] ; then + local IsSecureBoot + if [[ -f /sys/firmware/efi/vars/SecureBoot-8be4df61-93ca-11d2-aa0d-00e098032b8c/data ]] ; then + IsSecureBoot=`od -An -t u1 /sys/firmware/efi/vars/SecureBoot-8be4df61-93ca-11d2-aa0d-00e098032b8c/data | tr -d '[[:space:]]'` + else + IsSecureBoot="0" + fi + if [[ $IsSecureBoot == "1" && "$TargetDir" != '/EFI/BOOT' && "$ShimSource" == "none" ]] ; then echo "" - echo "CAUTION: Your computer appears to support Secure Boot, but you haven't" - echo "specified a valid shim.efi file source. If you've disabled Secure Boot and" - echo "intend to leave it disabled, this is fine; but if Secure Boot is active, the" - echo "resulting installation won't boot. You can read more about this topic at" + echo "CAUTION: Your computer appears to be booted with Secure Boot, but you haven't" + echo "specified a valid shim.efi file source. Chances are you should re-run with" + echo "the --shim option. You can read more about this topic at" echo "http://www.rodsbooks.com/refind/secureboot.html." echo "" echo -n "Do you want to proceed with installation (Y/N)? " @@ -722,7 +738,7 @@ CheckSecureBoot() { fi fi - if [[ "$ShimSource" != "none" && ! -n "$VarFile" ]] ; then + if [[ "$ShimSource" != "none" && ! $IsSecureBoot == "1" ]] ; then echo "" echo "You've specified installing using a shim.efi file, but your computer does not" echo "appear to be running in Secure Boot mode. Although installing in this way" @@ -740,7 +756,7 @@ CheckSecureBoot() { fi fi - if [[ $LocalKeys != 0 && ! -n "$VarFile" ]] ; then + if [[ $LocalKeys != 0 && ! $IsSecureBoot == "1" ]] ; then echo "" echo "You've specified re-signing your rEFInd binaries with locally-generated keys," echo "but your computer does not appear to be running in Secure Boot mode. The" @@ -1089,11 +1105,6 @@ if [[ $OSName == 'Darwin' ]] ; then echo "The --localkeys option is not supported on OS X! Exiting!" exit 1 fi - if [[ $InstallToEspOnMac == 1 ]] ; then - TargetDir=/EFI/BOOT - TargetX64="bootx64.efi" - TargetIA32="bootia32.efi" - fi InstallOnOSX $1 elif [[ $OSName == 'Linux' ]] ; then InstallOnLinux