From: srs5694 Date: Thu, 13 Dec 2012 06:41:31 +0000 (-0500) Subject: Bug fix & new driver-installation behavior in install.sh. X-Git-Url: https://code.delx.au/refind/commitdiff_plain/742d7d95d0713ac22ff636875a4f17c68484bbe1 Bug fix & new driver-installation behavior in install.sh. --- diff --git a/docs/refind/installing.html b/docs/refind/installing.html index 31b5d70..7f2f945 100644 --- a/docs/refind/installing.html +++ b/docs/refind/installing.html @@ -15,7 +15,7 @@ href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com

Originally written: 3/14/2012; last Web page update: -12/12/2012, referencing rEFInd 0.5.1.1

+12/13/2012, referencing rEFInd 0.5.1.2

I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!

@@ -200,20 +200,20 @@ Installation has completed successfully. install.sh creates this file and populates it with a couple of sample entries. If /boot is on a FAT partition (or HFS+ on a Mac), or if it's on an ext2fs, ext3fs, ReiserFS, or HFS+ partition and - you install an appropriate driver (for instance by passing - --drivers to the script), the result is that rEFInd will - detect your kernel and will probably boot it correctly. Some systems - will require manual tweaking to refind_linux.conf, - though—for instance, to add dolvm to the boot options on - Gentoo systems that use LVM. + you install an appropriate driver (as install.sh does + automatically when run from your working Linux installation), the + result is that rEFInd will detect your kernel and will probably boot it + correctly. Some systems will require manual tweaking to + refind_linux.conf, though—for instance, to add + dolvm to the boot options on Gentoo systems that use LVM.

In addition to these quirks, you should be aware of some options that install.sh supports to enable you to customize your installation in various ways. The syntax for install.sh is as follows:

-install.sh [--esp | --usedefault device-file] [--drivers] [--shim shim-filename] \
-           [--localkeys]
+install.sh [--esp | --usedefault device-file] [--nodrivers | --alldrivers] \
+           [--shim shim-filename] [--localkeys]
 

The details of the options are summarized in Table 1. Using some of these options in unusual conditions can generate warnings and prompts to confirm your actions. In particular, using --shim or --localkeys when you're not booted in Secure Boot mode, or failing to use --shim when you are booted in Secure Boot mode, will generate a query and a request to confirm your installation. Consult the Managing Secure Boot page for more on this topic.

@@ -232,8 +232,12 @@ install.sh [--esp | --usedefault device-file] [--drive You can install rEFInd to a disk using the default/fallback filename of EFI/BOOT/bootx64.efi (and EFI/BOOT/bootia32.efi, if the 32-bit build is available) using this option. The device-file should be an unmounted ESP, or at least a FAT partition, as in --usedefault /dev/sdc1. Your computer's NVRAM entries will not be modified when installing in this way. The intent is that you can create a bootable USB flash drive or install rEFInd on a computer that tends to "forget" its NVRAM settings with this option. This option is mutually exclusive with --esp. - --drivers - Ordinarily install.sh does not install drivers; but when you specify this option, it does; it copies all the driver files for your architecture. You may want to remove unused driver files after you use this option, especially if your computer uses Secure Boot. + --nodrivers + Ordinarily install.sh attempts to install the driver required to read /boot on Linux. This attempt works only if you're using ext2fs, ext3fs, or ReiserFS on the relevant partition. If you want to forego this driver installation, pass the --nodrivers option. This option is the default on OS X or when you use --usedefault. + + + --alldrivers + When you specify this option, install.sh copies all the driver files for your architecture. You may want to remove unused driver files after you use this option, especially if your computer uses Secure Boot. --shim shim-filename diff --git a/install.sh b/install.sh index 6040c23..425da29 100755 --- a/install.sh +++ b/install.sh @@ -12,7 +12,9 @@ # "--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. -# "--drivers" to install drivers along with regular files +# "--alldrivers" to install all drivers along with regular files +# "--nodrivers" to suppress driver installation (default in Linux is +# driver used on /boot; --nodrivers is OS X default) # "--shim {shimfile}" to install a shim.efi file for Secure Boot # "--localkeys" to re-sign x86-64 binaries with a locally-generated key # @@ -27,6 +29,10 @@ # # Revision history: # +# 0.5.2 -- Changed --drivers to --alldrivers and added --nodrivers option; +# changed default driver installation behavior in Linux to install +# the driver needed to read /boot +# 0.5.1.2 -- Fixed bug that caused failure to generate refind_linux.conf file # 0.5.1.1 -- Fixed bug that caused script failure under OS X # 0.5.1 -- Added --shim & --localkeys options & create sample refind_linux.conf # in /boot @@ -44,6 +50,7 @@ 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" @@ -56,7 +63,12 @@ DeleteRefindDir=0 GetParams() { InstallToEspOnMac=0 - InstallDrivers=0 + if [[ $OSName == "Linux" ]] ; then + # Install the driver required to read /boot, if it's available + InstallDrivers="boot" + else + InstallDrivers="none" + fi while [[ $# -gt 0 ]]; do case $1 in --esp | --ESP) InstallToEspOnMac=1 @@ -72,9 +84,11 @@ GetParams() { --shim) ShimSource=$2 shift ;; - --drivers) InstallDrivers=1 + --drivers | --alldrivers) InstallDrivers="all" ;; - * ) echo "Usage: $0 [--esp | --usedefault {device-file}] [--drivers] " + --nodrivers) InstallDrivers="none" + ;; + * ) echo "Usage: $0 [--esp | --usedefault {device-file}] [--nodrivers | --alldrivers] " echo " [--shim {shim-filename}] [--localkeys]" exit 1 esac @@ -157,6 +171,35 @@ CopyKeys() { fi } # CopyKeys() +# 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() { + if [[ $InstallDrivers == "all" ]] ; then + mkdir -p $InstallDir/$TargetDir/drivers_$1 + cp $RefindDir/drivers_$1/*_$1.efi $InstallDir/$TargetDir/drivers_$1/ 2> /dev/null + cp $ThisDir/drivers_$1/*_$1.efi $InstallDir/$TargetDir/drivers_$1/ 2> /dev/null + elif [[ $InstallDrivers == "boot" && -x `which 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 =` + DriverType="" + case $BootFS in + ext2 | ext3) DriverType="ext2" + ;; + reiserfs) DriverType="reiserfs" + ;; + hfsplus) DriverType="hfs" + ;; + esac + if [[ -n $BootFS ]] ; then + echo "Installing driver for $BootFS (${DriverType}_$1.efi)" + mkdir -p $InstallDir/$TargetDir/drivers_$1 + cp $RefindDir/drivers_$1/${DriverType}_$1.efi $InstallDir/$TargetDir/drivers_$1/ 2> /dev/null + cp $ThisDir/drivers_$1/${DriverType}_$1.efi $InstallDir/$TargetDir/drivers_$1/ 2> /dev/null + fi + fi +} + # Copy the rEFInd files to the ESP or OS X root partition. # Sets Problems=1 if any critical commands fail. CopyRefindFiles() { @@ -174,7 +217,7 @@ CopyRefindFiles() { TargetShim="bootx64.efi" CopyShimFiles fi - if [[ $InstallDrivers == 1 ]] ; then + if [[ $InstallDrivers == "all" ]] ; then cp -r $RefindDir/drivers_* $InstallDir/$TargetDir/ 2> /dev/null cp -r $ThisDir/drivers_* $InstallDir/$TargetDir/ 2> /dev/null fi @@ -185,22 +228,14 @@ CopyRefindFiles() { if [[ $? != 0 ]] ; then Problems=1 fi - if [[ $InstallDrivers == 1 ]] ; then - mkdir -p $InstallDir/$TargetDir/drivers_ia32 - cp $RefindDir/drivers_ia32/*_ia32.efi $InstallDir/$TargetDir/drivers_ia32/ 2> /dev/null - cp $ThisDir/drivers_ia32/*_ia32.efi $InstallDir/$TargetDir/drivers_ia32/ 2> /dev/null - fi + CopyDrivers ia32 Refind="refind_ia32.efi" elif [[ $Platform == 'EFI64' ]] ; then cp $RefindDir/refind_x64.efi $InstallDir/$TargetDir/$TargetX64 if [[ $? != 0 ]] ; then Problems=1 fi - if [[ $InstallDrivers == 1 ]] ; then - mkdir -p $InstallDir/$TargetDir/drivers_x64 - cp $RefindDir/drivers_x64/*_x64.efi $InstallDir/$TargetDir/drivers_x64/ 2> /dev/null - cp $ThisDir/drivers_x64/*_x64.efi $InstallDir/$TargetDir/drivers_x64/ 2> /dev/null - fi + CopyDrivers x64 Refind="refind_x64.efi" CopyKeys if [[ $ShimSource != "none" ]] ; then @@ -556,7 +591,7 @@ AddBootEntry() { # Create a minimal/sample refind_linux.conf file in /boot. GenerateRefindLinuxConf() { - if [[ ! -f /boot/refind_linux.conf ]] ; then + if [[ ! -f $RLConfFile ]] ; then if [[ -f /etc/default/grub ]] ; then # We want the default options used by the distribution, stored here.... source /etc/default/grub @@ -633,8 +668,8 @@ InstallOnLinux() { # install under OS X or Linux, depending on the detected platform. # -GetParams $@ OSName=`uname -s` +GetParams $@ ThisDir="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" RefindDir="$ThisDir/refind" ThisScript="$ThisDir/`basename $0`"