]> code.delx.au - refind/blobdiff - install.sh
0.4.5 release
[refind] / install.sh
old mode 100755 (executable)
new mode 100644 (file)
index 1037bea..d77b8b0
 #
 # Revision history:
 #
-# 0.3.2 -- Initial version
+# 0.4.5   -- Fixed check for rEFItBlesser in OS X
+# 0.4.2   -- Added notice about BIOS-based OSes & made NVRAM changes in Linux smarter
+# 0.4.1   -- Added check for rEFItBlesser in OS X
+# 0.3.3.1 -- Fixed OS X 10.7 bug; also works as make target
+# 0.3.2.1 -- Check for presence of source files; aborts if not present
+# 0.3.2   -- Initial version
 #
 # Note: install.sh version numbers match those of the rEFInd package
 # with which they first appeared.
@@ -28,16 +33,49 @@ TargetDir=/EFI/refind
 # Functions used by both OS X and Linux....
 #
 
+# Abort if the rEFInd files can't be found.
+# Also sets $ConfFile to point to the configuration file, and
+# $IconsDir to point to the icons directory
+CheckForFiles() {
+   # Note: This check is satisfied if EITHER the 32- or the 64-bit version
+   # is found, even on the wrong platform. This is because the platform
+   # hasn't yet been determined. This could obviously be improved, but it
+   # would mean restructuring lots more code....
+   if [[ ! -f $RefindDir/refind_ia32.efi && ! -f $RefindDir/refind_x64.efi ]] ; then
+      echo "The rEFInd binary file is missing! Aborting installation!"
+      exit 1
+   fi
+
+   if [[ -f $RefindDir/refind.conf-sample ]] ; then
+      ConfFile=$RefindDir/refind.conf-sample
+   elif [[ -f $ThisDir/refind.conf-sample ]] ; then
+      ConfFile=$ThisDir/refind.conf-sample
+   else
+      echo "The sample configuration file is missing! Aborting installation!"
+      exit 1
+   fi
+
+   if [[ -d $RefindDir/icons ]] ; then
+      IconsDir=$RefindDir/icons
+   elif [[ -d $ThisDir/icons ]] ; then
+      IconsDir=$ThisDir/icons
+   else
+      echo "The icons directory is missing! Aborting installation!"
+   fi
+} # CheckForFiles()
+
+# Copy the rEFInd files to the ESP or OS X root partition.
+# Sets Problems=1 if any critical commands fail.
 CopyRefindFiles() {
    mkdir -p $InstallPart/$TargetDir &> /dev/null
    if [[ $Platform == 'EFI32' ]] ; then
-      cp $SourceDir/refind_ia32.efi $InstallPart/$TargetDir
+      cp $RefindDir/refind_ia32.efi $InstallPart/$TargetDir
       if [[ $? != 0 ]] ; then
          Problems=1
       fi
       Refind="refind_ia32.efi"
    elif [[ $Platform == 'EFI64' ]] ; then
-      cp $SourceDir/refind_x64.efi $InstallPart/$TargetDir
+      cp $RefindDir/refind_x64.efi $InstallPart/$TargetDir
       if [[ $? != 0 ]] ; then
          Problems=1
       fi
@@ -53,7 +91,7 @@ CopyRefindFiles() {
       mv -f $InstallPart/$TargetDir/icons $InstallPart/$TargetDir/icons-backup
       echo "Notice: Backed up existing icons directory as icons-backup."
    fi
-   cp -r $SourceDir/icons $InstallPart/$TargetDir
+   cp -r $IconsDir $InstallPart/$TargetDir
    if [[ $? != 0 ]] ; then
       Problems=1
    fi
@@ -61,7 +99,7 @@ CopyRefindFiles() {
       echo "Existing refind.conf file found; copying sample file as refind.conf-sample"
       echo "to avoid collision."
       echo ""
-      cp -f $SourceDir/refind.conf-sample $InstallPart/$TargetDir
+      cp -f $ConfFile $InstallPart/$TargetDir
       if [[ $? != 0 ]] ; then
          Problems=1
       fi
@@ -69,7 +107,7 @@ CopyRefindFiles() {
       echo "Copying sample configuration file as refind.conf; edit this file to configure"
       echo "rEFInd."
       echo ""
-      cp -f $SourceDir/refind.conf-sample $InstallPart/$TargetDir/refind.conf
+      cp -f $ConfFile $InstallPart/$TargetDir/refind.conf
       if [[ $? != 0 ]] ; then
          Problems=1
       fi
@@ -88,7 +126,7 @@ CopyRefindFiles() {
 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`
+   Temp=`diskutil list | grep " EFI "`
    Esp=/dev/`echo $Temp | cut -f 5 -d ' '`
    # If the ESP is mounted, use its current mount point....
    Temp=`df | grep $Esp`
@@ -105,6 +143,8 @@ MountOSXESP() {
    fi
 } # MountOSXESP()
 
+# Control the OS X installation.
+# Sets Problems=1 if problems found during the installation.
 InstallOnOSX() {
    echo "Installing rEFInd on OS X...."
    if [[ $1 == 'esp' || $1 == 'ESP' ]] ; then
@@ -123,11 +163,29 @@ InstallOnOSX() {
    if [[ $? != 0 ]] ; then
       Problems=1
    fi
+   if [[ -f /Library/StartupItems/rEFItBlesser || -d /Library/StartupItems/rEFItBlesser ]] ; then
+      echo
+      echo "/Library/StartupItems/rEFItBlesser found!"
+      echo "This program is part of rEFIt, and will cause rEFInd to fail to work after"
+      echo -n "its first boot. Do you want to remove rEFItBlesser (Y/N)? "
+      read YesNo
+      if [[ $YesNo == "Y" || $YesNo == "y" ]] ; then
+         echo "Deleting /Library/StartupItems/rEFItBlesser..."
+        rm -r /Library/StartupItems/rEFItBlesser
+      else
+         echo "Not deleting rEFItBlesser."
+      fi
+   fi
    echo
    echo "WARNING: If you have an Advanced Format disk, *DO NOT* attempt to check the"
    echo "bless status with 'bless --info', since this is known to cause disk corruption"
    echo "on some systems!!"
    echo
+   echo "NOTE: If you want to boot an OS via BIOS emulation (such as Windows or some"
+   echo "Linux installations), you *MUST* edit the $InstallPart/$TargetDir/refind.conf"
+   echo "file's 'scanfor' line to include the 'hdbios' option, and perhaps"
+   echo "'biosexternal' and 'cd', as well."
+   echo
 } # InstallOnOSX()
 
 
@@ -135,6 +193,9 @@ InstallOnOSX() {
 # Now a series of Linux support functions....
 #
 
+# Identifies the ESP's location (/boot or /boot/efi); aborts if
+# the ESP isn't mounted at either location.
+# Sets InstallPart to the ESP mount point.
 FindLinuxESP() {
    EspLine=`df /boot/efi | grep boot`
    InstallPart=`echo $EspLine | cut -d " " -f 6`
@@ -147,7 +208,10 @@ FindLinuxESP() {
    echo "ESP was found at $InstallPart using $EspFilesystem"
 } # MountLinuxESP
 
+# Uses efibootmgr to add an entry for rEFInd to the EFI's NVRAM.
+# If this fails, sets Problems=1
 AddBootEntry() {
+   InstallIt="0"
    Efibootmgr=`which efibootmgr 2> /dev/null`
    if [[ $Efibootmgr ]] ; then
       modprobe efivars &> /dev/null
@@ -155,17 +219,27 @@ AddBootEntry() {
       PartNum=`grep $InstallPart /etc/mtab | cut -d " " -f 1 | cut -c 9-10`
       EntryFilename=$TargetDir/$Refind
       EfiEntryFilename=`echo ${EntryFilename//\//\\\}`
-      ExistingEntry=`$Efibootmgr -v | grep $Refind`
+      EfiEntryFilename2=`echo ${EfiEntryFilename} | sed s/\\\\\\\\/\\\\\\\\\\\\\\\\/g`
+      ExistingEntry=`$Efibootmgr -v | grep $EfiEntryFilename2`
       if [[ $ExistingEntry ]] ; then
-         echo "An existing EFI boot manager entry for rEFInd seems to exist:"
-         echo
-         echo "$ExistingEntry"
-         echo
-         echo "This entry is NOT being modified, and no new entry is being created."
+         ExistingEntryBootNum=`echo $ExistingEntry | cut -c 5-8`
+         FirstBoot=`$Efibootmgr | grep BootOrder | cut -c 12-15`
+         if [[ $ExistingEntryBootNum != $FirstBoot ]] ; then
+            echo "An existing rEFInd boot entry exists, but isn't set as the default boot"
+            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"
+      fi
+      if [[ $InstallIt == "1" ]] ; then
+         echo "Installing it!"
          $Efibootmgr -c -l $EfiEntryFilename -L rEFInd -d $InstallDisk -p $PartNum &> /dev/null
          if [[ $? != 0 ]] ; then
-           EfibootmgrProblems=1
+            EfibootmgrProblems=1
             Problems=1
          fi
       fi
@@ -182,6 +256,8 @@ AddBootEntry() {
    fi
 } # AddBootEntry()
 
+# Controls rEFInd installation under Linux.
+# Sets Problems=1 if something goes wrong.
 InstallOnLinux() {
    echo "Installing rEFInd on Linux...."
    FindLinuxESP
@@ -213,10 +289,17 @@ InstallOnLinux() {
    AddBootEntry
 } # InstallOnLinux()
 
-# The main part of the script; just checks the OS and calls a
-# function for installing on that platform....
+#
+# The main part of the script. Sets a few environment variables,
+# performs a few startup checks, and then calls functions to
+# install under OS X or Linux, depending on the detected platform.
+#
 
-ThisScript=`readlink -f $0`
+OSName=`uname -s`
+ThisDir="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+RefindDir="$ThisDir/refind"
+ThisScript="$ThisDir/`basename $0`"
+CheckForFiles
 if [[ `whoami` != "root" ]] ; then
    echo "Not running as root; attempting to elevate privileges via sudo...."
    sudo $ThisScript $1
@@ -227,8 +310,6 @@ if [[ `whoami` != "root" ]] ; then
       exit 0
    fi
 fi
-OSName=`uname -s`
-SourceDir=`dirname $ThisScript`/refind
 if [[ $OSName == 'Darwin' ]] ; then
    InstallOnOSX $1
 elif [[ $OSName == 'Linux' ]] ; then