diff options
Diffstat (limited to 'sys-boot/refind-bin/files')
-rwxr-xr-x | sys-boot/refind-bin/files/refind-install | 80 | ||||
-rw-r--r-- | sys-boot/refind-bin/files/refind-mkconfig | 177 | ||||
-rw-r--r-- | sys-boot/refind-bin/files/refind.d-gentoo | 120 | ||||
-rw-r--r-- | sys-boot/refind-bin/files/refind.default | 180 |
4 files changed, 557 insertions, 0 deletions
diff --git a/sys-boot/refind-bin/files/refind-install b/sys-boot/refind-bin/files/refind-install new file mode 100755 index 0000000..35b1a01 --- /dev/null +++ b/sys-boot/refind-bin/files/refind-install @@ -0,0 +1,80 @@ +#!/bin/bash +# +# script to install rEFInd +# +# Usage: +# +# refind-install +# +# This program is copyright (c) 2012 by David P. Crandall +# It is released under the terms of the GNU GPL, version 3. +# It is based on the work of Roderick W. Smith from the +# install.sh script in the rEFInd package. +# +# Revision history: +# +# 0.4.5 -- Initial version +# +# Note: version numbers match those of the rEFInd package +# with which this script first appeared. + +InstallIt="0" + +CpuType=$(uname -m) +if [[ $CpuType == 'x86_64' ]] ; then + Refind="refind_x64.efi" +elif [[ $CpuType == 'i386' || $CpuType == 'i486' || $CpuType == 'i586' || $CpuType == 'i686' ]] ; then + Refind="refind_ia32.efi" + ewarn "CAUTION: This Linux installation uses a 32-bit kernel. 32-bit EFI-based" + ewarn "computers are VERY RARE. If you've installed a 32-bit version of Linux" + ewarn "on a 64-bit computer, you should manually install the 64-bit version of" + ewarn "rEFInd. Installation will now proceed presuming a 32-bit EFI." +else + echo + echo "Unknown CPU type '$CpuType'; aborting!" + echo + exit +fi + +Efibootmgr=$(which efibootmgr 2> /dev/null) +if [[ $Efibootmgr ]] ; then + modprobe efivars &> /dev/null + EspLine=$(df /boot/efi | grep boot) + InstallPart=$(echo $EspLine | cut -d " " -f 6) + InstallDisk=$(grep $InstallPart /etc/mtab | cut -d " " -f 1 | cut -c 1-8) + PartNum=$(grep $InstallPart /etc/mtab | cut -d " " -f 1 | cut -c 9-10) + TargetDir="/EFI/refind" + EntryFilename=$TargetDir/$Refind + EfiEntryFilename=$(echo ${EntryFilename//\//\\\}) + EfiEntryFilename2=$(echo ${EfiEntryFilename} | sed s/\\\\\\\\/\\\\\\\\\\\\\\\\/g) + ExistingEntry=$($Efibootmgr -v | grep $EfiEntryFilename2) + if [[ $ExistingEntry ]] ; then + ExistingEntryBootNum=$(echo $ExistingEntry | cut -c 5-8) + FirstBoot=$($Efibootmgr | grep BootOrder | cut -c 12-15) + if [[ $ExistingEntryBootNum != $FirstBoot ]] ; then + echo "An existing rEFInd boot entry exists, but isn't set as the default boot" + echo "manager. The boot order is being adjusted to make rEFInd the default boot" + echo "manager. If this is NOT what you want, you should use efibootmgr to" + echo "manually adjust your EFI's boot order." + $Efibootmgr -b $ExistingEntryBootNum -B &> /dev/null + InstallIt="1" + fi + else + InstallIt="1" + fi + if [[ $InstallIt == "1" ]] ; then + echo "Installing rEFInd as default boot manager" + $Efibootmgr -c -l $EfiEntryFilename -L rEFInd -d $InstallDisk -p $PartNum &> /dev/null + if [[ $? != 0 ]] ; then + echo + echo "ALERT: There were problems running the efibootmgr program! You may need to" + 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 + fi + fi +else + echo + echo "Could not locate the efibootmgr program." + echo +fi diff --git a/sys-boot/refind-bin/files/refind-mkconfig b/sys-boot/refind-bin/files/refind-mkconfig new file mode 100644 index 0000000..560503d --- /dev/null +++ b/sys-boot/refind-bin/files/refind-mkconfig @@ -0,0 +1,177 @@ +#!/usr/bin/env python +# +# script to automate creation of rEFInd configuration files +# +# Usage: +# +# refind-mkconfig +# +# This program is copyright (c) 2012 by David P. Crandall +# It is released under the terms of the GNU GPL, version 3. +# +# Revision history: +# +# 0.4.5 -- Initial version +# +# Note: version numbers match those of the rEFInd package +# with which this script first appeared. + +import os, re +from collections import OrderedDict, deque +from string import Template + +class _Template(Template): + idpattern = '[0-9]+' + +class _Parser(object): + def __init__(self, files): + self.files = files + self.state = pattern + self.stanzas = OrderedDict() + self.header = None + self.menu = None + + def process(self, lines): + remaining = self.state.process(lines, self) + if remaining: + self.process(remaining) + + def getstanzas(self): + for file in self.files: + with open(file, 'r') as sf: + lines = deque(sf.readlines()) + self.process(lines) + return self.stanzas + +class _Pattern(object): + def __init__(self): + self.header = re.compile("^\[(.+)\]") + + def process(self, lines, parser): + line = lines.popleft() + match = self.header.match(line) + if match: + parser.header = match.group(1) + parser.stanzas[parser.header] = OrderedDict() if parser.header not in parser.stanzas + parser.state = transition + return lines + +class _Menustart(object): + def __init__(): + self.start = re.compile("^menuentry\s+(.+)\s+\{") + + def process(self, lines, parser): + line = lines.popleft() + match = self.start.match(line) + if match: + parser.menu = match.group(1) + parser.stanzas[parser.header][parser.menu] = [line] + parser.state = menu_end + return lines + +class _Menuend(object): + def __init__(): + self.end = re.compile("^\}") + + def process(self, lines, parser): + line = lines.popleft() + parser.stanzas[parser.header][parser.menu].append(line) + if self.end.match(line): + parser.state = transition + return lines + +class _Transition(object): + def process(self, lines, parser): + if pattern.header.match(lines[0]): + parser.state = pattern + elif menu_start.start.match(lines[0]) + parser.state = menu_start + else + discard = lines.popleft() + return lines + +class Mkconfig(object): + def __init__(self): + self.efi = self._findEFI() + self.conf = os.path.join(self.efi, "/EFI/refind/refind.test") + self.comment = re.compile('^\s*#') + self.stanzas = OrderedDict() + self.stanzaFiles = sum([[os.path.join(r, f) for f in fl] + for r, d, fl in os.walk("/etc/refind.d")], []) + + blockdir = re.compile('^' + self.efi + '/EFI/(refind|tools)') + stripdir = re.compile('^' + self.efi) + efiFiles = [[os.path.join(r, f) for f in fl] + for r, d, fl in os.walk(self.efi) if not blockdir.match(r)] + # flatten generated lists + efiFiles = sum(efiFiles, []) + # sort by modification date of files, newest first + efiFiles = sorted(efiFiles, reverse=True, key=lambda i: os.path.getmtime(i)) + # strip mount path + self.efiFiles = [stripdir.sub('', f) for f in efiFiles] + + def _findEFI(self): + if os.path.ismount("/boot/efi"): + mntpath = os.path.abspath("/boot/efi") + elif os.path.ismount("/boot"): + mntpath = os.path.abspath("/boot") + else + print "The EFI partition could not be found at /boot or /boot/efi. Exiting" + exit + with open("/proc/mounts") as mnts: + for line in mnts: + words = re.split('\s+', line) + if words[1] == mntpath: + if words[2] == "vfat": + return mntpath + print "EFI partition must be vfat, but the filesystem is " + words[3] + ". Exiting" + exit + + def _getstanzas(self): + p = + for file in self.stanzaFiles: + with open(file, 'r') as sf: + lines = sf.readlines() + + + def writeGlobalOptions(self): + with open(self.conf, 'w') as newconf: + newconf.write("# This file has been automatically generated by refind-mkconfig.\n") + newconf.write("# Manual edits will be overwritten the next time refind-mkconfig\n") + newconf.write("# is invoked. To change settings, edit /etc/default/refind and\n") + newconf.write("# the files located at /etc/refind.d.\n\n") + # Get global options + newconf.write("# Global options\n") + with open("/etc/default/refind") as default: + for line in default: + if NOT self.comment.match(line): + newconf.write(line + "\n") + + def writeStanzas(self): + # Get OS stanzas + with open(self.conf, 'a') as newconf: + newconf.write("\n# OS stanzas\n\n") + p = _Parser(self.stanzaFiles) + self.stanzas = p.getstanzas + for pk in self.stanzas: + pattern = re.compile(pk) + for file in self.efiFiles: + match = pattern.match(file) + if match: + values = {str(i): match.group(i) for i in range(pattern.groups)} + for mk in self.stanzas[pk]: + for line in self.stanzas[pk][mk]: + t = _Template(line) + newconf.write(t.substitute(values)) + newconf.write("\n") + +pattern = _Pattern() +menu_start = _Menustart() +menu_end = _Menuend() +transition = _Transition() + +if __name__ == '__main__': + cfg = Mkconfig() + cfg.writeGlobalOptions + cfg.writeStanzas + print "New refind.conf written to " + cfg.efi
\ No newline at end of file diff --git a/sys-boot/refind-bin/files/refind.d-gentoo b/sys-boot/refind-bin/files/refind.d-gentoo new file mode 100644 index 0000000..728c742 --- /dev/null +++ b/sys-boot/refind-bin/files/refind.d-gentoo @@ -0,0 +1,120 @@ +# +# script to install rEFInd +# +# Usage: +# +# refind-mkconfig +# +# This program is copyright (c) 2012 by David P. Crandall +# It is released under the terms of the GNU GPL, version 3. +# +# Revision history: +# +# 0.4.5 -- Initial version +# +# Note: version numbers match those of the rEFInd package +# with which this script first appeared. +# +# Sample manual configuration stanzas. Each begins with the "menuentry" +# keyword followed by a name that's to appear in the menu (use quotes +# if you want the name to contain a space) and an open curly brace +# ("{"). Each entry ends with a close curly brace ("}"). Common +# keywords within each stanza include: +# +# volume - identifies the filesystem from which subsequent files +# are loaded. You can specify the volume by label or by +# a number followed by a colon (as in "0:" for the first +# filesystem or "1:" for the second). +# loader - identifies the boot loader file +# initrd - Specifies an initial RAM disk file +# icon - specifies a custom boot loader icon +# ostype - OS type code to determine boot options available by +# pressing Insert. Valid values are "MacOS", "Linux", +# "Windows", and "XOM". Case-sensitive. +# graphics - set to "on" to enable graphics-mode boot (useful +# mainly for MacOS) or "off" for text-mode boot. +# Default is auto-detected from loader filename. +# options - sets options to be passed to the boot loader; use +# quotes if more than one option should be passed or +# if any options use characters that might be changed +# by rEFInd parsing procedures (=, /, #, or tab). +# disabled - use alone or set to "yes" to disable this entry. +# +# Note that you can use either DOS/Windows/EFI-style backslashes (\) +# or Unix-style forward slashes (/) as directory separators. Either +# way, all file references are on the ESP from which rEFInd was +# launched. +# Use of quotes around parameters causes them to be interpreted as +# one keyword, and for parsing of special characters (spaces, =, /, +# and #) to be disabled. This is useful mainly with the "options" +# keyword. Use of quotes around parameters that specify filenames is +# permissible, but you must then use backslashes instead of slashes, +# except when you must pass a forward slash to the loader, as when +# passing a root= option to a Linux kernel. + +# Below are several sample boot stanzas. All are disabled by default. +# Find one similar to what you need, copy it, remove the "disabled" line, +# and adjust the entries to suit your needs. + +# A sample entry for a Linux 3.3 kernel with its new EFI boot stub +# support on a filesystem called "KERNELS". This entry includes +# Linux-specific boot options and specification of an initial RAM disk. +# Note uses of Linux-style forward slashes, even in the initrd +# specification. Also note that a leading slash is optional in file +# specifications. + +[(.*)/vmlinuz-((.*)-gentoo)(\.old)?] +menuentry "Gentoo ${3}" { + icon EFI/refind/icons/os_gentoo.icns + ostype Linux + volume ESP + loader ${0} + initrd ${1}/initramfs-genkernel-x86_64-${2} + options "domdadm root=LABEL=gentoo" +} + +menuentry Linux { + icon EFI/refind/icons/os_linux.icns + volume KERNELS + loader bzImage-3.3.0-rc7 + initrd initrd-3.3.0.img + options "ro root=UUID=5f96cafa-e0a7-4057-b18f-fa709db5b837" + disabled +} + +# A sample entry for loading Ubuntu using its standard name for +# its GRUB 2 boot loader. Note uses of Linux-style forward slashes +[ubuntu/grubx64.efi] +menuentry Ubuntu { + loader /EFI/ubuntu/grubx64.efi + icon /EFI/refined/icons/os_linux.icns + disabled +} + +# A minimal ELILO entry, which probably offers nothing that +# auto-detection can't accomplish. +[elilo.efi] +menuentry "ELILO" { + loader \EFI\elilo\elilo.efi + disabled +} + +# Like the ELILO entry, this one offers nothing that auto-detection +# can't do; but you might use it if you want to disable auto-detection +# but still boot Windows.... +menuentry "Windows 7" { + loader \EFI\Microsoft\Boot\bootmgfw.efi + disabled +} + +# EFI shells are programs just like boot loaders, and can be +# launched in the same way. You can pass a shell the name of a +# script that it's to run on the "options" line. The script +# could initialize hardware and then launch an OS, or it could +# do something entirely different. +menuentry "Windows via shell script" { + icon \EFI\refind\icons\os_win.icns + loader \EFI\tools\shell.efi + options "fs0:\EFI\tools\launch_windows.nsh" + disabled +}
\ No newline at end of file diff --git a/sys-boot/refind-bin/files/refind.default b/sys-boot/refind-bin/files/refind.default new file mode 100644 index 0000000..2067dd3 --- /dev/null +++ b/sys-boot/refind-bin/files/refind.default @@ -0,0 +1,180 @@ +# +# refind.conf +# Configuration file for the rEFInd boot menu +# + +# Timeout in seconds for the main menu screen. Setting the timeout to 0 +# disables automatic booting (i.e., no timeout). +# +timeout 20 + +# Hide user interface elements for personal preference or to increase +# security: +# banner - the rEFInd title banner +# label - text label in the menu +# singleuser - remove the submenu options to boot Mac OS X in single-user +# or verbose modes; affects ONLY MacOS X +# hwtest - the submenu option to run Apple's hardware test +# arrows - scroll arrows on the OS selection tag line +# all - all of the above +# +#hideui singleuser +#hideui all + +# Set the name of a subdirectory in which icons are stored. Icons must +# have the same names they have in the standard directory. The directory +# name is specified relative to the main rEFInd binary's directory. If +# an icon can't be found in the specified directory, an attempt is made +# to load it from the default directory; thus, you can replace just some +# icons in your own directory and rely on the default for others. +# Default is "icons". +# +#icons_dir myicons + +# Use a custom title banner instead of the rEFInd icon and name. The file +# path is relative to the directory where refind.efi is located. The color +# in the top left corner of the image is used as the background color +# for the menu screens. Currently uncompressed BMP images with color +# depths of 24, 8, 4 or 1 bits are supported. +# +#banner hostname.bmp + +# Custom images for the selection background. There is a big one (144 x 144) +# for the OS icons, and a small one (64 x 64) for the function icons in the +# second row. If only a small image is given, that one is also used for +# the big icons by stretching it in the middle. If only a big one is given, +# the built-in default will be used for the small icons. +# +# Like the banner option above, these options take a filename of +# an uncompressed BMP image file. +# +#selection_big selection-big.bmp +#selection_small selection-small.bmp + +# Use text mode only. When enabled, this option forces rEFInd into text mode. +# +#textonly + +# Set the screen's video resolution. Pass this option two values, +# corresponding to the X and Y resolutions. Note that not all resolutions +# are supported. On UEFI systems, passing an incorrect value results in a +# message being shown on the screen to that effect, along with a list of +# supported modes. On EFI 1.x systems (e.g., Macintoshes), setting an +# incorrect mode silently fails. On both types of systems, setting an +# incorrect resolution results in the default resolution being used. +# A resolution of 1024x768 usually works, but higher values often don't. +# Default is "0 0" (use the system default resolution, usually 800x600). +# +#resolution 1024 768 + +# Launch specified OSes in graphics mode. By default, rEFInd switches +# to text mode and displays basic pre-launch information when launching +# all OSes except OS X. Using graphics mode can produce a more seamless +# transition, but displays no information, which can make matters +# difficult if you must debug a problem. Also, on at least one known +# computer, using graphics mode prevents a crash when using the Linux +# kernel's EFI stub loader. +# Valid options: +# osx - Mac OS X +# linux - A Linux kernel with EFI stub loader +# elilo - The ELILO boot loader +# grub - The GRUB (Legacy or 2) boot loader +# windows - Microsoft Windows +# Default value: osx +# +#use_graphics_for osx,linux + +# Which non-bootloader tools to show on the tools line, and in what +# order to display them: +# shell - the EFI shell +# gptsync - the (dangerous) gptsync.efi utility +# about - an "about this program" option +# exit - a tag to exit from rEFInd +# shutdown - shuts down the computer (a bug causes this to reboot EFI +# systems) +# reboot - a tag to reboot the computer +# Default is shell,about,shutdown,reboot +# +#showtools shell, about, reboot + +# Directories in which to search for EFI drivers. These drivers can +# provide filesystem support, give access to hard disks on plug-in +# controllers, etc. In most cases none are needed, but if you add +# EFI drivers and you want rEFInd to automatically load them, you +# should specify one or more paths here. rEFInd always scans the +# "drivers" subdirectory of its own installation directory; this +# option specifies ADDITIONAL directories to scan. +# Default is to scan no additional directories for EFI drivers +# +#scan_driver_dirs EFI/tools/drivers,drivers + +# Which types of boot loaders to search, and in what order to display them: +# internal - internal EFI disk-based boot loaders +# external - external EFI disk-based boot loaders +# optical - EFI optical discs (CD, DVD, etc.) +# hdbios - BIOS disk-based boot loaders +# biosexternal - BIOS external boot loaders (USB, eSATA, etc.) +# cd - BIOS optical-disc boot loaders +# manual - use stanzas later in this configuration file +# Default is internal,external,optical +# +#scanfor internal,external,optical + +# When scanning volumes for EFI boot loaders, rEFInd always looks for +# Mac OS X's and Microsoft Windows' boot loaders in their normal locations, +# and scans the root directory and every subdirectory of the /EFI directory +# for additional boot loaders, but it doesn't recurse into these directories. +# The also_scan_dirs token adds more directories to the scan list. +# Directories are specified relative to the volume's root directory. This +# option applies to ALL the volumes that rEFInd scans. If a specified +# directory doesn't exist, it's ignored (no error condition results). +# The default is to scan no additional directories. +# +#also_scan_dirs boot,EFI/linux/kernels + +# Directories that should NOT be scanned for boot loaders. By default, +# rEFInd doesn't scan its own directory or the EFI/tools directory. +# You can "blacklist" additional directories with this option, which +# takes a list of directory names as options. You might do this to +# keep EFI/boot/bootx64.efi out of the menu if that's a duplicate of +# another boot loader or to exclude a directory that holds drivers +# or non-bootloader utilities provided by a hardware manufacturer. If +# a directory is listed both here and in also_scan_dirs, dont_scan_dirs +# takes precedence. +# +#dont_scan_dirs EFI/boot,EFI/Dell + +# Scan for Linux kernels that lack a ".efi" filename extension. This is +# useful for better integration with Linux distributions that provide +# kernels with EFI stub loaders but that don't give those kernels filenames +# that end in ".efi", particularly if the kernels are stored on a +# filesystem that the EFI can read. When uncommented, this option causes +# all files in scanned directories with names that begin with "vmlinuz" +# or "bzImage" to be included as loaders, even if they lack ".efi" +# extensions. The drawback to this option is that it can pick up kernels +# that lack EFI stub loader support and other files. Most notably, if you +# want to give a kernel a custom icon by placing an icon with the kernel's +# filename but a ".icns" extension in the same directory as the kernel, this +# option will cause the icon file to show up as a non-functional loader tag. +# Default is to NOT scan for kernels without ".efi" extensions. +# +#scan_all_linux_kernels + +# Set the maximum number of tags that can be displayed on the screen at +# any time. If more loaders are discovered than this value, rEFInd shows +# a subset in a scrolling list. If this value is set too high for the +# screen to handle, it's reduced to the value that the screen can manage. +# If this value is set to 0 (the default), it's adjusted to the number +# that the screen can handle. +# +#max_tags 0 + +# Set the default menu selection. The available arguments match the +# keyboard accelerators available within rEFInd. You may select the +# default loader using: +# - A digit between 1 and 9, in which case the Nth loader in the menu +# will be the default. +# - Any substring that corresponds to a portion of the loader's title +# (usually the OS's name or boot loader's path). +# +#default_selection 1 |