# ./install.sh [options]
#
# options include:
-# "--esp" to install to the ESP rather than to the system's root
-# filesystem. This is the default on Linux.
+# "--notesp" to install to the OS X root filesystem rather than to the ESP.
+# This option may not be used under 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.
#
# Revision history:
#
+# 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
# 0.7.7 -- Fixed bug that created mangled refind_linux.conf file; added ability
# to locate and mount ESP on Linux, if it's not mounted
#
GetParams() {
- InstallToEspOnMac=0
- if [[ $OSName == "Linux" ]] ; then
- # Install the driver required to read /boot, if it's available
- InstallDrivers="boot"
- else
- InstallDrivers="none"
- fi
+ InstallToEspOnMac=1
+ # Install the driver required to read Linux /boot, if it's available
+ # Note: Under OS X, this will be installed only if a Linux partition
+ # is detected, in which case the ext4fs driver will be installed.
+ InstallDrivers="boot"
while [[ $# -gt 0 ]]; do
case $1 in
- --esp | --ESP) InstallToEspOnMac=1
+ --notesp) InstallToEspOnMac=0
;;
--ownhfs) OwnHfs=1
+ InstallToEspOnMac=0
TargetPart="$2"
TargetDir=/System/Library/CoreServices
shift
shift
;;
--root) RootDir="$2"
+ InstallToEspOnMac=0
shift
;;
--localkeys) LocalKeys=1
;;
--yes) AlwaysYes=1
;;
- * ) echo "Usage: $0 [--esp | --usedefault {device-file} | --root {directory} |"
+ * ) echo "Usage: $0 [--notesp | --usedefault {device-file} | --root {dir} |"
echo " --ownhfs {device-file} ]"
echo " [--nodrivers | --alldrivers] [--shim {shim-filename}]"
echo " [--localkeys] [--yes]"
shift
done
- if [[ $InstallToEspOnMac == 1 && "$TargetDir" == '/EFI/BOOT' ]] ; then
- echo "You may use --esp OR --usedefault, but not both! Aborting!"
- exit 1
- fi
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
if [[ "$TargetDir" != '/System/Library/CoreServices' && "$OwnHfs" == '1' ]] ; then
echo "If you use --ownhfs, you may NOT use --usedefault! Aborting!"
exit 1
fi
} # CopyKeys()
+# Determine (or guess) the filesystem used on the Linux /boot filesystem.
+# Store the result in the BootFS global variable.
+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
+} # SetBootFS()
+
# Copy drivers from $RefindDir/drivers_$1 to $InstallDir/$TargetDir/drivers_$1,
# honoring the $InstallDrivers condition. Must be passed a suitable
# architecture code (ia32 or x64).
CopyDrivers() {
- local Blkid
-
- Blkid=`which blkid 2> /dev/null`
if [[ $InstallDrivers == "all" ]] ; then
mkdir -p "$InstallDir/$TargetDir/drivers_$1"
cp "$ThisDir"/drivers_$1/*_$1.efi "$InstallDir/$TargetDir/drivers_$1/" 2> /dev/null
cp "$RefindDir"/drivers_$1/*_$1.efi "$InstallDir/$TargetDir/drivers_$1/" 2> /dev/null
- elif [[ "$InstallDrivers" == "boot" && -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 =`
+ elif [[ "$InstallDrivers" == "boot" ]] ; then
+ SetBootFS
DriverType=""
case $BootFS in
ext2 | ext3) DriverType="ext2"
cp "$RefindDir/drivers_$1/${DriverType}_$1.efi" "$InstallDir/$TargetDir/drivers_$1"/ 2> /dev/null
fi
fi
-}
+} # CopyDrivers()
# Copy tools (currently only gptsync, and that only on Macs) to the EFI/tools
# directory on the ESP. Must be passed a suitable architecture code (ia32
if [[ $InstallDrivers == "all" ]] ; then
cp -r "$RefindDir"/drivers_* "$InstallDir/$TargetDir/" 2> /dev/null
cp -r "$ThisDir"/drivers_* "$InstallDir/$TargetDir/" 2> /dev/null
- elif [[ $Upgrade == 1 ]] ; then
+ elif [[ $Upgrade == 1 || $InstallToEspOnMac == 1 ]] ; then
if [[ $Platform == 'EFI64' ]] ; then
CopyDrivers x64
CopyTools x64
fi
fi
Refind=""
+ if [[ $Platform == 'EFI64' ]] ; then
+ Refind='bootx64.efi'
+ elif [[ $Platform == 'EFI32' ]] ; then
+ Refind='bootia32.efi'
+ fi
CopyKeys
elif [[ $Platform == 'EFI64' || $TargetDir == "/EFI/Microsoft/Boot" ]] ; then
cp "$RefindDir/refind_x64.efi" "$InstallDir/$TargetDir/$TargetX64"
rmdir "$InstallDir"
exit 1
fi
- echo "UnmountEsp = $UnmountEsp"
} # 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 " | grep -o 'disk.*'`
+ Temp=$(mount | sed -n -E "/^(\/dev\/disk[0-9]+s[0-9]+) on \/ \(.*$/s//\1/p")
+ if [ $Temp ]; then
+ Temp=$(diskutil list | grep " EFI " | grep -o 'disk.*' | head -n 1)
+ if [ -z $Temp ]; then
+ echo "Warning: root device doesn't have an EFI partition"
+ fi
+ else
+ echo "Warning: root device could not be found"
+ fi
+ if [ -z $Temp ]; then
+ Temp=$(diskutil list | sed -n -E '/^ *[0-9]+:[ ]+EFI EFI[ ]+[0-9.]+ [A-Z]+[ ]+(disk[0-9]+s[0-9]+)$/ { s//\1/p
+ q
+ }' )
+
+ if [ -z $Temp ]; then
+ echo "Could not find an EFI partition. Aborting!"
+ exit 1
+ fi
+ fi
Esp=/dev/`echo $Temp`
# If the ESP is mounted, use its current mount point....
Temp=`df -P | grep "$Esp"`
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"?>
# Sets Problems=1 if problems found during the installation.
InstallOnOSX() {
echo "Installing rEFInd on OS X...."
- if [[ "$TargetDir" == "/EFI/BOOT" || "$OwnHfs" == '1' ]] ; then
- MountDefaultTarget
- elif [[ "$InstallToEspOnMac" == "1" ]] ; then
+ if [[ "$InstallToEspOnMac" == "1" ]] ; then
MountOSXESP
+ elif [[ "$TargetDir" == "/EFI/BOOT" || "$OwnHfs" == '1' ]] ; then
+ MountDefaultTarget
else
InstallDir="$RootDir/"
fi
InstallDir=`echo $EspLine | cut -d " " -f 6`
if [[ -n "$InstallDir" ]] ; then
- EspFilesystem=`grep "$InstallDir" /etc/mtab | uniq | grep -v autofs | cut -d " " -f 3`
+ EspFilesystem=`grep -w "$InstallDir" /etc/mtab | uniq | grep -v autofs | cut -d " " -f 3`
fi
if [[ $EspFilesystem != 'vfat' ]] ; then
FindLinuxESP
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
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
if [[ $Problems ]] ; then