]> code.delx.au - refind/blobdiff - install.sh
Icon for Fatdog Linux.
[refind] / install.sh
index e28fb41289c220d5d8c09d61e372024d3c15ffbe..d89c9ed24d6dbe066fc8d81af92091ad29af5082 100755 (executable)
@@ -29,6 +29,8 @@
 #
 # Revision history:
 #
+# 0.6.2-1 -- Added --yes option & tweaked key-copying for use with RPM install script
+# 0.6.1   -- Added --root option; minor bug fixes
 # 0.6.0   -- Changed --drivers to --alldrivers and added --nodrivers option;
 #            changed default driver installation behavior in Linux to install
 #            the driver needed to read /boot (if available)
 # Note: install.sh version numbers match those of the rEFInd package
 # with which they first appeared.
 
+RootDir="/"
 TargetDir=/EFI/refind
-EtcKeysDir=/etc/refind.d/keys
 LocalKeysBase="refind_local"
-RLConfFile="/boot/refind_linux.conf"
 ShimSource="none"
 TargetX64="refind_x64.efi"
 TargetIA32="refind_ia32.efi"
 LocalKeys=0
 DeleteRefindDir=0
+AlwaysYes=0
 
 #
 # Functions used by both OS X and Linux....
@@ -79,6 +81,9 @@ GetParams() {
               TargetIA32="bootia32.efi"
               shift
               ;;
+         --root) RootDir=$2
+              shift
+              ;;
          --localkeys) LocalKeys=1
               ;;
          --shim) ShimSource=$2
@@ -88,19 +93,45 @@ GetParams() {
               ;;
          --nodrivers) InstallDrivers="none"
               ;;
-         * ) echo "Usage: $0 [--esp | --usedefault {device-file}] [--nodrivers | --alldrivers] "
-             echo "                [--shim {shim-filename}] [--localkeys]"
+         --yes) AlwaysYes=1
+              ;;
+         * ) echo "Usage: $0 [--esp | --usedefault {device-file} | --root {directory} ]"
+             echo "                  [--nodrivers | --alldrivers] [--shim {shim-filename}]"
+             echo "                  [--localkeys] [--yes]"
              exit 1
       esac
       shift
    done
+
    if [[ $InstallToEspOnMac == 1 && $TargetDir == '/EFI/BOOT' ]] ; then
       echo "You may use --esp OR --usedefault, but not both! Aborting!"
       exit 1
    fi
-#   exit 1
+   if [[ $RootDir != '/' && $TargetDir == '/EFI/BOOT' ]] ; then
+      echo "You may use --usedefault OR --root, but not both! Aborting!"
+      exit 1
+   fi
+   if [[ $RootDir != '/' && $InstallToEspOnMac == 1 ]] ; then
+      echo "You may use --root OR --esp, but not both! Aborting!"
+      exit 1
+   fi
+
+   RLConfFile="$RootDir/boot/refind_linux.conf"
+   EtcKeysDir="$RootDir/etc/refind.d/keys"
 } # GetParams()
 
+# Get a yes/no response from the user and place it in the YesNo variable.
+# If the AlwaysYes variable is set to 1, skip the user input and set "Y"
+# in the YesNo variable.
+ReadYesNo() {
+   if [[ $AlwaysYes == 1 ]] ; then
+      YesNo="Y"
+      echo "Y"
+   else
+      read YesNo
+   fi
+}
+
 # Abort if the rEFInd files can't be found.
 # Also sets $ConfFile to point to the configuration file,
 # $IconsDir to point to the icons directory, and
@@ -191,6 +222,7 @@ CopyDrivers() {
               ;;
          hfsplus) DriverType="hfs"
               ;;
+         *) BootFS=""
       esac
       if [[ -n $BootFS ]] ; then
          echo "Installing driver for $BootFS (${DriverType}_$1.efi)"
@@ -204,7 +236,7 @@ CopyDrivers() {
 # Copy the rEFInd files to the ESP or OS X root partition.
 # Sets Problems=1 if any critical commands fail.
 CopyRefindFiles() {
-   mkdir -p $InstallDir/$TargetDir &> /dev/null
+   mkdir -p $InstallDir/$TargetDir
    if [[ $TargetDir == '/EFI/BOOT' ]] ; then
       cp $RefindDir/refind_ia32.efi $InstallDir/$TargetDir/$TargetIA32 2> /dev/null
       if [[ $? != 0 ]] ; then
@@ -246,8 +278,8 @@ CopyRefindFiles() {
          if [[ $LocalKeys == 0 ]] ; then
             echo "Storing copies of rEFInd Secure Boot public keys in $EtcKeysDir"
             mkdir -p $EtcKeysDir
-            cp $ThisDir/keys/refind.cer $EtcKeysDir
-            cp $ThisDir/keys/refind.crt $EtcKeysDir
+            cp $ThisDir/keys/refind.cer $EtcKeysDir 2> /dev/null
+            cp $ThisDir/keys/refind.crt $EtcKeysDir 2> /dev/null
          fi
       fi
    else
@@ -265,7 +297,9 @@ CopyRefindFiles() {
    if [[ $? != 0 ]] ; then
       Problems=1
    fi
-   cp -rf $ThisDir/keys $InstallDir/$TargetDir/
+   mkdir -p $InstallDir/$TargetDir/keys
+   cp -rf $ThisDir/keys/*.[cd]er $InstallDir/$TargetDir/keys/ 2> /dev/null
+   cp -rf $EtcKeysDir/*.[cd]er $InstallDir/$TargetDir/keys/ 2> /dev/null
    if [[ -f $InstallDir/$TargetDir/refind.conf ]] ; then
       echo "Existing refind.conf file found; copying sample file as refind.conf-sample"
       echo "to avoid overwriting your customizations."
@@ -343,7 +377,7 @@ InstallOnOSX() {
    elif [[ $InstallToEspOnMac == "1" ]] ; then
       MountOSXESP
    else
-      InstallDir="/"
+      InstallDir="$RootDir/"
    fi
    echo "Installing rEFInd to the partition mounted at '$InstallDir'"
    Platform=`ioreg -l -p IODeviceTree | grep firmware-abi | cut -d "\"" -f 4`
@@ -361,7 +395,7 @@ InstallOnOSX() {
       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
+      ReadYesNo
       if [[ $YesNo == "Y" || $YesNo == "y" ]] ; then
          echo "Deleting /Library/StartupItems/rEFItBlesser..."
          rm -r /Library/StartupItems/rEFItBlesser
@@ -385,19 +419,25 @@ 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
       echo ""
-      echo "CAUTION: The computer seems to have been booted with Secure Boot active, but"
-      echo "you haven't specified a valid shim.efi file source. The resulting installation"
-      echo "will not boot unless you disable Secure Boot. You may continue, but you should"
-      echo "consider using --shim to specify a working shim.efi file. You can read more"
-      echo "about this topic at http://www.rodsbooks.com/refind/secureboot.html."
+      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 "http://www.rodsbooks.com/refind/secureboot.html."
       echo ""
       echo -n "Do you want to proceed with installation (Y/N)? "
-      read ContYN
-      if [[ $ContYN == "Y" || $ContYN == "y" ]] ; then
+      ReadYesNo
+      if [[ $YesNo == "Y" || $YesNo == "y" ]] ; then
          echo "OK; continuing with the installation..."
       else
          exit 0
@@ -414,8 +454,8 @@ CheckSecureBoot() {
       echo "http://www.rodsbooks.com/refind/secureboot.html."
       echo ""
       echo -n "Do you want to proceed with installation (Y/N)? "
-      read ContYN
-      if [[ $ContYN == "Y" || $ContYN == "y" ]] ; then
+      ReadYesNo
+      if [[ $YesNo == "Y" || $YesNo == "y" ]] ; then
          echo "OK; continuing with the installation..."
       else
          exit 0
@@ -431,8 +471,8 @@ CheckSecureBoot() {
       echo "more about it at http://www.rodsbooks.com/refind/secureboot.html."
       echo ""
       echo -n "Do you want to proceed with installation (Y/N)? "
-      read ContYN
-      if [[ $ContYN == "Y" || $ContYN == "y" ]] ; then
+      ReadYesNo
+      if [[ $YesNo == "Y" || $YesNo == "y" ]] ; then
          echo "OK; continuing with the installation..."
       else
          exit 0
@@ -525,16 +565,22 @@ ReSignBinaries() {
    DeleteRefindDir=1
 }
 
-# Identifies the ESP's location (/boot or /boot/efi); aborts if
-# the ESP isn't mounted at either location.
+# Identifies the ESP's location (/boot or /boot/efi, or these locations under
+# the directory specified by --root); aborts if the ESP isn't mounted at
+# either location.
 # Sets InstallDir to the ESP mount point.
 FindLinuxESP() {
-   EspLine=`df /boot/efi | grep boot`
+   EspLine=`df $RootDir/boot/efi 2> /dev/null | grep boot/efi`
+   if [[ ! -n $EspLine ]] ; then
+      EspLine=`df $RootDir/boot | grep boot`
+   fi
    InstallDir=`echo $EspLine | cut -d " " -f 6`
-   EspFilesystem=`grep $InstallDir /etc/mtab | cut -d " " -f 3`
+   if [[ -n $InstallDir ]] ; then
+      EspFilesystem=`grep $InstallDir /etc/mtab | cut -d " " -f 3`
+   fi
    if [[ $EspFilesystem != 'vfat' ]] ; then
-      echo "/boot/efi doesn't seem to be on a VFAT filesystem. The ESP must be mounted at"
-      echo "/boot or /boot/efi and it must be VFAT! Aborting!"
+      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!"
       exit 1
    fi
    echo "ESP was found at $InstallDir using $EspFilesystem"
@@ -593,12 +639,14 @@ AddBootEntry() {
 
 # Create a minimal/sample refind_linux.conf file in /boot.
 GenerateRefindLinuxConf() {
-   if [[ ! -f $RLConfFile ]] ; then
-      if [[ -f /etc/default/grub ]] ; then
+   if [[ -f $RLConfFile ]] ; then
+      echo "Existing $RLConfFile found; not overwriting."
+   else
+      if [[ -f "$RootDir/etc/default/grub" ]] ; then
          # We want the default options used by the distribution, stored here....
-         source /etc/default/grub
+         source "$RootDir/etc/default/grub"
       fi
-      RootFS=`df / | grep dev | cut -f 1 -d " "`
+      RootFS=`df $RootDir | grep dev | cut -f 1 -d " "`
       StartOfDevname=`echo $RootFS | cut -b 1-7`
       if [[ $StartOfDevname == "/dev/sd" || $StartOfDevName == "/dev/hd" ]] ; then
          # Identify root filesystem by UUID rather than by device node, if possible
@@ -647,8 +695,8 @@ InstallOnLinux() {
       echo "to the following question..."
       echo
       echo -n "Are you sure you want to continue (Y/N)? "
-      read ContYN
-      if [[ $ContYN == "Y" || $ContYN == "y" ]] ; then
+      ReadYesNo
+      if [[ $YesNo == "Y" || $YesNo == "y" ]] ; then
          echo "OK; continuing with the installation..."
       else
          exit 0