X-Git-Url: https://code.delx.au/refind/blobdiff_plain/baa6e0951c75596a39e1416bc74ec5bbfe451d9a..ed4abdfc513e5e1b005aeaf54e230194c76978ec:/install.sh diff --git a/install.sh b/install.sh index 446f35e..99896f2 100755 --- a/install.sh +++ b/install.sh @@ -22,6 +22,7 @@ # "--shim {shimfile}" to install a shim.efi file for Secure Boot # "--preloader" is synonymous with "--shim" # "--localkeys" to re-sign x86-64 binaries with a locally-generated key +# "--keepname" to keep refind_x64.efi name as such even when using shim # "--yes" to assume a "yes" response to all prompts # # The "esp" option is valid only on Mac OS X; it causes @@ -35,6 +36,8 @@ # # Revision history: # +# 0.9.3 -- Enable running under OS X's recovery system. +# 0.9.2 -- Added --keepname option. # 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 @@ -85,6 +88,7 @@ TargetDir=/EFI/refind LocalKeysBase="refind_local" ShimSource="none" ShimType="none" +KeepName=0 TargetShim="default" TargetX64="refind_x64.efi" TargetIA32="refind_ia32.efi" @@ -128,6 +132,8 @@ GetParams() { ShimType=`basename $ShimSource` shift ;; + --keepname) KeepName=1 + ;; --drivers | --alldrivers) InstallDrivers="all" ;; --nodrivers) InstallDrivers="none" @@ -135,9 +141,9 @@ GetParams() { --yes) AlwaysYes=1 ;; * ) echo "Usage: $0 [--notesp | --usedefault {device-file} | --root {dir} |" - echo " --ownhfs {device-file} ]" - echo " [--nodrivers | --alldrivers] [--shim {shim-filename}]" - echo " [--localkeys] [--yes]" + echo " --ownhfs {device-file} ] [--keepname]" + echo " [--nodrivers | --alldrivers]" + echo " [--localkeys] [--keepname] [--yes]" exit 1 esac shift @@ -154,6 +160,19 @@ GetParams() { echo "If you use --ownhfs, you may NOT use --usedefault! Aborting!" exit 1 fi + if [[ "$KeepName" == 1 && "$ShimSource" == "none" ]] ; then + echo "The --keepname option is meaningful only in conjunction with --shim" + echo "or --preloader! Aborting!" + exit 1 + fi + if [[ "$KeepName" == 1 && "$OSTYPE" != "linux-gnu" ]] ; then + echo "The --keepname option is valid only under Linux! Aborting!" + exit 1 + fi + if [[ "$KeepName" == 1 && "$TargetDir" != "/EFI/BOOT" ]] ; then + echo "The --keepname option is incompatible with --usedefault! Aborting!" + exit 1 + fi RLConfFile="$RootDir/boot/refind_linux.conf" EtcKeysDir="$RootDir/etc/refind.d/keys" } # GetParams() @@ -276,6 +295,10 @@ SetVarsForBoot() { TargetIA32="bootia32.efi" TargetShim="bootx64.efi" fi + if [[ $KeepName == 1 ]] ; then + echo "Installation is to /EFI/BOOT, which is incompatible with --keepname! Aborting!" + exit 1 + fi } # SetVarsForBoot() # Set variables for installation in EFI/Microsoft/Boot directory @@ -283,6 +306,7 @@ SetVarsForMsBoot() { TargetDir="/EFI/Microsoft/Boot" if [[ $ShimSource == "none" ]] ; then TargetX64="bootmgfw.efi" + TargetIA32="bootmgfw.efi" else if [[ $ShimType == "shim.efi" || $ShimType == "shimx64.efi" ]] ; then TargetX64="grubx64.efi" @@ -295,6 +319,11 @@ SetVarsForMsBoot() { fi TargetShim="bootmgfw.efi" fi + if [[ $KeepName == 1 ]] ; then + echo "Installation is to /EFI/Microsoft/Boot, which is incompatible with --keepname!" + echo "Aborting!" + exit 1 + fi } # SetVarsForMsBoot() # TargetDir defaults to /EFI/refind; however, this function adjusts it as follows: @@ -317,9 +346,9 @@ DetermineTargetDir() { SetVarsForMsBoot Upgrade=1 fi - if [[ -f $InstallDir/EFI/refind/refind.conf && foofoo ]] ; then + if [[ -f $InstallDir/EFI/refind/refind.conf ]] ; then TargetDir="/EFI/refind" - if [[ $ShimSource == "none" ]] ; then + if [[ $ShimSource == "none" || $KeepName == 1 ]] ; then TargetX64="refind_x64.efi" TargetIA32="refind_ia32.efi" fi @@ -329,7 +358,7 @@ DetermineTargetDir() { echo "Found rEFInd installation in $InstallDir$TargetDir; upgrading it." fi - if [[ ! -d /sys/firmware/efi && ! $OSName == 'Darwin' && $Upgrade == 0 ]] ; then # BIOS-mode + if [[ ! -d /sys/firmware/efi && ! $OSTYPE == darwin* && $Upgrade == 0 ]] ; then # BIOS-mode FoundEfiFiles=`find "$InstallDir/EFI/BOOT" -name "*.efi" 2> /dev/null` FoundConfFiles=`find "$InstallDir" -name "refind\.conf" 2> /dev/null` if [[ ! -n "$FoundConfFiles" && -f "$InstallDir/EFI/Microsoft/Boot/bootmgfw.efi" ]] ; then @@ -369,26 +398,29 @@ DetermineTargetDir() { SetBootFS() { local Blkid - Blkid=`which blkid 2> /dev/null` BootFS="" - if [[ $OSName == 'Linux' && -x "$Blkid" ]] ; then - BootPart=`df /boot | grep dev | cut -f 1 -d " "` - BootFS=`$Blkid -o export $BootPart 2> /dev/null | grep TYPE= | cut -f 2 -d =` - fi - if [[ $OSName == 'Darwin' ]] ; then - # 0FC63DAF-8483-4772-8E79-3D69D8477DE4 = Linux filesystem - # BC13C2FF-59E6-4262-A352-B275FD6F7172 = Freedesktop $boot partition - # 933AC7E1-2EB4-4F13-B844-0E14E2AEF915 = Freedesktop Linux /home - # E6D6D379-F507-44C2-A23C-238F2A3DF928 = Linux LVM - # A19D880F-05FC-4D3B-A006-743F0F84911E = Linux RAID - # 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F = Linux swap - Temp=$(diskutil list | grep -i '0FC63DAF-8483-4772-8E79-3D69D8477DE4\|BC13C2FF-59E6-4262-A352-B275FD6F7172\|933AC7E1-2EB4-4F13-B844-0E14E2AEF915\|E6D6D379-F507-44C2-A23C-238F2A3DF928\|A19D880F-05FC-4D3B-A006-743F0F84911E\|0657FD6D-A4AB-43C4-84E5-0933C84B4F4F\|Linux') - BootFS="" - if [[ -n $Temp ]] ; then - echo "Found suspected Linux partition(s); installing ext4fs driver." - BootFS="ext4" - fi - fi + case "$OSTYPE" in + linux-gnu) + if command -v blkid 2>/dev/null; then + BootPart=`df /boot | grep dev | cut -f 1 -d " "` + BootFS=`blkid -o export $BootPart 2> /dev/null | grep TYPE= | cut -f 2 -d =` + fi + ;; + darwin*) + # 0FC63DAF-8483-4772-8E79-3D69D8477DE4 = Linux filesystem + # BC13C2FF-59E6-4262-A352-B275FD6F7172 = Freedesktop $boot partition + # 933AC7E1-2EB4-4F13-B844-0E14E2AEF915 = Freedesktop Linux /home + # E6D6D379-F507-44C2-A23C-238F2A3DF928 = Linux LVM + # A19D880F-05FC-4D3B-A006-743F0F84911E = Linux RAID + # 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F = Linux swap + Temp=$(diskutil list | grep -i '0FC63DAF-8483-4772-8E79-3D69D8477DE4\|BC13C2FF-59E6-4262-A352-B275FD6F7172\|933AC7E1-2EB4-4F13-B844-0E14E2AEF915\|E6D6D379-F507-44C2-A23C-238F2A3DF928\|A19D880F-05FC-4D3B-A006-743F0F84911E\|0657FD6D-A4AB-43C4-84E5-0933C84B4F4F\|Linux') + BootFS="" + if [[ -n $Temp ]] ; then + echo "Found suspected Linux partition(s); installing ext4fs driver." + BootFS="ext4" + fi + ;; + esac } # SetBootFS() # Copy drivers from $RefindDir/drivers_$1 to $InstallDir/$TargetDir/drivers_$1, @@ -433,7 +465,7 @@ CopyDrivers() { # or x64). CopyTools() { mkdir -p "$InstallDir/EFI/tools" - if [[ $OSName == 'Darwin' ]] ; then + if [[ $OSTYPE == darwin* ]] ; then cp -f "$RefindDir/tools_$1/gptsync_$1.efi" "$InstallDir/EFI/tools/" if [[ -f "$InstallDir/EFI/tools/gptsync.efi" ]] ; then mv "$InstallDir/EFI/tools/gptsync.efi" "$InstallDir/EFI/tools/gptsync.efi-disabled" @@ -560,7 +592,7 @@ MountDefaultTarget() { InstallDir=/tmp/refind_install mkdir -p "$InstallDir" UnmountEsp=1 - if [[ $OSName == 'Darwin' ]] ; then + if [[ $OSTYPE == darwin* ]] ; then if [[ $OwnHfs == '1' ]] ; then Temp=`diskutil info "$TargetPart" | grep "Mount Point"` InstallDir=`echo $Temp | cut -f 3-30 -d ' '` @@ -573,7 +605,7 @@ MountDefaultTarget() { else mount -t msdos "$TargetPart" "$InstallDir" fi - elif [[ $OSName == 'Linux' ]] ; then + elif [[ $OSTYPE == linux-gnu ]] ; then mount -t vfat "$TargetPart" "$InstallDir" fi if [[ $? != 0 ]] ; then @@ -657,7 +689,7 @@ SetupMacHfs() { ProductName rEFInd ProductVersion - 0.9.0 + 0.9.2 ENDOFHERE @@ -934,7 +966,6 @@ FindMountedESP() { # If this fails, sets Problems=1 AddBootEntry() { local PartNum - InstallIt="0" Efibootmgr=`which efibootmgr 2> /dev/null` if [[ "$Efibootmgr" ]] ; then InstallDisk=`grep "$InstallDir" /etc/mtab | cut -d " " -f 1 | cut -c 1-8` @@ -952,20 +983,20 @@ AddBootEntry() { echo "manager. The boot order is being adjusted to make rEFInd the default boot" echo "manager. If this is NOT what you want, you should use efibootmgr to" echo "manually adjust your EFI's boot order." - "$Efibootmgr" -b $ExistingEntryBootNum -B &> /dev/null - InstallIt="1" fi - else - InstallIt="1" + "$Efibootmgr" -b $ExistingEntryBootNum -B &> /dev/null fi - if [[ $InstallIt == "1" ]] ; then - echo "Installing it!" + echo "Installing it!" + if [[ "$KeepName" == 0 ]] ; then "$Efibootmgr" -c -l "$EfiEntryFilename" -L "rEFInd Boot Manager" -d $InstallDisk -p $PartNum &> /dev/null - if [[ $? != 0 ]] ; then - EfibootmgrProblems=1 - Problems=1 - fi + else + "$Efibootmgr" -c -l "$EfiEntryFilename" -L "rEFInd Boot Manager" -d $InstallDisk -p $PartNum \ + -u "$TargetShim $TargetX64" &> /dev/null + fi + if [[ $? != 0 ]] ; then + EfibootmgrProblems=1 + Problems=1 fi else # efibootmgr not found @@ -1080,14 +1111,12 @@ InstallOnLinux() { # performs a few startup checks, and then calls functions to # install under OS X or Linux, depending on the detected platform. # -OSName=`uname -s` GetParams "$@" -ThisDir="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +ThisDir="$( cd -P "${BASH_SOURCE%/*}" && pwd )" RefindDir="$ThisDir/refind" -ThisScript="$ThisDir/`basename $0`" -if [[ `whoami` != "root" ]] ; then +if [[ $UID != 0 ]] ; then echo "Not running as root; attempting to elevate privileges via sudo...." - sudo "$ThisScript" "$@" + sudo "$BASH_SOURCE" "$@" if [[ $? != 0 ]] ; then echo "This script must be run as root (or using sudo). Exiting!" exit 1 @@ -1096,25 +1125,28 @@ if [[ `whoami` != "root" ]] ; then fi fi CheckForFiles -if [[ $OSName == 'Darwin' ]] ; then - if [[ "$ShimSource" != "none" ]] ; then - echo "The --shim option is not supported on OS X! Exiting!" - exit 1 - fi - if [[ "$LocalKeys" != 0 ]] ; then - echo "The --localkeys option is not supported on OS X! Exiting!" - exit 1 - fi - InstallOnOSX $1 -elif [[ $OSName == 'Linux' ]] ; then - InstallOnLinux -else - echo "Running on unknown OS; aborting!" - if [[ "$InstallToEspOnMac" == 0 ]] ; then - echo "The --notesp option is not supported on Linux! Exiting!" - exit 1 - fi -fi +case "$OSTYPE" in + darwin*) + if [[ "$ShimSource" != "none" ]] ; then + echo "The --shim option is not supported on OS X! Exiting!" + exit 1 + fi + if [[ "$LocalKeys" != 0 ]] ; then + echo "The --localkeys option is not supported on OS X! Exiting!" + exit 1 + fi + InstallOnOSX $1 + ;; + linux-gnu) + InstallOnLinux + ;; + *) + echo "Running on unknown OS; aborting!" + if [[ "$InstallToEspOnMac" == 0 ]] ; then + echo "The --notesp option is not supported on Linux! Exiting!" + exit 1 + fi +esac if [[ $Problems ]] ; then echo