]>
code.delx.au - refind/blob - install.sh
3 # Linux/MacOS X script to install rEFInd
7 # ./install.sh [options]
10 # "--esp" to install to the ESP rather than to the system's root
11 # filesystem. This is the default on Linux
12 # "--usedefault {devicefile}" to install as default
13 # (/EFI/BOOT/BOOTX64.EFI and similar) to the specified device
14 # (/dev/sdd1 or whatever) without registering with the NVRAM.
15 # "--alldrivers" to install all drivers along with regular files
16 # "--nodrivers" to suppress driver installation (default in Linux is
17 # driver used on /boot; --nodrivers is OS X default)
18 # "--shim {shimfile}" to install a shim.efi file for Secure Boot
19 # "--localkeys" to re-sign x86-64 binaries with a locally-generated key
21 # The "esp" option is valid only on Mac OS X; it causes
22 # installation to the EFI System Partition (ESP) rather than
23 # to the current OS X boot partition. Under Linux, this script
24 # installs to the ESP by default.
26 # This program is copyright (c) 2012 by Roderick W. Smith
27 # It is released under the terms of the GNU GPL, version 3,
28 # a copy of which should be included in the file COPYING.txt.
32 # 0.6.3 -- Support for detecting rEFInd in EFI/BOOT and EFI/Microsoft/Boot
33 # directories & for installing to EFI/BOOT in BIOS mode
34 # 0.6.2-1 -- Added --yes option & tweaked key-copying for use with RPM install script
35 # 0.6.1 -- Added --root option; minor bug fixes
36 # 0.6.0 -- Changed --drivers to --alldrivers and added --nodrivers option;
37 # changed default driver installation behavior in Linux to install
38 # the driver needed to read /boot (if available)
39 # 0.5.1.2 -- Fixed bug that caused failure to generate refind_linux.conf file
40 # 0.5.1.1 -- Fixed bug that caused script failure under OS X
41 # 0.5.1 -- Added --shim & --localkeys options & create sample refind_linux.conf
43 # 0.5.0 -- Added --usedefault & --drivers options & changed "esp" option to "--esp"
44 # 0.4.5 -- Fixed check for rEFItBlesser in OS X
45 # 0.4.2 -- Added notice about BIOS-based OSes & made NVRAM changes in Linux smarter
46 # 0.4.1 -- Added check for rEFItBlesser in OS X
47 # 0.3.3.1 -- Fixed OS X 10.7 bug; also works as make target
48 # 0.3.2.1 -- Check for presence of source files; aborts if not present
49 # 0.3.2 -- Initial version
51 # Note: install.sh version numbers match those of the rEFInd package
52 # with which they first appeared.
56 LocalKeysBase
="refind_local"
59 TargetX64
="refind_x64.efi"
60 TargetIA32
="refind_ia32.efi"
66 # Functions used by both OS X and Linux....
71 if [[ $OSName == "Linux" ]] ; then
72 # Install the driver required to read /boot, if it's available
77 while [[ $# -gt 0 ]]; do
79 --esp |
--ESP) InstallToEspOnMac
=1
81 --usedefault) TargetDir
=/EFI
/BOOT
83 TargetX64
="bootx64.efi"
84 TargetIA32
="bootia32.efi"
90 --localkeys) LocalKeys
=1
95 --drivers |
--alldrivers) InstallDrivers
="all"
97 --nodrivers) InstallDrivers
="none"
101 * ) echo "Usage: $0 [--esp | --usedefault {device-file} | --root {directory} ]"
102 echo " [--nodrivers | --alldrivers] [--shim {shim-filename}]"
103 echo " [--localkeys] [--yes]"
109 if [[ $InstallToEspOnMac == 1 && $TargetDir == '/EFI/BOOT' ]] ; then
110 echo "You may use --esp OR --usedefault, but not both! Aborting!"
113 if [[ $RootDir != '/' && $TargetDir == '/EFI/BOOT' ]] ; then
114 echo "You may use --usedefault OR --root, but not both! Aborting!"
117 if [[ $RootDir != '/' && $InstallToEspOnMac == 1 ]] ; then
118 echo "You may use --root OR --esp, but not both! Aborting!"
122 RLConfFile
="$RootDir/boot/refind_linux.conf"
123 EtcKeysDir
="$RootDir/etc/refind.d/keys"
126 # Get a yes/no response from the user and place it in the YesNo variable.
127 # If the AlwaysYes variable is set to 1, skip the user input and set "Y"
128 # in the YesNo variable.
130 if [[ $AlwaysYes == 1 ]] ; then
138 # Abort if the rEFInd files can't be found.
139 # Also sets $ConfFile to point to the configuration file,
140 # $IconsDir to point to the icons directory, and
141 # $ShimSource to the source of the shim.efi file (if necessary).
143 # Note: This check is satisfied if EITHER the 32- or the 64-bit version
144 # is found, even on the wrong platform. This is because the platform
145 # hasn't yet been determined. This could obviously be improved, but it
146 # would mean restructuring lots more code....
147 if [[ ! -f $RefindDir/refind_ia32.efi
&& ! -f $RefindDir/refind_x64.efi
]] ; then
148 echo "The rEFInd binary file is missing! Aborting installation!"
152 if [[ -f $RefindDir/refind.conf-sample
]] ; then
153 ConfFile
=$RefindDir/refind.conf-sample
154 elif [[ -f $ThisDir/refind.conf-sample
]] ; then
155 ConfFile
=$ThisDir/refind.conf-sample
157 echo "The sample configuration file is missing! Aborting installation!"
161 if [[ -d $RefindDir/icons
]] ; then
162 IconsDir
=$RefindDir/icons
163 elif [[ -d $ThisDir/icons
]] ; then
164 IconsDir
=$ThisDir/icons
166 echo "The icons directory is missing! Aborting installation!"
170 if [[ $ShimSource != "none" ]] ; then
171 if [[ -f $ShimSource ]] ; then
172 TargetX64
="grubx64.efi"
173 MokManagerSource
=`dirname $ShimSource`/MokManager.efi
175 echo "The specified shim file, $ShimSource, doesn't exist!"
176 echo "Aborting installation!"
182 # Helper for CopyRefindFiles; copies shim files (including MokManager, if it's
183 # available) to target.
185 cp $ShimSource $InstallDir/$TargetDir/$TargetShim
186 if [[ $?
!= 0 ]] ; then
189 if [[ -f $MokManagerSource ]] ; then
190 cp $MokManagerSource $InstallDir/$TargetDir/
192 if [[ $?
!= 0 ]] ; then
197 # Copy the public keys to the installation medium
199 if [[ $LocalKeys == 1 ]] ; then
200 mkdir
-p $InstallDir/$TargetDir/keys
/
201 cp $EtcKeysDir/$LocalKeysBase.cer
$InstallDir/$TargetDir/keys
/
202 cp $EtcKeysDir/$LocalKeysBase.crt
$InstallDir/$TargetDir/keys
/
204 # cp $ThisDir/refind.cer $InstallDir/$TargetDir/keys/
205 # cp $ThisDir/refind.crt $InstallDir/$TargetDir/keys/
209 # Copy drivers from $RefindDir/drivers_$1 to $InstallDir/$TargetDir/drivers_$1,
210 # honoring the $InstallDrivers condition. Must be passed a suitable
211 # architecture code (ia32 or x64).
213 if [[ $InstallDrivers == "all" ]] ; then
214 mkdir
-p $InstallDir/$TargetDir/drivers_
$1
215 cp $RefindDir/drivers_
$1/*_
$1.efi
$InstallDir/$TargetDir/drivers_
$1/ 2> /dev
/null
216 cp $ThisDir/drivers_
$1/*_
$1.efi
$InstallDir/$TargetDir/drivers_
$1/ 2> /dev
/null
217 elif [[ $InstallDrivers == "boot" && -x `which blkid` ]] ; then
218 BootPart
=`df /boot | grep dev | cut -f 1 -d " "`
219 BootFS
=`blkid -o export $BootPart 2> /dev/null | grep TYPE= | cut -f 2 -d =`
222 ext2 | ext3 | ext4
) DriverType
="ext4"
224 reiserfs
) DriverType
="reiserfs"
226 hfsplus
) DriverType
="hfs"
230 if [[ -n $BootFS ]] ; then
231 echo "Installing driver for $BootFS (${DriverType}_$1.efi)"
232 mkdir
-p $InstallDir/$TargetDir/drivers_
$1
233 cp $RefindDir/drivers_
$1/${DriverType}_
$1.efi
$InstallDir/$TargetDir/drivers_
$1/ 2> /dev
/null
234 cp $ThisDir/drivers_
$1/${DriverType}_
$1.efi
$InstallDir/$TargetDir/drivers_
$1/ 2> /dev
/null
239 # Copy the rEFInd files to the ESP or OS X root partition.
240 # Sets Problems=1 if any critical commands fail.
242 mkdir
-p $InstallDir/$TargetDir
243 if [[ $TargetDir == '/EFI/BOOT' ]] ; then
244 cp $RefindDir/refind_ia32.efi
$InstallDir/$TargetDir/$TargetIA32 2> /dev
/null
245 if [[ $?
!= 0 ]] ; then
246 echo "Note: IA32 (x86) binary not installed!"
248 cp $RefindDir/refind_x64.efi
$InstallDir/$TargetDir/$TargetX64 2> /dev
/null
249 if [[ $?
!= 0 ]] ; then
252 if [[ $ShimSource != "none" ]] ; then
253 TargetShim
="bootx64.efi"
256 if [[ $InstallDrivers == "all" ]] ; then
257 cp -r $RefindDir/drivers_
* $InstallDir/$TargetDir/ 2> /dev
/null
258 cp -r $ThisDir/drivers_
* $InstallDir/$TargetDir/ 2> /dev
/null
262 elif [[ $Platform == 'EFI64' ||
$TargetDir == "/EFI/Microsoft/Boot" ]] ; then
263 cp $RefindDir/refind_x64.efi
$InstallDir/$TargetDir/$TargetX64
264 if [[ $?
!= 0 ]] ; then
268 Refind
="refind_x64.efi"
270 if [[ $ShimSource != "none" ]] ; then
271 if [[ $TargetShim == "default" ]] ; then
272 TargetShim
=`basename $ShimSource`
276 if [[ $LocalKeys == 0 ]] ; then
277 echo "Storing copies of rEFInd Secure Boot public keys in $EtcKeysDir"
279 cp $ThisDir/keys
/refind.cer
$EtcKeysDir 2> /dev
/null
280 cp $ThisDir/keys
/refind.crt
$EtcKeysDir 2> /dev
/null
283 elif [[ $Platform == 'EFI32' ]] ; then
284 cp $RefindDir/refind_ia32.efi
$InstallDir/$TargetDir/$TargetIA32
285 if [[ $?
!= 0 ]] ; then
289 Refind
="refind_ia32.efi"
291 echo "Unknown platform! Aborting!"
294 echo "Copied rEFInd binary files"
296 if [[ -d $InstallDir/$TargetDir/icons
]] ; then
297 rm -rf $InstallDir/$TargetDir/icons-backup
&> /dev
/null
298 mv -f $InstallDir/$TargetDir/icons
$InstallDir/$TargetDir/icons-backup
299 echo "Notice: Backed up existing icons directory as icons-backup."
301 cp -r $IconsDir $InstallDir/$TargetDir
302 if [[ $?
!= 0 ]] ; then
305 mkdir
-p $InstallDir/$TargetDir/keys
306 cp -rf $ThisDir/keys
/*.
[cd]er
$InstallDir/$TargetDir/keys
/ 2> /dev
/null
307 cp -rf $EtcKeysDir/*.
[cd]er
$InstallDir/$TargetDir/keys
/ 2> /dev
/null
308 if [[ -f $InstallDir/$TargetDir/refind.conf
]] ; then
309 echo "Existing refind.conf file found; copying sample file as refind.conf-sample"
310 echo "to avoid overwriting your customizations."
312 cp -f $ConfFile $InstallDir/$TargetDir
313 if [[ $?
!= 0 ]] ; then
317 echo "Copying sample configuration file as refind.conf; edit this file to configure"
320 cp -f $ConfFile $InstallDir/$TargetDir/refind.conf
321 if [[ $?
!= 0 ]] ; then
325 if [[ $DeleteRefindDir == 1 ]] ; then
326 echo "Deleting the temporary directory $RefindDir"
329 } # CopyRefindFiles()
331 # Mount the partition the user specified with the --usedefault option
332 MountDefaultTarget
() {
333 InstallDir
=/tmp
/refind_install
335 if [[ $OSName == 'Darwin' ]] ; then
336 mount
-t msdos
$TargetPart $InstallDir
337 elif [[ $OSName == 'Linux' ]] ; then
338 mount
-t vfat
$TargetPart $InstallDir
340 if [[ $?
!= 0 ]] ; then
341 echo "Couldn't mount $TargetPart ! Aborting!"
346 } # MountDefaultTarget()
349 # A series of OS X support functions....
352 # Mount the ESP at /Volumes/ESP or determine its current mount
354 # Sets InstallDir to the ESP mount point
355 # Sets UnmountEsp if we mounted it
357 # Identify the ESP. Note: This returns the FIRST ESP found;
358 # if the system has multiple disks, this could be wrong!
359 Temp
=`diskutil list | grep " EFI "`
360 Esp
=/dev
/`echo $Temp | cut -f 5 -d ' '`
361 # If the ESP is mounted, use its current mount point....
362 Temp
=`df | grep $Esp`
363 InstallDir
=`echo $Temp | cut -f 6 -d ' '`
364 if [[ $InstallDir == '' ]] ; then
365 mkdir
/Volumes
/ESP
&> /dev
/null
366 mount
-t msdos
$Esp /Volumes
/ESP
367 if [[ $?
!= 0 ]] ; then
368 echo "Unable to mount ESP! Aborting!\n"
372 InstallDir
="/Volumes/ESP"
376 # Control the OS X installation.
377 # Sets Problems=1 if problems found during the installation.
379 echo "Installing rEFInd on OS X...."
380 if [[ $TargetDir == "/EFI/BOOT" ]] ; then
382 elif [[ $InstallToEspOnMac == "1" ]] ; then
385 InstallDir
="$RootDir/"
387 echo "Installing rEFInd to the partition mounted at '$InstallDir'"
388 Platform
=`ioreg -l -p IODeviceTree | grep firmware-abi | cut -d "\"" -f 4`
390 if [[ $InstallToEspOnMac == "1" ]] ; then
391 bless
--mount $InstallDir --setBoot --file $InstallDir/$TargetDir/$Refind
392 elif [[ $TargetDir != "/EFI/BOOT" ]] ; then
393 bless
--setBoot --folder $InstallDir/$TargetDir --file $InstallDir/$TargetDir/$Refind
395 if [[ $?
!= 0 ]] ; then
398 if [[ -f /Library
/StartupItems
/rEFItBlesser ||
-d /Library
/StartupItems
/rEFItBlesser
]] ; then
400 echo "/Library/StartupItems/rEFItBlesser found!"
401 echo "This program is part of rEFIt, and will cause rEFInd to fail to work after"
402 echo -n "its first boot. Do you want to remove rEFItBlesser (Y/N)? "
404 if [[ $YesNo == "Y" ||
$YesNo == "y" ]] ; then
405 echo "Deleting /Library/StartupItems/rEFItBlesser..."
406 rm -r /Library
/StartupItems
/rEFItBlesser
408 echo "Not deleting rEFItBlesser."
412 echo "WARNING: If you have an Advanced Format disk, *DO NOT* attempt to check the"
413 echo "bless status with 'bless --info', since this is known to cause disk corruption"
414 echo "on some systems!!"
420 # Now a series of Linux support functions....
423 # Check for evidence that we're running in Secure Boot mode. If so, and if
424 # appropriate options haven't been set, warn the user and offer to abort.
425 # If we're NOT in Secure Boot mode but the user HAS specified the --shim
426 # or --localkeys option, warn the user and offer to abort.
428 # FIXME: Although I checked the presence (and lack thereof) of the
429 # /sys/firmware/efi/vars/SecureBoot* files on my Secure Boot test system
430 # before releasing this script, I've since found that they are at least
431 # sometimes present when Secure Boot is absent. This means that the first
432 # test can produce false alarms. A better test is highly desirable.
434 VarFile
=`ls -d /sys/firmware/efi/vars/SecureBoot* 2> /dev/null`
435 if [[ -n $VarFile && $TargetDir != '/EFI/BOOT' && $ShimSource == "none" ]] ; then
437 echo "CAUTION: Your computer appears to support Secure Boot, but you haven't"
438 echo "specified a valid shim.efi file source. If you've disabled Secure Boot and"
439 echo "intend to leave it disabled, this is fine; but if Secure Boot is active, the"
440 echo "resulting installation won't boot. You can read more about this topic at"
441 echo "http://www.rodsbooks.com/refind/secureboot.html."
443 echo -n "Do you want to proceed with installation (Y/N)? "
445 if [[ $YesNo == "Y" ||
$YesNo == "y" ]] ; then
446 echo "OK; continuing with the installation..."
452 if [[ $ShimSource != "none" && ! -n $VarFile ]] ; then
454 echo "You've specified installing using a shim.efi file, but your computer does not"
455 echo "appear to be running in Secure Boot mode. Although installing in this way"
456 echo "should work, it's unnecessarily complex. You may continue, but unless you"
457 echo "plan to enable Secure Boot, you should consider stopping and omitting the"
458 echo "--shim option. You can read more about this topic at"
459 echo "http://www.rodsbooks.com/refind/secureboot.html."
461 echo -n "Do you want to proceed with installation (Y/N)? "
463 if [[ $YesNo == "Y" ||
$YesNo == "y" ]] ; then
464 echo "OK; continuing with the installation..."
470 if [[ $LocalKeys != 0 && ! -n $VarFile ]] ; then
472 echo "You've specified re-signing your rEFInd binaries with locally-generated keys,"
473 echo "but your computer does not appear to be running in Secure Boot mode. The"
474 echo "keys you generate will be useless unless you enable Secure Boot. You may"
475 echo "proceed with this installation, but before you do so, you may want to read"
476 echo "more about it at http://www.rodsbooks.com/refind/secureboot.html."
478 echo -n "Do you want to proceed with installation (Y/N)? "
480 if [[ $YesNo == "Y" ||
$YesNo == "y" ]] ; then
481 echo "OK; continuing with the installation..."
487 } # CheckSecureBoot()
489 # Check for the presence of locally-generated keys from a previous installation in
490 # $EtcKeysDir (/etc/refind.d/keys). If they're not present, generate them using
493 PrivateKey
=$EtcKeysDir/$LocalKeysBase.key
494 CertKey
=$EtcKeysDir/$LocalKeysBase.crt
495 DerKey
=$EtcKeysDir/$LocalKeysBase.cer
496 OpenSSL
=`which openssl 2> /dev/null`
498 # Do the work only if one or more of the necessary keys is missing
499 # TODO: Technically, we don't need the DerKey; but if it's missing and openssl
500 # is also missing, this will fail. This could be improved.
501 if [[ ! -f $PrivateKey ||
! -f $CertKey ||
! -f $DerKey ]] ; then
502 echo "Generating a fresh set of local keys...."
504 chmod 0700 $EtcKeysDir
505 if [[ ! -x $OpenSSL ]] ; then
506 echo "Can't find openssl, which is required to create your private signing keys!"
510 if [[ -f $PrivateKey ]] ; then
511 echo "Backing up existing $PrivateKey"
512 cp -f $PrivateKey $PrivateKey.backup
2> /dev
/null
514 if [[ -f $CertKey ]] ; then
515 echo "Backing up existing $CertKey"
516 cp -f $CertKey $CertKey.backup
2> /dev
/null
518 if [[ -f $DerKey ]] ; then
519 echo "Backing up existing $DerKey"
520 cp -f $DerKey $DerKey.backup
2> /dev
/null
522 $OpenSSL req
-new -x509 -newkey rsa
:2048 -keyout $PrivateKey -out $CertKey \
523 -nodes -days 3650 -subj "/CN=Locally-generated rEFInd key/"
524 $OpenSSL x509
-in $CertKey -out $DerKey -outform DER
525 chmod 0600 $PrivateKey
527 echo "Using existing local keys...."
531 # Sign a single binary. Requires parameters:
533 # $2 = destination file
534 # Also assumes that the SBSign, PESign, UseSBSign, UsePESign, and various key variables are set
536 # Aborts script on error
538 $SBSign --key $PrivateKey --cert $CertKey --output $2 $1
539 if [[ $?
!= 0 ]] ; then
540 echo "Problem signing the binary $1! Aborting!"
545 # Re-sign the x86-64 binaries with a locally-generated key, First look for appropriate
546 # key files in $EtcKeysDir. If they're present, use them to re-sign the binaries. If
547 # not, try to generate new keys and store them in $EtcKeysDir.
549 SBSign
=`which sbsign 2> /dev/null`
550 echo "Found sbsign at $SBSign"
551 TempDir
="/tmp/refind_local"
552 if [[ ! -x $SBSign ]] ; then
553 echo "Can't find sbsign, which is required to sign rEFInd with your own keys!"
558 mkdir
-p $TempDir/drivers_x64
559 cp $RefindDir/refind.conf-sample
$TempDir 2> /dev
/null
560 cp $ThisDir/refind.conf-sample
$TempDir 2> /dev
/null
561 cp $RefindDir/refind_ia32.efi
$TempDir 2> /dev
/null
562 cp -a $RefindDir/drivers_ia32
$TempDir 2> /dev
/null
563 cp -a $ThisDir/drivers_ia32
$TempDir 2> /dev
/null
564 SignOneBinary
$RefindDir/refind_x64.efi
$TempDir/refind_x64.efi
565 for Driver
in `ls $RefindDir/drivers_x64/*.efi $ThisDir/drivers_x64/*.efi 2> /dev/null` ; do
566 TempName
=`basename $Driver`
567 SignOneBinary
$Driver $TempDir/drivers_x64
/$TempName
573 # Identifies the ESP's location (/boot or /boot/efi, or these locations under
574 # the directory specified by --root); aborts if the ESP isn't mounted at
576 # Sets InstallDir to the ESP mount point.
578 EspLine
=`df $RootDir/boot/efi 2> /dev/null | grep boot/efi`
579 if [[ ! -n $EspLine ]] ; then
580 EspLine
=`df $RootDir/boot | grep boot`
582 InstallDir
=`echo $EspLine | cut -d " " -f 6`
583 if [[ -n $InstallDir ]] ; then
584 EspFilesystem
=`grep $InstallDir /etc/mtab | cut -d " " -f 3`
586 if [[ $EspFilesystem != 'vfat' ]] ; then
587 echo "$RootDir/boot/efi doesn't seem to be on a VFAT filesystem. The ESP must be"
588 echo "mounted at $RootDir/boot or $RootDir/boot/efi and it must be VFAT! Aborting!"
591 echo "ESP was found at $InstallDir using $EspFilesystem"
594 # Uses efibootmgr to add an entry for rEFInd to the EFI's NVRAM.
595 # If this fails, sets Problems=1
598 Efibootmgr
=`which efibootmgr 2> /dev/null`
599 if [[ $Efibootmgr ]] ; then
600 InstallDisk
=`grep $InstallDir /etc/mtab | cut -d " " -f 1 | cut -c 1-8`
601 PartNum
=`grep $InstallDir /etc/mtab | cut -d " " -f 1 | cut -c 9-10`
602 EntryFilename
=$TargetDir/$Refind
603 EfiEntryFilename
=`echo ${EntryFilename//\//\\\}`
604 EfiEntryFilename2
=`echo ${EfiEntryFilename} | sed s/\\\\\\\\/\\\\\\\\\\\\\\\\/g`
605 ExistingEntry
=`$Efibootmgr -v | grep $EfiEntryFilename2`
607 if [[ $ExistingEntry ]] ; then
608 ExistingEntryBootNum
=`echo $ExistingEntry | cut -c 5-8`
609 FirstBoot
=`$Efibootmgr | grep BootOrder | cut -c 12-15`
610 if [[ $ExistingEntryBootNum != $FirstBoot ]] ; then
611 echo "An existing rEFInd boot entry exists, but isn't set as the default boot"
612 echo "manager. The boot order is being adjusted to make rEFInd the default boot"
613 echo "manager. If this is NOT what you want, you should use efibootmgr to"
614 echo "manually adjust your EFI's boot order."
615 $Efibootmgr -b $ExistingEntryBootNum -B &> /dev
/null
622 if [[ $InstallIt == "1" ]] ; then
623 echo "Installing it!"
624 $Efibootmgr -c -l $EfiEntryFilename -L "rEFInd Boot Manager" -d $InstallDisk -p $PartNum &> /dev
/null
625 if [[ $?
!= 0 ]] ; then
636 if [[ $EfibootmgrProblems ]] ; then
638 echo "ALERT: There were problems running the efibootmgr program! You may need to"
639 echo "rename the $Refind binary to the default name (EFI/boot/bootx64.efi"
640 echo "on x86-64 systems or EFI/boot/bootia32.efi on x86 systems) to have it run!"
645 # Create a minimal/sample refind_linux.conf file in /boot.
646 GenerateRefindLinuxConf
() {
647 if [[ -f $RLConfFile ]] ; then
648 echo "Existing $RLConfFile found; not overwriting."
650 if [[ -f "$RootDir/etc/default/grub" ]] ; then
651 # We want the default options used by the distribution, stored here....
652 source "$RootDir/etc/default/grub"
654 RootFS
=`df $RootDir | grep dev | cut -f 1 -d " "`
655 StartOfDevname
=`echo $RootFS | cut -b 1-7`
656 if [[ $StartOfDevname == "/dev/sd" ||
$StartOfDevName == "/dev/hd" ]] ; then
657 # Identify root filesystem by UUID rather than by device node, if possible
658 Uuid
=`blkid -o export $RootFS 2> /dev/null | grep UUID=`
659 if [[ -n $Uuid ]] ; then
663 DefaultOptions
="$GRUB_CMDLINE_LINUX $GRUB_CMDLINE_LINUX_DEFAULT"
664 echo "\"Boot with standard options\" \"ro root=$RootFS $DefaultOptions \"" > $RLConfFile
665 echo "\"Boot to single-user mode\" \"ro root=$RootFS $DefaultOptions single\"" >> $RLConfFile
666 echo "\"Boot with minimal options\" \"ro root=$RootFS\"" >> $RLConfFile
670 # Set varaibles for installation in EFI/BOOT directory
672 TargetDir
="/EFI/BOOT"
673 if [[ $ShimSource == "none" ]] ; then
674 TargetX64
="bootx64.efi"
675 TargetIA32
="bootia32.efi"
677 TargetX64
="grubx64.efi"
678 TargetIA32
="bootia32.efi"
679 TargetShim
="bootx64.efi"
681 } # SetFilenamesForBoot()
683 # Set variables for installation in EFI/Microsoft/Boot directory
685 TargetDir
="/EFI/Microsoft/Boot"
686 if [[ $ShimSource == "none" ]] ; then
687 TargetX64
="bootmgfw.efi"
689 TargetX64
="grubx64.efi"
690 TargetShim
="bootmgfw.efi"
694 # TargetDir defaults to /EFI/refind; however, this function adjusts it as follows:
695 # - If an existing refind.conf is available in /EFI/BOOT or /EFI/Microsoft/Boot,
696 # install to that directory under the suitable name; but DO NOT do this if
697 # refind.conf is also in /EFI/refind.
698 # - If booted in BIOS mode and the ESP lacks any other EFI files, install to
700 # - If booted in BIOS mode and there's no refind.conf file and there is a
701 # /EFI/Microsoft/Boot/bootmgfw.efi file, move it down one level and
702 # install under that name, "hijacking" the Windows boot loader filename
703 DetermineTargetDir
() {
706 if [[ -f $InstallDir/EFI
/BOOT
/refind.conf
]] ; then
710 if [[ -f $InstallDir/EFI
/Microsoft
/Boot
/refind.conf
]] ; then
714 if [[ -f $InstallDir/EFI
/refind
/refind.conf
]] ; then
715 TargetDir
="/EFI/refind"
718 if [[ $Upgrade == 1 ]] ; then
719 echo "Found rEFInd installation in $InstallDir$TargetDir; upgrading it."
722 if [[ ! -d /sys
/firmware
/efi
&& $Upgrade == 0 ]] ; then # BIOS-mode
723 FoundEfiFiles
=`find $InstallDir/EFI/BOOT -name "*.efi" 2> /dev/null`
724 FoundConfFiles
=`find $InstallDir -name "refind\.conf" 2> /dev/null`
725 if [[ ! -n $FoundConfFiles && -f $InstallDir/EFI
/Microsoft
/Boot
/bootmgfw.efi
]] ; then
726 mv -n $InstallDir/EFI
/Microsoft
/Boot
/bootmgfw.efi
$InstallDir/EFI
/Microsoft
&> /dev
/null
728 echo "Running in BIOS mode with a suspected Windows installation; moving boot loader"
729 echo "files so as to install to $InstallDir$TargetDir."
730 elif [[ ! -n $FoundEfiFiles ]] ; then # In BIOS mode and no default loader; install as default loader
732 echo "Running in BIOS mode with no existing default boot loader; installing to"
733 echo $InstallDir$TargetDir
735 echo "Running in BIOS mode with an existing default boot loader; backing it up and"
736 echo "installing rEFInd in its place."
737 if [[ -d $InstallDir/EFI
/BOOT-rEFIndBackup
]] ; then
739 echo "Caution: An existing backup of a default boot loader exists! If the current"
740 echo "default boot loader and the backup are different boot loaders, the current"
741 echo "one will become inaccessible."
743 echo -n "Do you want to proceed with installation (Y/N)? "
745 if [[ $YesNo == "Y" ||
$YesNo == "y" ]] ; then
746 echo "OK; continuing with the installation..."
751 mv -n $InstallDir/EFI
/BOOT
$InstallDir/EFI
/BOOT-rEFIndBackup
755 } # DetermineTargetDir()
757 # Controls rEFInd installation under Linux.
758 # Sets Problems=1 if something goes wrong.
760 echo "Installing rEFInd on Linux...."
761 modprobe efivars
&> /dev
/null
762 if [[ $TargetDir == "/EFI/BOOT" ]] ; then
769 if [[ $CpuType == 'x86_64' ]] ; then
771 elif [[ ($CpuType == 'i386' ||
$CpuType == 'i486' ||
$CpuType == 'i586' ||
$CpuType == 'i686') ]] ; then
773 # If we're in EFI mode, do some sanity checks, and alert the user or even
774 # abort. Not in BIOS mode, though, since that could be used on an emergency
775 # disc to try to recover a troubled Linux installation.
776 if [[ -d /sys
/firmware
/efi
]] ; then
777 if [[ $ShimSource != "none" && $TargetDir != "/BOOT/EFI" ]] ; then
779 echo "CAUTION: Neither rEFInd nor shim currently supports 32-bit systems, so you"
780 echo "should not use the --shim option to install on such systems. Aborting!"
785 echo "CAUTION: This Linux installation uses a 32-bit kernel. 32-bit EFI-based"
786 echo "computers are VERY RARE. If you've installed a 32-bit version of Linux"
787 echo "on a 64-bit computer, you should manually install the 64-bit version of"
788 echo "rEFInd. If you're installing on a Mac, you should do so from OS X. If"
789 echo "you're positive you want to continue with this installation, answer 'Y'"
790 echo "to the following question..."
792 echo -n "Are you sure you want to continue (Y/N)? "
794 if [[ $YesNo == "Y" ||
$YesNo == "y" ]] ; then
795 echo "OK; continuing with the installation..."
801 echo "Unknown CPU type '$CpuType'; aborting!"
805 if [[ $LocalKeys == 1 ]] ; then
811 if [[ $TargetDir != "/EFI/BOOT" && $TargetDir != "/EFI/Microsoft/Boot" ]] ; then
813 GenerateRefindLinuxConf
818 # The main part of the script. Sets a few environment variables,
819 # performs a few startup checks, and then calls functions to
820 # install under OS X or Linux, depending on the detected platform.
825 ThisDir
="$( cd -P "$
( dirname "${BASH_SOURCE[0]}" )" && pwd )"
826 RefindDir
="$ThisDir/refind"
827 ThisScript
="$ThisDir/`basename $0`"
828 if [[ `whoami` != "root" ]] ; then
829 echo "Not running as root; attempting to elevate privileges via sudo...."
830 sudo
$ThisScript "$@"
831 if [[ $?
!= 0 ]] ; then
832 echo "This script must be run as root (or using sudo). Exiting!"
839 if [[ $OSName == 'Darwin' ]] ; then
840 if [[ $ShimSource != "none" ]] ; then
841 echo "The --shim option is not supported on OS X! Exiting!"
844 if [[ $LocalKeys != 0 ]] ; then
845 echo "The --localkeys option is not supported on OS X! Exiting!"
849 elif [[ $OSName == 'Linux' ]] ; then
852 echo "Running on unknown OS; aborting!"
855 if [[ $Problems ]] ; then
858 echo "Installation has completed, but problems were detected. Review the output for"
859 echo "error messages and take corrective measures as necessary. You may need to"
860 echo "re-run this script or install manually before rEFInd will work."
864 echo "Installation has completed successfully."
868 if [[ $UnmountEsp ]] ; then
869 echo "Unmounting install dir"
873 if [[ $InstallDir == /tmp
/refind_install
]] ; then