]> code.delx.au - refind/blobdiff - install.sh
Added support for "-1" value to "screensaver" token. Modified
[refind] / install.sh
index dc6d8985a41c241772a98d6b42c3adf89bcce4d0..a31dbb33b9c9325203981f1ae2c346917c9414ed 100755 (executable)
@@ -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"
+<xml version="1.0" encoding="UTF-8"?>
+<plist version="1.0">
+<dict>
+        <key>ProductBuildVersion</key>
+        <string></string>
+        <key>ProductName</key>
+        <string>rEFInd</string>
+        <key>ProductVersion</key>
+        <string>0.7.6</string>
+</dict>
+</plist>
+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,9 +764,11 @@ 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"
+         echo "Setting default boot options based on $RootDir/etc/default/grub"
       fi
       RootFS=`df "$RootDir" | grep dev | cut -f 1 -d " "`
       StartOfDevname=`echo "$RootFS" | cut -b 1-7`
@@ -717,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
 }
 
@@ -829,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
@@ -937,7 +1005,7 @@ else
    echo
 fi
 
-if [[ $UnmountEsp ]] ; then
+if [[ $UnmountEsp == '1' ]] ; then
    echo "Unmounting install dir"
    umount $InstallDir
 fi