]> code.delx.au - refind/blob - install.sh
Fixed silly mistake in install.sh
[refind] / install.sh
1 #!/bin/bash
2 #
3 # Linux/MacOS X script to install rEFInd
4 #
5 # Usage:
6 #
7 # ./install.sh [options]
8 #
9 # options include:
10 # "--notesp" to install to the OS X root filesystem rather than to the ESP.
11 # This option may not be used under 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 # "--ownhfs {devicefile}" to install to an HFS+ volume that's NOT currently
16 # an OS X boot volume.
17 # "--root {dir}" to specify installation using the specified directory
18 # as the system's root
19 # "--alldrivers" to install all drivers along with regular files
20 # "--nodrivers" to suppress driver installation (default in Linux is
21 # driver used on /boot; --nodrivers is OS X default)
22 # "--shim {shimfile}" to install a shim.efi file for Secure Boot
23 # "--preloader" is synonymous with "--shim"
24 # "--localkeys" to re-sign x86-64 binaries with a locally-generated key
25 # "--yes" to assume a "yes" response to all prompts
26 #
27 # The "esp" option is valid only on Mac OS X; it causes
28 # installation to the EFI System Partition (ESP) rather than
29 # to the current OS X boot partition. Under Linux, this script
30 # installs to the ESP by default.
31 #
32 # This program is copyright (c) 2012 by Roderick W. Smith
33 # It is released under the terms of the GNU GPL, version 3,
34 # a copy of which should be included in the file COPYING.txt.
35 #
36 # Revision history:
37 #
38 # 0.8.4 -- OS X default changed to install to ESP under /EFI/BOOT
39 # 0.7.9 -- Fixed bug that caused errors if dmraid utility not installed
40 # 0.7.7 -- Fixed bug that created mangled refind_linux.conf file; added ability
41 # to locate and mount ESP on Linux, if it's not mounted
42 # 0.7.6 -- Added --ownhfs {device-filename} option
43 # 0.7.5 -- Fixed bug when installing to ESP on recent versions of OS X
44 # 0.7.2 -- Fixed code that could be confused by use of autofs to mount the ESP
45 # 0.7.0 -- Added support for the new Btrfs driver
46 # 0.6.12 -- Added support for PreLoader as well as for shim
47 # 0.6.11 -- Improvements in script's ability to handle directories with spaces
48 # in their names
49 # 0.6.9 -- Install gptsync on Macs
50 # 0.6.8 -- Bug fix: ESP scan now uses "uniq".
51 # 0.6.6 -- Bug fix: Upgrade drivers when installed to EFI/BOOT. Also enable
52 # copying shim.efi and MokManager.efi over themselves.
53 # 0.6.4 -- Copies ext2 driver rather than ext4 driver for ext2/3fs
54 # 0.6.3 -- Support for detecting rEFInd in EFI/BOOT and EFI/Microsoft/Boot
55 # directories & for installing to EFI/BOOT in BIOS mode
56 # 0.6.2-1 -- Added --yes option & tweaked key-copying for use with RPM install script
57 # 0.6.1 -- Added --root option; minor bug fixes
58 # 0.6.0 -- Changed --drivers to --alldrivers and added --nodrivers option;
59 # changed default driver installation behavior in Linux to install
60 # the driver needed to read /boot (if available)
61 # 0.5.1.2 -- Fixed bug that caused failure to generate refind_linux.conf file
62 # 0.5.1.1 -- Fixed bug that caused script failure under OS X
63 # 0.5.1 -- Added --shim & --localkeys options & create sample refind_linux.conf
64 # in /boot
65 # 0.5.0 -- Added --usedefault & --drivers options & changed "esp" option to "--esp"
66 # 0.4.5 -- Fixed check for rEFItBlesser in OS X
67 # 0.4.2 -- Added notice about BIOS-based OSes & made NVRAM changes in Linux smarter
68 # 0.4.1 -- Added check for rEFItBlesser in OS X
69 # 0.3.3.1 -- Fixed OS X 10.7 bug; also works as make target
70 # 0.3.2.1 -- Check for presence of source files; aborts if not present
71 # 0.3.2 -- Initial version
72 #
73 # Note: install.sh version numbers match those of the rEFInd package
74 # with which they first appeared.
75
76 RootDir="/"
77 TargetDir=/EFI/refind
78 LocalKeysBase="refind_local"
79 ShimSource="none"
80 ShimType="none"
81 TargetShim="default"
82 TargetX64="refind_x64.efi"
83 TargetIA32="refind_ia32.efi"
84 LocalKeys=0
85 DeleteRefindDir=0
86 AlwaysYes=0
87
88 #
89 # Functions used by both OS X and Linux....
90 #
91
92 GetParams() {
93 InstallToEspOnMac=1
94 # Install the driver required to read Linux /boot, if it's available
95 # Note: Under OS X, this will be installed only if a Linux partition
96 # is detected, in which case the ext4fs driver will be installed.
97 InstallDrivers="boot"
98 while [[ $# -gt 0 ]]; do
99 case $1 in
100 --notesp) InstallToEspOnMac=0
101 ;;
102 --ownhfs) OwnHfs=1
103 InstallToEspOnMac=0
104 TargetPart="$2"
105 TargetDir=/System/Library/CoreServices
106 shift
107 ;;
108 --usedefault) TargetDir=/EFI/BOOT
109 TargetPart="$2"
110 TargetX64="bootx64.efi"
111 TargetIA32="bootia32.efi"
112 shift
113 ;;
114 --root) RootDir="$2"
115 InstallToEspOnMac=0
116 shift
117 ;;
118 --localkeys) LocalKeys=1
119 ;;
120 --shim | --preloader) ShimSource="$2"
121 ShimType=`basename $ShimSource`
122 shift
123 ;;
124 --drivers | --alldrivers) InstallDrivers="all"
125 ;;
126 --nodrivers) InstallDrivers="none"
127 ;;
128 --yes) AlwaysYes=1
129 ;;
130 * ) echo "Usage: $0 [--notesp | --usedefault {device-file} | --root {dir} |"
131 echo " --ownhfs {device-file} ]"
132 echo " [--nodrivers | --alldrivers] [--shim {shim-filename}]"
133 echo " [--localkeys] [--yes]"
134 exit 1
135 esac
136 shift
137 done
138 if [[ "$InstallToEspOnMac" == 0 && "$RootDir" == '/' && "$TargetDir" == '/EFI/BOOT' ]] ; then
139 echo "You may use --notesp OR --usedefault, but not both! Aborting!"
140 exit 1
141 fi
142 if [[ "$RootDir" != '/' && "$TargetDir" == '/EFI/BOOT' ]] ; then
143 echo "You may use --root OR --usedefault, but not both! Aborting!"
144 exit 1
145 fi
146 if [[ "$TargetDir" != '/System/Library/CoreServices' && "$OwnHfs" == '1' ]] ; then
147 echo "If you use --ownhfs, you may NOT use --usedefault! Aborting!"
148 exit 1
149 fi
150 RLConfFile="$RootDir/boot/refind_linux.conf"
151 EtcKeysDir="$RootDir/etc/refind.d/keys"
152 } # GetParams()
153
154 # Get a yes/no response from the user and place it in the YesNo variable.
155 # If the AlwaysYes variable is set to 1, skip the user input and set "Y"
156 # in the YesNo variable.
157 ReadYesNo() {
158 if [[ $AlwaysYes == 1 ]] ; then
159 YesNo="Y"
160 echo "Y"
161 else
162 read YesNo
163 fi
164 }
165
166 # Abort if the rEFInd files can't be found.
167 # Also sets $ConfFile to point to the configuration file,
168 # $IconsDir to point to the icons directory, and
169 # $ShimSource to the source of the shim.efi file (if necessary).
170 CheckForFiles() {
171 # Note: This check is satisfied if EITHER the 32- or the 64-bit version
172 # is found, even on the wrong platform. This is because the platform
173 # hasn't yet been determined. This could obviously be improved, but it
174 # would mean restructuring lots more code....
175 if [[ ! -f "$RefindDir/refind_ia32.efi" && ! -f "$RefindDir/refind_x64.efi" ]] ; then
176 echo "The rEFInd binary file is missing! Aborting installation!"
177 exit 1
178 fi
179
180 if [[ -f "$RefindDir/refind.conf-sample" ]] ; then
181 ConfFile="$RefindDir/refind.conf-sample"
182 elif [[ -f "$ThisDir/refind.conf-sample" ]] ; then
183 ConfFile="$ThisDir/refind.conf-sample"
184 else
185 echo "The sample configuration file is missing! Aborting installation!"
186 exit 1
187 fi
188
189 if [[ -d "$RefindDir/icons" ]] ; then
190 IconsDir="$RefindDir/icons"
191 elif [[ -d "$ThisDir/icons" ]] ; then
192 IconsDir="$ThisDir/icons"
193 else
194 echo "The icons directory is missing! Aborting installation!"
195 exit 1
196 fi
197
198 if [[ "$ShimSource" != "none" ]] ; then
199 if [[ -f "$ShimSource" ]] ; then
200 if [[ $ShimType == "shimx64.efi" || $ShimType == "shim.efi" ]] ; then
201 TargetX64="grubx64.efi"
202 MokManagerSource=`dirname "$ShimSource"`/MokManager.efi
203 elif [[ $ShimType == "preloader.efi" || $ShimType == "PreLoader.efi" ]] ; then
204 TargetX64="loader.efi"
205 MokManagerSource=`dirname "$ShimSource"`/HashTool.efi
206 else
207 echo "Unknown shim/PreBootloader filename: $ShimType!"
208 echo "Known filenames are shimx64.efi, shim.efi, and PreLoader.efi. Aborting!"
209 exit 1
210 fi
211 else
212 echo "The specified shim/PreBootloader file, $ShimSource, doesn't exist!"
213 echo "Aborting installation!"
214 exit 1
215 fi
216 fi
217 } # CheckForFiles()
218
219 # Helper for CopyRefindFiles; copies shim files (including MokManager, if it's
220 # available) to target.
221 CopyShimFiles() {
222 cp -fb "$ShimSource" "$InstallDir/$TargetDir/$TargetShim"
223 if [[ $? != 0 ]] ; then
224 Problems=1
225 fi
226 if [[ -f "$MokManagerSource" ]] ; then
227 cp -fb "$MokManagerSource" "$InstallDir/$TargetDir/"
228 fi
229 if [[ $? != 0 ]] ; then
230 Problems=1
231 fi
232 } # CopyShimFiles()
233
234 # Copy the public keys to the installation medium
235 CopyKeys() {
236 if [[ $LocalKeys == 1 ]] ; then
237 mkdir -p "$InstallDir/$TargetDir/keys/"
238 cp "$EtcKeysDir/$LocalKeysBase.cer" "$InstallDir/$TargetDir/keys/"
239 cp "$EtcKeysDir/$LocalKeysBase.crt" "$InstallDir/$TargetDir/keys/"
240 fi
241 } # CopyKeys()
242
243 # Determine (or guess) the filesystem used on the Linux /boot filesystem.
244 # Store the result in the BootFS global variable.
245 SetBootFS() {
246 local Blkid
247
248 Blkid=`which blkid 2> /dev/null`
249 BootFS=""
250 if [[ $OSName == 'Linux' && -x "$Blkid" ]] ; then
251 BootPart=`df /boot | grep dev | cut -f 1 -d " "`
252 BootFS=`$Blkid -o export $BootPart 2> /dev/null | grep TYPE= | cut -f 2 -d =`
253 fi
254 if [[ $OSName == 'Darwin' ]] ; then
255 # 0FC63DAF-8483-4772-8E79-3D69D8477DE4 = Linux filesystem
256 # BC13C2FF-59E6-4262-A352-B275FD6F7172 = Freedesktop $boot partition
257 # 933AC7E1-2EB4-4F13-B844-0E14E2AEF915 = Freedesktop Linux /home
258 # E6D6D379-F507-44C2-A23C-238F2A3DF928 = Linux LVM
259 # A19D880F-05FC-4D3B-A006-743F0F84911E = Linux RAID
260 # 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F = Linux swap
261 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')
262 BootFS=""
263 if [[ -n $Temp ]] ; then
264 echo "Found suspected Linux partition(s); installing ext4fs driver."
265 BootFS="ext4"
266 fi
267 fi
268 } # SetBootFS()
269
270 # Copy drivers from $RefindDir/drivers_$1 to $InstallDir/$TargetDir/drivers_$1,
271 # honoring the $InstallDrivers condition. Must be passed a suitable
272 # architecture code (ia32 or x64).
273 CopyDrivers() {
274 if [[ $InstallDrivers == "all" ]] ; then
275 mkdir -p "$InstallDir/$TargetDir/drivers_$1"
276 cp "$ThisDir"/drivers_$1/*_$1.efi "$InstallDir/$TargetDir/drivers_$1/" 2> /dev/null
277 cp "$RefindDir"/drivers_$1/*_$1.efi "$InstallDir/$TargetDir/drivers_$1/" 2> /dev/null
278 elif [[ "$InstallDrivers" == "boot" ]] ; then
279 SetBootFS
280 DriverType=""
281 case $BootFS in
282 ext2 | ext3) DriverType="ext2"
283 # Could use ext4, but that can create unwanted entries from symbolic
284 # links in / to /boot/vmlinuz if a separate /boot partition is used.
285 ;;
286 ext4) DriverType="ext4"
287 ;;
288 reiserfs) DriverType="reiserfs"
289 ;;
290 btrfs) DriverType="btrfs"
291 ;;
292 hfsplus) DriverType="hfs"
293 ;;
294 *) BootFS=""
295 esac
296 if [[ -n $BootFS ]] ; then
297 echo "Installing driver for $BootFS (${DriverType}_$1.efi)"
298 mkdir -p "$InstallDir/$TargetDir/drivers_$1"
299 cp "$ThisDir/drivers_$1/${DriverType}_$1.efi" "$InstallDir/$TargetDir/drivers_$1/" 2> /dev/null
300 cp "$RefindDir/drivers_$1/${DriverType}_$1.efi" "$InstallDir/$TargetDir/drivers_$1"/ 2> /dev/null
301 fi
302 fi
303 } # CopyDrivers()
304
305 # Copy tools (currently only gptsync, and that only on Macs) to the EFI/tools
306 # directory on the ESP. Must be passed a suitable architecture code (ia32
307 # or x64).
308 CopyTools() {
309 mkdir -p $InstallDir/EFI/tools
310 if [[ $OSName == 'Darwin' ]] ; then
311 cp -f "$RefindDir/tools_$1/gptsync_$1.efi" "$InstallDir/EFI/tools/"
312 if [[ -f "$InstallDir/EFI/tools/gptsync.efi" ]] ; then
313 mv "$InstallDir/EFI/tools/gptsync.efi" "$InstallDir/EFI/tools/gptsync.efi-disabled"
314 echo "Found old gptsync.efi; disabling it by renaming it to gptsync.efi-disabled"
315 fi
316 fi
317 } # CopyTools()
318
319 # Copy the rEFInd files to the ESP or OS X root partition.
320 # Sets Problems=1 if any critical commands fail.
321 CopyRefindFiles() {
322 mkdir -p "$InstallDir/$TargetDir"
323 if [[ "$TargetDir" == '/EFI/BOOT' ]] ; then
324 cp "$RefindDir/refind_ia32.efi" "$InstallDir/$TargetDir/$TargetIA32" 2> /dev/null
325 if [[ $? != 0 ]] ; then
326 echo "Note: IA32 (x86) binary not installed!"
327 fi
328 cp "$RefindDir/refind_x64.efi" "$InstallDir/$TargetDir/$TargetX64" 2> /dev/null
329 if [[ $? != 0 ]] ; then
330 Problems=1
331 fi
332 if [[ "$ShimSource" != "none" ]] ; then
333 TargetShim="bootx64.efi"
334 CopyShimFiles
335 fi
336 if [[ $InstallDrivers == "all" ]] ; then
337 cp -r "$RefindDir"/drivers_* "$InstallDir/$TargetDir/" 2> /dev/null
338 cp -r "$ThisDir"/drivers_* "$InstallDir/$TargetDir/" 2> /dev/null
339 elif [[ $Upgrade == 1 || $InstallToEspOnMac == 1 ]] ; then
340 if [[ $Platform == 'EFI64' ]] ; then
341 CopyDrivers x64
342 CopyTools x64
343 else
344 CopyDrivers ia32
345 CopyTools ia32
346 fi
347 fi
348 Refind=""
349 if [[ $Platform == 'EFI64' ]] ; then
350 Refind='bootx64.efi'
351 elif [[ $Platform == 'EFI32' ]] ; then
352 Refind='bootia32.efi'
353 fi
354 CopyKeys
355 elif [[ $Platform == 'EFI64' || $TargetDir == "/EFI/Microsoft/Boot" ]] ; then
356 cp "$RefindDir/refind_x64.efi" "$InstallDir/$TargetDir/$TargetX64"
357 if [[ $? != 0 ]] ; then
358 Problems=1
359 fi
360 CopyDrivers x64
361 CopyTools x64
362 Refind="refind_x64.efi"
363 CopyKeys
364 if [[ "$ShimSource" != "none" ]] ; then
365 if [[ "$TargetShim" == "default" ]] ; then
366 TargetShim=`basename "$ShimSource"`
367 fi
368 CopyShimFiles
369 Refind="$TargetShim"
370 if [[ $LocalKeys == 0 ]] ; then
371 echo "Storing copies of rEFInd Secure Boot public keys in $EtcKeysDir"
372 mkdir -p "$EtcKeysDir"
373 cp "$ThisDir/keys/refind.cer" "$EtcKeysDir" 2> /dev/null
374 cp "$ThisDir/keys/refind.crt" "$EtcKeysDir" 2> /dev/null
375 fi
376 fi
377 if [[ "$TargetDir" == '/System/Library/CoreServices' ]] ; then
378 SetupMacHfs $TargetX64
379 fi
380 elif [[ $Platform == 'EFI32' ]] ; then
381 cp "$RefindDir/refind_ia32.efi" "$InstallDir/$TargetDir/$TargetIA32"
382 if [[ $? != 0 ]] ; then
383 Problems=1
384 fi
385 CopyDrivers ia32
386 CopyTools ia32
387 Refind="refind_ia32.efi"
388 if [[ "$TargetDir" == '/System/Library/CoreServices' ]] ; then
389 SetupMacHfs $TargetIA32
390 fi
391 else
392 echo "Unknown platform! Aborting!"
393 exit 1
394 fi
395 echo "Copied rEFInd binary files"
396 echo ""
397 if [[ -d "$InstallDir/$TargetDir/icons" ]] ; then
398 rm -rf "$InstallDir/$TargetDir/icons-backup" &> /dev/null
399 mv -f "$InstallDir/$TargetDir/icons" "$InstallDir/$TargetDir/icons-backup"
400 echo "Notice: Backed up existing icons directory as icons-backup."
401 fi
402 cp -r "$IconsDir" "$InstallDir/$TargetDir"
403 if [[ $? != 0 ]] ; then
404 Problems=1
405 fi
406 mkdir -p "$InstallDir/$TargetDir/keys"
407 cp -rf "$ThisDir"/keys/*.[cd]er "$InstallDir/$TargetDir/keys/" 2> /dev/null
408 cp -rf "$EtcKeysDir"/*.[cd]er "$InstallDir/$TargetDir/keys/" 2> /dev/null
409 if [[ -f "$InstallDir/$TargetDir/refind.conf" ]] ; then
410 echo "Existing refind.conf file found; copying sample file as refind.conf-sample"
411 echo "to avoid overwriting your customizations."
412 echo ""
413 cp -f "$ConfFile" "$InstallDir/$TargetDir"
414 if [[ $? != 0 ]] ; then
415 Problems=1
416 fi
417 else
418 echo "Copying sample configuration file as refind.conf; edit this file to configure"
419 echo "rEFInd."
420 echo ""
421 cp -f "$ConfFile" "$InstallDir/$TargetDir/refind.conf"
422 if [[ $? != 0 ]] ; then
423 Problems=1
424 fi
425 fi
426 if [[ $DeleteRefindDir == 1 ]] ; then
427 echo "Deleting the temporary directory $RefindDir"
428 rm -r "$RefindDir"
429 fi
430 } # CopyRefindFiles()
431
432 # Mount the partition the user specified with the --usedefault or --ownhfs option
433 MountDefaultTarget() {
434 InstallDir=/tmp/refind_install
435 mkdir -p "$InstallDir"
436 UnmountEsp=1
437 if [[ $OSName == 'Darwin' ]] ; then
438 if [[ $OwnHfs == '1' ]] ; then
439 Temp=`diskutil info "$TargetPart" | grep "Mount Point"`
440 InstallDir=`echo $Temp | cut -f 3-30 -d ' '`
441 if [[ $InstallDir == '' ]] ; then
442 InstallDir=/tmp/refind_install
443 mount -t hfs "$TargetPart" "$InstallDir"
444 else
445 UnmountEsp=0
446 fi
447 else
448 mount -t msdos "$TargetPart" "$InstallDir"
449 fi
450 elif [[ $OSName == 'Linux' ]] ; then
451 mount -t vfat "$TargetPart" "$InstallDir"
452 fi
453 if [[ $? != 0 ]] ; then
454 echo "Couldn't mount $TargetPart ! Aborting!"
455 rmdir "$InstallDir"
456 exit 1
457 fi
458 } # MountDefaultTarget()
459
460 #
461 # A series of OS X support functions....
462 #
463
464 # Mount the ESP at /Volumes/ESP or determine its current mount
465 # point.
466 # Sets InstallDir to the ESP mount point
467 # Sets UnmountEsp if we mounted it
468 MountOSXESP() {
469 # Identify the ESP. Note: This returns the FIRST ESP found;
470 # if the system has multiple disks, this could be wrong!
471 Temp=$(mount | sed -n -E "/^(\/dev\/disk[0-9]+s[0-9]+) on \/ \(.*$/s//\1/p")
472 if [ $Temp ]; then
473 Temp=$(diskutil list | grep " EFI " | grep -o 'disk.*' | head -n 1)
474 if [ -z $Temp ]; then
475 echo "Warning: root device doesn't have an EFI partition"
476 fi
477 else
478 echo "Warning: root device could not be found"
479 fi
480 if [ -z $Temp ]; then
481 Temp=$(diskutil list | sed -n -E '/^ *[0-9]+:[ ]+EFI EFI[ ]+[0-9.]+ [A-Z]+[ ]+(disk[0-9]+s[0-9]+)$/ { s//\1/p
482 q
483 }' )
484
485 if [ -z $Temp ]; then
486 echo "Could not find an EFI partition. Aborting!"
487 exit 1
488 fi
489 fi
490 Esp=/dev/`echo $Temp`
491 # If the ESP is mounted, use its current mount point....
492 Temp=`df -P | grep "$Esp"`
493 InstallDir=`echo $Temp | cut -f 6 -d ' '`
494 if [[ "$InstallDir" == '' ]] ; then
495 mkdir /Volumes/ESP &> /dev/null
496 mount -t msdos "$Esp" /Volumes/ESP
497 if [[ $? != 0 ]] ; then
498 echo "Unable to mount ESP! Aborting!\n"
499 exit 1
500 fi
501 UnmountEsp=1
502 InstallDir="/Volumes/ESP"
503 fi
504 } # MountOSXESP()
505
506 # Set up for booting from Mac HFS+ volume that boots rEFInd in MJG's way
507 # (http://mjg59.dreamwidth.org/7468.html)
508 # Must be passed the original rEFInd binary filename (without a path).
509 SetupMacHfs() {
510 if [[ -s "$InstallDir/mach_kernel" ]] ; then
511 echo "Attempt to install rEFInd to a partition with a /mach_kernel file! Aborting!"
512 exit 1
513 fi
514 cp -n "$InstallDir/$TargetDir/boot.efi" "$InstallDir/$TargetDir/boot.efi-backup" &> /dev/null
515 ln -f "$InstallDir/$TargetDir/$1" "$InstallDir/$TargetDir/boot.efi"
516 touch "$InstallDir/mach_kernel"
517 rm "$InstallDir/$TargetDir/SystemVersion.plist" &> /dev/null
518 cat - << ENDOFHERE >> "$InstallDir/$TargetDir/SystemVersion.plist"
519 <xml version="1.0" encoding="UTF-8"?>
520 <plist version="1.0">
521 <dict>
522 <key>ProductBuildVersion</key>
523 <string></string>
524 <key>ProductName</key>
525 <string>rEFInd</string>
526 <key>ProductVersion</key>
527 <string>0.7.6</string>
528 </dict>
529 </plist>
530 ENDOFHERE
531 } # SetupMacHfs()
532
533 # Control the OS X installation.
534 # Sets Problems=1 if problems found during the installation.
535 InstallOnOSX() {
536 echo "Installing rEFInd on OS X...."
537 if [[ "$InstallToEspOnMac" == "1" ]] ; then
538 MountOSXESP
539 elif [[ "$TargetDir" == "/EFI/BOOT" || "$OwnHfs" == '1' ]] ; then
540 MountDefaultTarget
541 else
542 InstallDir="$RootDir/"
543 fi
544 echo "Installing rEFInd to the partition mounted at $InstallDir"
545 Platform=`ioreg -l -p IODeviceTree | grep firmware-abi | cut -d "\"" -f 4`
546 CopyRefindFiles
547 if [[ $InstallToEspOnMac == "1" ]] ; then
548 bless --mount "$InstallDir" --setBoot --file "$InstallDir/$TargetDir/$Refind"
549 elif [[ "$TargetDir" != "/EFI/BOOT" ]] ; then
550 bless --setBoot --folder "$InstallDir/$TargetDir" --file "$InstallDir/$TargetDir/$Refind"
551 fi
552 if [[ $? != 0 ]] ; then
553 Problems=1
554 fi
555 if [[ -f /Library/StartupItems/rEFItBlesser || -d /Library/StartupItems/rEFItBlesser ]] ; then
556 echo
557 echo "/Library/StartupItems/rEFItBlesser found!"
558 echo "This program is part of rEFIt, and will cause rEFInd to fail to work after"
559 echo -n "its first boot. Do you want to remove rEFItBlesser (Y/N)? "
560 ReadYesNo
561 if [[ $YesNo == "Y" || $YesNo == "y" ]] ; then
562 echo "Deleting /Library/StartupItems/rEFItBlesser..."
563 rm -r /Library/StartupItems/rEFItBlesser
564 else
565 echo "Not deleting rEFItBlesser."
566 fi
567 fi
568 echo
569 echo "WARNING: If you have an Advanced Format disk, *DO NOT* attempt to check the"
570 echo "bless status with 'bless --info', since this is known to cause disk corruption"
571 echo "on some systems!!"
572 echo
573 } # InstallOnOSX()
574
575
576 #
577 # Now a series of Linux support functions....
578 #
579
580 # Check for evidence that we're running in Secure Boot mode. If so, and if
581 # appropriate options haven't been set, warn the user and offer to abort.
582 # If we're NOT in Secure Boot mode but the user HAS specified the --shim
583 # or --localkeys option, warn the user and offer to abort.
584 #
585 # FIXME: Although I checked the presence (and lack thereof) of the
586 # /sys/firmware/efi/vars/SecureBoot* files on my Secure Boot test system
587 # before releasing this script, I've since found that they are at least
588 # sometimes present when Secure Boot is absent. This means that the first
589 # test can produce false alarms. A better test is highly desirable.
590 CheckSecureBoot() {
591 VarFile=`ls -d /sys/firmware/efi/vars/SecureBoot* 2> /dev/null`
592 if [[ -n "$VarFile" && "$TargetDir" != '/EFI/BOOT' && "$ShimSource" == "none" ]] ; then
593 echo ""
594 echo "CAUTION: Your computer appears to support Secure Boot, but you haven't"
595 echo "specified a valid shim.efi file source. If you've disabled Secure Boot and"
596 echo "intend to leave it disabled, this is fine; but if Secure Boot is active, the"
597 echo "resulting installation won't boot. You can read more about this topic at"
598 echo "http://www.rodsbooks.com/refind/secureboot.html."
599 echo ""
600 echo -n "Do you want to proceed with installation (Y/N)? "
601 ReadYesNo
602 if [[ $YesNo == "Y" || $YesNo == "y" ]] ; then
603 echo "OK; continuing with the installation..."
604 else
605 exit 0
606 fi
607 fi
608
609 if [[ "$ShimSource" != "none" && ! -n "$VarFile" ]] ; then
610 echo ""
611 echo "You've specified installing using a shim.efi file, but your computer does not"
612 echo "appear to be running in Secure Boot mode. Although installing in this way"
613 echo "should work, it's unnecessarily complex. You may continue, but unless you"
614 echo "plan to enable Secure Boot, you should consider stopping and omitting the"
615 echo "--shim option. You can read more about this topic at"
616 echo "http://www.rodsbooks.com/refind/secureboot.html."
617 echo ""
618 echo -n "Do you want to proceed with installation (Y/N)? "
619 ReadYesNo
620 if [[ $YesNo == "Y" || $YesNo == "y" ]] ; then
621 echo "OK; continuing with the installation..."
622 else
623 exit 0
624 fi
625 fi
626
627 if [[ $LocalKeys != 0 && ! -n "$VarFile" ]] ; then
628 echo ""
629 echo "You've specified re-signing your rEFInd binaries with locally-generated keys,"
630 echo "but your computer does not appear to be running in Secure Boot mode. The"
631 echo "keys you generate will be useless unless you enable Secure Boot. You may"
632 echo "proceed with this installation, but before you do so, you may want to read"
633 echo "more about it at http://www.rodsbooks.com/refind/secureboot.html."
634 echo ""
635 echo -n "Do you want to proceed with installation (Y/N)? "
636 ReadYesNo
637 if [[ $YesNo == "Y" || $YesNo == "y" ]] ; then
638 echo "OK; continuing with the installation..."
639 else
640 exit 0
641 fi
642 fi
643
644 } # CheckSecureBoot()
645
646 # Check for the presence of locally-generated keys from a previous installation in
647 # $EtcKeysDir (/etc/refind.d/keys). If they're not present, generate them using
648 # openssl.
649 GenerateKeys() {
650 PrivateKey="$EtcKeysDir/$LocalKeysBase.key"
651 CertKey="$EtcKeysDir/$LocalKeysBase.crt"
652 DerKey="$EtcKeysDir/$LocalKeysBase.cer"
653 OpenSSL=`which openssl 2> /dev/null`
654
655 # Do the work only if one or more of the necessary keys is missing
656 # TODO: Technically, we don't need the DerKey; but if it's missing and openssl
657 # is also missing, this will fail. This could be improved.
658 if [[ ! -f "$PrivateKey" || ! -f "$CertKey" || ! -f "$DerKey" ]] ; then
659 echo "Generating a fresh set of local keys...."
660 mkdir -p "$EtcKeysDir"
661 chmod 0700 "$EtcKeysDir"
662 if [[ ! -x "$OpenSSL" ]] ; then
663 echo "Can't find openssl, which is required to create your private signing keys!"
664 echo "Aborting!"
665 exit 1
666 fi
667 if [[ -f "$PrivateKey" ]] ; then
668 echo "Backing up existing $PrivateKey"
669 cp -f "$PrivateKey" "$PrivateKey.backup" 2> /dev/null
670 fi
671 if [[ -f "$CertKey" ]] ; then
672 echo "Backing up existing $CertKey"
673 cp -f "$CertKey" "$CertKey.backup" 2> /dev/null
674 fi
675 if [[ -f "$DerKey" ]] ; then
676 echo "Backing up existing $DerKey"
677 cp -f "$DerKey" "$DerKey.backup" 2> /dev/null
678 fi
679 "$OpenSSL" req -new -x509 -newkey rsa:2048 -keyout "$PrivateKey" -out "$CertKey" \
680 -nodes -days 3650 -subj "/CN=Locally-generated rEFInd key/"
681 "$OpenSSL" x509 -in "$CertKey" -out "$DerKey" -outform DER
682 chmod 0600 "$PrivateKey"
683 else
684 echo "Using existing local keys...."
685 fi
686 }
687
688 # Sign a single binary. Requires parameters:
689 # $1 = source file
690 # $2 = destination file
691 # Also assumes that the SBSign, PESign, UseSBSign, UsePESign, and various key variables are set
692 # appropriately.
693 # Aborts script on error
694 SignOneBinary() {
695 $SBSign --key "$PrivateKey" --cert "$CertKey" --output "$2" "$1"
696 if [[ $? != 0 ]] ; then
697 echo "Problem signing the binary $1! Aborting!"
698 exit 1
699 fi
700 }
701
702 # Re-sign the x86-64 binaries with a locally-generated key, First look for appropriate
703 # key files in $EtcKeysDir. If they're present, use them to re-sign the binaries. If
704 # not, try to generate new keys and store them in $EtcKeysDir.
705 ReSignBinaries() {
706 SBSign=`which sbsign 2> /dev/null`
707 echo "Found sbsign at $SBSign"
708 TempDir="/tmp/refind_local"
709 if [[ ! -x "$SBSign" ]] ; then
710 echo "Can't find sbsign, which is required to sign rEFInd with your own keys!"
711 echo "Aborting!"
712 exit 1
713 fi
714 GenerateKeys
715 mkdir -p "$TempDir/drivers_x64"
716 cp "$RefindDir/refind.conf-sample $TempDir" 2> /dev/null
717 cp "$ThisDir/refind.conf-sample $TempDir" 2> /dev/null
718 cp "$RefindDir/refind_ia32.efi $TempDir" 2> /dev/null
719 cp -a "$RefindDir/drivers_ia32 $TempDir" 2> /dev/null
720 cp -a "$ThisDir/drivers_ia32 $TempDir" 2> /dev/null
721 SignOneBinary "$RefindDir/refind_x64.efi" "$TempDir/refind_x64.efi"
722 SaveIFS=$IFS
723 IFS=$(echo -en "\n\b")
724 for Driver in `ls "$RefindDir"/drivers_x64/*.efi "$ThisDir"/drivers_x64/*.efi 2> /dev/null` ; do
725 TempName=`basename "$Driver"`
726 SignOneBinary "$Driver" "$TempDir/drivers_x64/$TempName"
727 done
728 IFS=$SaveIFS
729 RefindDir="$TempDir"
730 DeleteRefindDir=1
731 } # ReSignBinaries()
732
733 # Locate and mount an ESP, if possible, based on parted output.
734 # Should be called only if /boot/efi is NOT an acceptable ESP.
735 # Sets InstallDir to the mounted ESP's path ($RootDir/boot/efi)
736 # and EspFilesystem the filesystem (always "vfat")
737 FindLinuxESP() {
738 echo "The ESP doesn't seem to be mounted! Trying to find it...."
739 local Drive
740 local PartNum
741 local TableType
742 local DmStatus
743 local SkipIt
744 local Dmraid
745 for Drive in `ls /dev/[sh]d?` ; do
746 SkipIt=0
747 Dmraid=`which dmraid 2> /dev/null`
748 if [ -x "$Dmraid" ] ; then
749 DmStatus=`dmraid -r | grep $Drive`
750 if [ -n "$DmStatus" ] ; then
751 echo "$Drive seems to be part of a RAID array; skipping!"
752 SkipIt=1
753 fi
754 fi
755 TableType=`parted $Drive print -m -s 2>/dev/null | awk -F: '$1 == "'$Drive'" { print $6 }'`
756 if [[ $TableType == 'gpt' && $SkipIt == 0 ]] ; then # read only GPT disks that aren't part of dmraid array
757 PartNum=`LANG=C parted $Drive print -m -s 2>/dev/null | awk -F: '$7 ~ "(^boot| boot)" { print $1 }' | head -n 1`
758 if [ "$PartNum" -eq "$PartNum" ] 2> /dev/null ; then
759 InstallDir="$RootDir/boot/efi"
760 mkdir -p $InstallDir
761 mount $Drive$PartNum $InstallDir
762 EspFilesystem=`grep "$Drive$PartNum.*/boot/efi" /etc/mtab | uniq | grep -v autofs | cut -d " " -f 3`
763 if [[ $EspFilesystem != 'vfat' ]] ; then
764 umount $InstallDir
765 else
766 echo "Mounting ESP at $InstallDir"
767 break;
768 fi
769 fi # $PartNum -eq $PartNum
770 fi # TableType
771 done
772 } # FindLinuxESP()
773
774 # Identifies the ESP's location (/boot or /boot/efi, or these locations under
775 # the directory specified by --root); aborts if the ESP isn't mounted at
776 # either location.
777 # Sets InstallDir to the ESP mount point.
778 FindMountedESP() {
779 mount /boot &> /dev/null
780 mount /boot/efi &> /dev/null
781 EspLine=`df "$RootDir/boot/efi" 2> /dev/null | grep boot/efi`
782 if [[ ! -n "$EspLine" ]] ; then
783 EspLine=`df "$RootDir"/boot | grep boot`
784 fi
785 InstallDir=`echo $EspLine | cut -d " " -f 6`
786
787 if [[ -n "$InstallDir" ]] ; then
788 EspFilesystem=`grep -w "$InstallDir" /etc/mtab | uniq | grep -v autofs | cut -d " " -f 3`
789 fi
790 if [[ $EspFilesystem != 'vfat' ]] ; then
791 FindLinuxESP
792 fi
793 if [[ $EspFilesystem != 'vfat' ]] ; then
794 echo "$RootDir/$InstallDir doesn't seem to be on a VFAT filesystem. The ESP must be"
795 echo "mounted at $RootDir/boot or $RootDir/boot/efi and it must be VFAT! Aborting!"
796 exit 1
797 fi
798 echo "ESP was found at $InstallDir using $EspFilesystem"
799 } # FindMountedESP
800
801 # Uses efibootmgr to add an entry for rEFInd to the EFI's NVRAM.
802 # If this fails, sets Problems=1
803 AddBootEntry() {
804 local PartNum
805 InstallIt="0"
806 Efibootmgr=`which efibootmgr 2> /dev/null`
807 if [[ "$Efibootmgr" ]] ; then
808 InstallDisk=`grep "$InstallDir" /etc/mtab | cut -d " " -f 1 | cut -c 1-8`
809 PartNum=`grep "$InstallDir" /etc/mtab | cut -d " " -f 1 | cut -c 9-10`
810 EntryFilename="$TargetDir/$Refind"
811 EfiEntryFilename=`echo ${EntryFilename//\//\\\}`
812 EfiEntryFilename2=`echo ${EfiEntryFilename} | sed s/\\\\\\\\/\\\\\\\\\\\\\\\\/g`
813 ExistingEntry=`"$Efibootmgr" -v | grep -i "$EfiEntryFilename2"`
814
815 if [[ "$ExistingEntry" ]] ; then
816 ExistingEntryBootNum=`echo "$ExistingEntry" | cut -c 5-8`
817 FirstBoot=`"$Efibootmgr" | grep BootOrder | cut -c 12-15`
818 if [[ "$ExistingEntryBootNum" != "$FirstBoot" ]] ; then
819 echo "An existing rEFInd boot entry exists, but isn't set as the default boot"
820 echo "manager. The boot order is being adjusted to make rEFInd the default boot"
821 echo "manager. If this is NOT what you want, you should use efibootmgr to"
822 echo "manually adjust your EFI's boot order."
823 "$Efibootmgr" -b $ExistingEntryBootNum -B &> /dev/null
824 InstallIt="1"
825 fi
826 else
827 InstallIt="1"
828 fi
829
830 if [[ $InstallIt == "1" ]] ; then
831 echo "Installing it!"
832 "$Efibootmgr" -c -l "$EfiEntryFilename" -L "rEFInd Boot Manager" -d $InstallDisk -p $PartNum &> /dev/null
833 if [[ $? != 0 ]] ; then
834 EfibootmgrProblems=1
835 Problems=1
836 fi
837 fi
838
839 else # efibootmgr not found
840 EfibootmgrProblems=1
841 Problems=1
842 fi
843
844 if [[ $EfibootmgrProblems ]] ; then
845 echo
846 echo "ALERT: There were problems running the efibootmgr program! You may need to"
847 echo "rename the $Refind binary to the default name (EFI/boot/bootx64.efi"
848 echo "on x86-64 systems or EFI/boot/bootia32.efi on x86 systems) to have it run!"
849 echo
850 else
851 echo "rEFInd has been set as the default boot manager."
852 fi
853 } # AddBootEntry()
854
855 # Create a minimal/sample refind_linux.conf file in /boot.
856 GenerateRefindLinuxConf() {
857 if [[ -f "$RLConfFile" ]] ; then
858 echo "Existing $RLConfFile found; not overwriting."
859 else
860 echo "Creating $RLConfFile; edit it to adjust kernel options."
861 if [[ -f "$RootDir/etc/default/grub" ]] ; then
862 # We want the default options used by the distribution, stored here....
863 source "$RootDir/etc/default/grub"
864 echo "Setting default boot options based on $RootDir/etc/default/grub"
865 fi
866 RootFS=`df "$RootDir" | grep dev | cut -f 1 -d " "`
867 StartOfDevname=`echo "$RootFS" | cut -b 1-7`
868 if [[ "$StartOfDevname" == "/dev/sd" || "$StartOfDevName" == "/dev/hd" ]] ; then
869 # Identify root filesystem by UUID rather than by device node, if possible
870 Uuid=`blkid -o export -s UUID "$RootFS" 2> /dev/null | grep UUID=`
871 if [[ -n $Uuid ]] ; then
872 RootFS="$Uuid"
873 fi
874 fi
875 DefaultOptions="$GRUB_CMDLINE_LINUX $GRUB_CMDLINE_LINUX_DEFAULT"
876 echo "\"Boot with standard options\" \"ro root=$RootFS $DefaultOptions \"" > $RLConfFile
877 echo "\"Boot to single-user mode\" \"ro root=$RootFS $DefaultOptions single\"" >> $RLConfFile
878 echo "\"Boot with minimal options\" \"ro root=$RootFS\"" >> $RLConfFile
879 fi
880 }
881
882 # Set varaibles for installation in EFI/BOOT directory
883 SetVarsForBoot() {
884 TargetDir="/EFI/BOOT"
885 if [[ $ShimSource == "none" ]] ; then
886 TargetX64="bootx64.efi"
887 TargetIA32="bootia32.efi"
888 else
889 if [[ $ShimType == "shim.efi" || $ShimType == "shimx64.efi" ]] ; then
890 TargetX64="grubx64.efi"
891 elif [[ $ShimType == "preloader.efi" || $ShimType == "PreLoader.efi" ]] ; then
892 TargetX64="loader.efi"
893 else
894 echo "Unknown shim/PreBootloader type: $ShimType"
895 echo "Aborting!"
896 exit 1
897 fi
898 TargetIA32="bootia32.efi"
899 TargetShim="bootx64.efi"
900 fi
901 } # SetFilenamesForBoot()
902
903 # Set variables for installation in EFI/Microsoft/Boot directory
904 SetVarsForMsBoot() {
905 TargetDir="/EFI/Microsoft/Boot"
906 if [[ $ShimSource == "none" ]] ; then
907 TargetX64="bootmgfw.efi"
908 else
909 if [[ $ShimType == "shim.efi" || $ShimType == "shimx64.efi" ]] ; then
910 TargetX64="grubx64.efi"
911 elif [[ $ShimType == "preloader.efi" || $ShimType == "PreLoader.efi" ]] ; then
912 TargetX64="loader.efi"
913 else
914 echo "Unknown shim/PreBootloader type: $ShimType"
915 echo "Aborting!"
916 exit 1
917 fi
918 TargetShim="bootmgfw.efi"
919 fi
920 }
921
922 # TargetDir defaults to /EFI/refind; however, this function adjusts it as follows:
923 # - If an existing refind.conf is available in /EFI/BOOT or /EFI/Microsoft/Boot,
924 # install to that directory under the suitable name; but DO NOT do this if
925 # refind.conf is also in /EFI/refind.
926 # - If booted in BIOS mode and the ESP lacks any other EFI files, install to
927 # /EFI/BOOT
928 # - If booted in BIOS mode and there's no refind.conf file and there is a
929 # /EFI/Microsoft/Boot/bootmgfw.efi file, move it down one level and
930 # install under that name, "hijacking" the Windows boot loader filename
931 DetermineTargetDir() {
932 Upgrade=0
933
934 if [[ -f $InstallDir/EFI/BOOT/refind.conf ]] ; then
935 SetVarsForBoot
936 Upgrade=1
937 fi
938 if [[ -f $InstallDir/EFI/Microsoft/Boot/refind.conf ]] ; then
939 SetVarsForMsBoot
940 Upgrade=1
941 fi
942 if [[ -f $InstallDir/EFI/refind/refind.conf ]] ; then
943 TargetDir="/EFI/refind"
944 Upgrade=1
945 fi
946 if [[ $Upgrade == 1 ]] ; then
947 echo "Found rEFInd installation in $InstallDir$TargetDir; upgrading it."
948 fi
949
950 if [[ ! -d /sys/firmware/efi && $Upgrade == 0 ]] ; then # BIOS-mode
951 FoundEfiFiles=`find "$InstallDir/EFI/BOOT" -name "*.efi" 2> /dev/null`
952 FoundConfFiles=`find "$InstallDir" -name "refind\.conf" 2> /dev/null`
953 if [[ ! -n "$FoundConfFiles" && -f "$InstallDir/EFI/Microsoft/Boot/bootmgfw.efi" ]] ; then
954 mv -n "$InstallDir/EFI/Microsoft/Boot/bootmgfw.efi" "$InstallDir/EFI/Microsoft" &> /dev/null
955 SetVarsForMsBoot
956 echo "Running in BIOS mode with a suspected Windows installation; moving boot loader"
957 echo "files so as to install to $InstallDir$TargetDir."
958 elif [[ ! -n "$FoundEfiFiles" ]] ; then # In BIOS mode and no default loader; install as default loader
959 SetVarsForBoot
960 echo "Running in BIOS mode with no existing default boot loader; installing to"
961 echo $InstallDir$TargetDir
962 else
963 echo "Running in BIOS mode with an existing default boot loader; backing it up and"
964 echo "installing rEFInd in its place."
965 if [[ -d "$InstallDir/EFI/BOOT-rEFIndBackup" ]] ; then
966 echo ""
967 echo "Caution: An existing backup of a default boot loader exists! If the current"
968 echo "default boot loader and the backup are different boot loaders, the current"
969 echo "one will become inaccessible."
970 echo ""
971 echo -n "Do you want to proceed with installation (Y/N)? "
972 ReadYesNo
973 if [[ $YesNo == "Y" || $YesNo == "y" ]] ; then
974 echo "OK; continuing with the installation..."
975 else
976 exit 0
977 fi
978 fi
979 mv -n "$InstallDir/EFI/BOOT" "$InstallDir/EFI/BOOT-rEFIndBackup"
980 SetVarsForBoot
981 fi
982 fi # BIOS-mode
983 } # DetermineTargetDir()
984
985 # Controls rEFInd installation under Linux.
986 # Sets Problems=1 if something goes wrong.
987 InstallOnLinux() {
988 if [[ "$TargetDir" == "/System/Library/CoreServices" ]] ; then
989 echo "You may not use the --ownhfs option under Linux! Aborting!"
990 exit 1
991 fi
992 echo "Installing rEFInd on Linux...."
993 modprobe efivars &> /dev/null
994 if [[ $TargetDir == "/EFI/BOOT" ]] ; then
995 MountDefaultTarget
996 else
997 FindMountedESP
998 DetermineTargetDir
999 fi
1000 CpuType=`uname -m`
1001 if [[ $CpuType == 'x86_64' ]] ; then
1002 Platform="EFI64"
1003 elif [[ ($CpuType == 'i386' || $CpuType == 'i486' || $CpuType == 'i586' || $CpuType == 'i686') ]] ; then
1004 Platform="EFI32"
1005 # If we're in EFI mode, do some sanity checks, and alert the user or even
1006 # abort. Not in BIOS mode, though, since that could be used on an emergency
1007 # disc to try to recover a troubled Linux installation.
1008 if [[ -d /sys/firmware/efi ]] ; then
1009 if [[ "$ShimSource" != "none" && "$TargetDir" != "/BOOT/EFI" ]] ; then
1010 echo ""
1011 echo "CAUTION: shim does not currently supports 32-bit systems, so you should not"
1012 echo "use the --shim option to install on such systems. Aborting!"
1013 echo ""
1014 exit 1
1015 fi
1016 echo
1017 echo "CAUTION: This Linux installation uses a 32-bit kernel. 32-bit EFI-based"
1018 echo "computers are VERY RARE. If you've installed a 32-bit version of Linux"
1019 echo "on a 64-bit computer, you should manually install the 64-bit version of"
1020 echo "rEFInd. If you're installing on a Mac, you should do so from OS X. If"
1021 echo "you're positive you want to continue with this installation, answer 'Y'"
1022 echo "to the following question..."
1023 echo
1024 echo -n "Are you sure you want to continue (Y/N)? "
1025 ReadYesNo
1026 if [[ $YesNo == "Y" || $YesNo == "y" ]] ; then
1027 echo "OK; continuing with the installation..."
1028 else
1029 exit 0
1030 fi
1031 fi # in EFI mode
1032 else
1033 echo "Unknown CPU type '$CpuType'; aborting!"
1034 exit 1
1035 fi
1036
1037 if [[ $LocalKeys == 1 ]] ; then
1038 ReSignBinaries
1039 fi
1040
1041 CheckSecureBoot
1042 CopyRefindFiles
1043 if [[ "$TargetDir" != "/EFI/BOOT" && "$TargetDir" != "/EFI/Microsoft/Boot" ]] ; then
1044 AddBootEntry
1045 GenerateRefindLinuxConf
1046 fi
1047 } # InstallOnLinux()
1048
1049 #
1050 # The main part of the script. Sets a few environment variables,
1051 # performs a few startup checks, and then calls functions to
1052 # install under OS X or Linux, depending on the detected platform.
1053 #
1054 OSName=`uname -s`
1055 GetParams "$@"
1056 ThisDir="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
1057 RefindDir="$ThisDir/refind"
1058 ThisScript="$ThisDir/`basename $0`"
1059 if [[ `whoami` != "root" ]] ; then
1060 echo "Not running as root; attempting to elevate privileges via sudo...."
1061 sudo "$ThisScript" "$@"
1062 if [[ $? != 0 ]] ; then
1063 echo "This script must be run as root (or using sudo). Exiting!"
1064 exit 1
1065 else
1066 exit 0
1067 fi
1068 fi
1069 CheckForFiles
1070 if [[ $OSName == 'Darwin' ]] ; then
1071 if [[ "$ShimSource" != "none" ]] ; then
1072 echo "The --shim option is not supported on OS X! Exiting!"
1073 exit 1
1074 fi
1075 if [[ "$LocalKeys" != 0 ]] ; then
1076 echo "The --localkeys option is not supported on OS X! Exiting!"
1077 exit 1
1078 fi
1079 if [[ $InstallToEspOnMac == 1 ]] ; then
1080 TargetDir=/EFI/BOOT
1081 TargetX64="bootx64.efi"
1082 TargetIA32="bootia32.efi"
1083 fi
1084 InstallOnOSX $1
1085 elif [[ $OSName == 'Linux' ]] ; then
1086 InstallOnLinux
1087 else
1088 echo "Running on unknown OS; aborting!"
1089 if [[ "$InstallToEspOnMac" == 0 ]] ; then
1090 echo "The --notesp option is not supported on Linux! Exiting!"
1091 exit 1
1092 fi
1093 fi
1094
1095 if [[ $Problems ]] ; then
1096 echo
1097 echo "ALERT:"
1098 echo "Installation has completed, but problems were detected. Review the output for"
1099 echo "error messages and take corrective measures as necessary. You may need to"
1100 echo "re-run this script or install manually before rEFInd will work."
1101 echo
1102 else
1103 echo
1104 echo "Installation has completed successfully."
1105 echo
1106 fi
1107
1108 if [[ $UnmountEsp == '1' ]] ; then
1109 echo "Unmounting install dir"
1110 umount $InstallDir
1111 fi
1112
1113 if [[ "$InstallDir" == /tmp/refind_install ]] ; then
1114 # sleep 5
1115 rmdir "$InstallDir"
1116 fi