Add refind-efi and syslinux setup for UEFI systems

This commit is contained in:
natemaia 2019-01-20 09:37:02 -08:00
parent 3d4559e249
commit 14069e46a6
2 changed files with 86 additions and 29 deletions

View File

@ -12,7 +12,7 @@ _Pass2="\nRe-enter the password for"
_NoFileErr="\nFile does not exist.\n"
_WelTitle="Welcome to the"
_WelBody="\nThis will help you get $DIST setup on your system.\nBeing an Arch based distribution, having prior GNU/Linux experience will be an asset however we try our best to keep things simple.\nIf you are unsure about an option, a default will be listed or the first selected option will be the default (excluding language and timezone).\n\n\nMenu Navigation:\n\n - Select items with the arrow keys or the option number.\n - Use [Space] to toggle options and [Enter] to confirm.\n - Switch between buttons using [Tab] or the arrow keys.\n - Use [Page Up] and [Page Down] to jump whole pages\n - Press the highlighted key of an option to select it.\n"
_WelBody="\nThis will help you get $DIST setup on your system.\nHaving GNU/Linux experience is an asset, however we try our best to keep things simple.\n\nIf you are unsure about an option, a default will be listed or\nthe first selected option will be the default (excluding language and timezone).\n\n\nMenu Navigation:\n\n - Select items with the arrow keys or the option number.\n - Use [Space] to toggle options and [Enter] to confirm.\n - Switch between buttons using [Tab] or the arrow keys.\n - Use [Page Up] and [Page Down] to jump whole pages\n - Press the highlighted key of an option to select it.\n"
_NotRoot="\nThis installer must be run as root or using sudo.\n"
_Not64Bit="\nThis installer only supports x86_64 architectures.\n"

View File

@ -8,7 +8,7 @@
# Some ideas and code reworked from other resources
# AIF, Cnichi, Calamares, Arch Wiki.. Credit where credit is due
VER="2.0.1" # version
VER="2.0.0" # version
DIST="ArchLabs" # distributor
MNT="/mnt" # mountpoint
@ -108,6 +108,7 @@ SHL=$((LINES - 20))
# command used to install each bootloader
declare -A BCMDS=(
[refind-efi]="refind-install"
[grub]="grub-install --recheck --force"
[syslinux]="syslinux-install_update -i -a -m"
[systemd-boot]="bootctl --path=/boot install"
@ -1702,17 +1703,19 @@ setup_boot()
if [[ $SYS == 'BIOS' ]]; then
BOOTLDR="$(menubox "$_PrepMount" "$_MntBootBody" \
"grub" "The Grand Unified Bootloader, standard among many Linux distributions" \
"syslinux" "A collection of boot loaders capable of booting from drives, CDs, and over the network")"
"syslinux" "A collection of boot loaders for booting drives, CDs, or over the network")"
else
BOOTLDR="$(menubox "$_PrepMount" "$_MntBootBody" \
"systemd-boot" "A simple UEFI boot manager which executes configured EFI images" \
"grub" "The Grand Unified Bootloader, standard among many Linux distributions")"
"grub" "The Grand Unified Bootloader, standard among many Linux distributions" \
"refind-efi" "A UEFI boot manager that aims to be platform neutral and simplify multi-boot" \
"syslinux" "A collection of boot loaders for booting drives, CDs, or over the network (no chainloading support)")"
fi
[[ $BOOTLDR ]] || return 1
if [[ $BOOT_PART != "" ]]; then
if [[ $BOOT_PART ]]; then
mount_partition "$BOOT_PART" "/boot" && SEP_BOOT=true || return 1
setup_boot_device
fi
@ -1721,9 +1724,6 @@ setup_boot()
setup_grub()
{
# grub has by far the worst setup of the three however
# the configuration is shorter due to grub-mkconfig
EDIT_FILES[bootloader]="/etc/default/grub"
if [[ $SYS == 'BIOS' ]]; then
@ -1751,12 +1751,49 @@ setup_grub()
setup_syslinux()
{
if [[ $SYS == 'BIOS' ]]; then
EDIT_FILES[bootloader]="/boot/syslinux/syslinux.cfg"
else
EDIT_FILES[bootloader]="/boot/EFI/syslinux/syslinux.cfg"
BCMDS[syslinux]="mount -t efivarfs efivarfs /sys/firmware/efi/efivars || true &&
efibootmgr -c -d $BOOT_DEVICE -p $BOOT_PART_NUM -l /EFI/syslinux/syslinux.efi -L $DIST -v"
fi
}
setup_systemd-boot()
{
EDIT_FILES[bootloader]="/boot/loader/entries/$DIST.conf"
BCMDS[systemd-boot]="mount -t efivarfs efivarfs /sys/firmware/efi/efivars || true && bootctl --path=/boot install"
}
setup_refind-efi()
{
EDIT_FILES[bootloader]="/boot/refind_linux.conf"
BCMDS[refind-efi]="mount -t efivarfs efivarfs /sys/firmware/efi/efivars || true && refind-install"
}
prerun_refind-efi()
{
cat > $MNT/boot/refind_linux.conf << EOF
"$DIST Linux" "root=$ROOT_PART_ID $([[ $LUKS_DEV ]] &&
printf "%s " "$LUKS_DEV")rw add_efi_memmap $([[ $UCODE ]] &&
printf "initrd=/%s " "$UCODE")initrd=/initramfs-%v.img"
"$DIST Linux Fallback" "root=$ROOT_PART_ID $([[ $LUKS_DEV ]] &&
printf "%s " "$LUKS_DEV")rw add_efi_memmap $([[ $UCODE ]] &&
printf "initrd=/%s " "$UCODE")initrd=/initramfs-%v-fallback.img"
EOF
mkdir -p $MNT/etc/pacman.d/hooks
cat > $MNT/etc/pacman.d/hooks/refind.hook << EOF
[Trigger]
Operation = Upgrade
Type = Package
Target = refind-efi
[Action]
Description = Updating rEFInd on ESP
When = PostTransaction
Exec = /usr/bin/refind-install
EOF
}
prerun_grub()
@ -1765,11 +1802,16 @@ prerun_grub()
s/GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT=\"\"/g" $MNT/etc/default/grub
if [[ $LUKS_DEV ]]; then
sed -i "s~#GRUB_ENABLE_CRYPTODISK~GRUB_ENABLE_CRYPTODISK~g;
s~GRUB_CMDLINE_LINUX=.*~GRUB_CMDLINE_LINUX=\"${LUKS_DEV}\"~g" $MNT/etc/default/grub
s~GRUB_CMDLINE_LINUX=.*~GRUB_CMDLINE_LINUX=\"${LUKS_DEV}\"~g" $MNT/etc/default/grub 2>$ERR
errshow 1 "sed -i 's~#GRUB_ENABLE_CRYPTODISK~GRUB_ENABLE_CRYPTODISK~g;
s~GRUB_CMDLINE_LINUX=.*~GRUB_CMDLINE_LINUX=\"${LUKS_DEV}\"~g' $MNT/etc/default/grub"
fi
if [[ $SYS == 'BIOS' && $LVM && $SEP_BOOT == false ]]; then
sed -i "s/GRUB_PRELOAD_MODULES=.*/GRUB_PRELOAD_MODULES=\"lvm\"/g" $MNT/etc/default/grub
sed -i "s/GRUB_PRELOAD_MODULES=.*/GRUB_PRELOAD_MODULES=\"lvm\"/g" $MNT/etc/default/grub 2>$ERR
errshow 1 "sed -i 's/GRUB_PRELOAD_MODULES=.*/GRUB_PRELOAD_MODULES=\"lvm\"/g' $MNT/etc/default/grub"
fi
# setup for os-prober module
mkdir -p /run/lvm
mkdir -p /run/udev
mkdir -p $MNT/hostrun/lvm
@ -1782,21 +1824,21 @@ prerun_grub()
prerun_systemd-boot()
{
mkdir -p ${MNT}/boot/loader/entries
cat > ${MNT}/boot/loader/loader.conf << EOF
mkdir -p $MNT/boot/loader/entries
cat > $MNT/boot/loader/loader.conf << EOF
default $DIST
timeout 5
editor no
EOF
cat > ${MNT}/boot/loader/entries/${DIST}.conf << EOF
cat > $MNT/boot/loader/entries/$DIST.conf << EOF
title $DIST Linux
linux /vmlinuz-${KERNEL}$([[ $UCODE ]] && printf "\ninitrd %s" "/${UCODE}.img")
linux /vmlinuz-${KERNEL}$([[ $UCODE ]] && printf "\ninitrd %s" "/$UCODE.img")
initrd /initramfs-$KERNEL.img
options root=$ROOT_PART_ID $([[ $LUKS_DEV ]] && printf "%s " "$LUKS_DEV")rw
EOF
cat > ${MNT}/boot/loader/entries/${DIST}-fallback.conf << EOF
cat > $MNT/boot/loader/entries/$DIST-fallback.conf << EOF
title $DIST Linux Fallback
linux /vmlinuz-${KERNEL}$([[ $UCODE ]] && printf "\ninitrd %s" "/${UCODE}.img")
linux /vmlinuz-${KERNEL}$([[ $UCODE ]] && printf "\ninitrd %s" "/$UCODE.img")
initrd /initramfs-$KERNEL-fallback.img
options root=$ROOT_PART_ID $([[ $LUKS_DEV ]] && printf "%s " "$LUKS_DEV")rw
EOF
@ -1818,17 +1860,21 @@ EOF
prerun_syslinux()
{
mkdir -pv $MNT/boot/syslinux
cp -rfv $RUN/syslinux/splash.png $MNT/boot/syslinux/
cp -rfv /usr/lib/syslinux/bios/* $MNT/boot/syslinux/
cat > $MNT/boot/syslinux/syslinux.cfg << EOF
local cfgdir="$MNT/boot/syslinux" cfgsrcdir="/usr/lib/syslinux/bios"
if [[ $SYS == 'UEFI' ]]; then
cfgdir="$MNT/boot/EFI/syslinux"; cfgsrcdir="/usr/lib/syslinux/efi64/"
fi
mkdir -pv $cfgdir
cp -rfv $cfgsrcdir/* $cfgdir/
cat > $cfgdir/syslinux.cfg << EOF
UI vesamenu.c32
MENU TITLE $DIST Boot Menu
MENU BACKGROUND splash.png
TIMEOUT 50
DEFAULT $DIST
# Refer to https://www.syslinux.org/wiki/index.php/Comboot/menu.c32
# see: https://www.syslinux.org/wiki/index.php/Comboot/menu.c32
MENU WIDTH 78
MENU MARGIN 4
MENU ROWS 4
@ -1852,15 +1898,15 @@ LABEL $DIST
MENU LABEL $DIST Linux
LINUX ../vmlinuz-$KERNEL
APPEND root=$ROOT_PART_ID $([[ $LUKS_DEV ]] && printf "%s " "$LUKS_DEV")rw
INITRD $([[ $UCODE ]] && printf "%s" "../${UCODE}.img,")../initramfs-$KERNEL.img
INITRD $([[ $UCODE ]] && printf "%s" "../$UCODE.img,")../initramfs-$KERNEL.img
LABEL ${DIST}fallback
MENU LABEL $DIST Linux Fallback
LINUX ../vmlinuz-$KERNEL
APPEND root=$ROOT_PART_ID $([[ $LUKS_DEV ]] && printf "%s " "$LUKS_DEV")rw
INITRD $([[ $UCODE ]] && printf "%s" "../${UCODE}.img,")../initramfs-$KERNEL-fallback.img
INITRD $([[ $UCODE ]] && printf "%s" "../$UCODE.img,")../initramfs-$KERNEL-fallback.img
# some examples for chainloading other bootloaders
# examples of chainloading other bootloaders
#LABEL grub2
#MENU LABEL Grub2
@ -1882,7 +1928,7 @@ install_bootloader()
ROOT_PART_ID="$ROOT_PART"
elif [[ $BOOTLDR == 'syslinux' ]]; then
ROOT_PART_ID="UUID=$(blkid -s UUID -o value $ROOT_PART)"
elif [[ $BOOTLDR == 'systemd-boot' ]]; then
elif [[ $BOOTLDR == 'systemd-boot' || $BOOTLDR == 'refind-efi' ]]; then
ROOT_PART_ID="PARTUUID=$(blkid -s PARTUUID -o value $ROOT_PART)"
fi
@ -1902,8 +1948,8 @@ install_bootloader()
find $MNT/boot/ -name 'syslinux*' -exec rm -rf '{}' \; >/dev/null 2>&1
fi
prerun_$BOOTLDR
printf "Installing and setting up $BOOTLDR\n"
prerun_$BOOTLDR
chrun "${BCMDS[$BOOTLDR]}" 2>$ERR
errshow 1 "${BCMDS[$BOOTLDR]}"
@ -1913,9 +1959,20 @@ install_bootloader()
rm -rf $MNT/hostrun >/dev/null 2>&1
fi
if [[ $BOOTLDR == 'grub' && $SYS == 'UEFI' ]]; then
if [[ $SYS == 'UEFI' ]]; then
# some UEFI firmware require a generic esp/BOOT/BOOTX64.EFI
# see: https://wiki.archlinux.org/index.php/GRUB#UEFI
# also: https://wiki.archlinux.org/index.php/syslinux#UEFI_Systems
mkdir -pv $MNT/boot/EFI/BOOT
if [[ $BOOTLDR == 'grub' ]]; then
cp -fv $MNT/boot/EFI/$DIST/grubx64.efi $MNT/boot/EFI/BOOT/BOOTX64.EFI
elif [[ $BOOTLDR == 'syslinux' ]]; then
cp -rf $MNT/boot/EFI/syslinux/* $MNT/boot/EFI/BOOT/
cp -f $MNT/boot/EFI/syslinux/syslinux.efi $MNT/boot/EFI/BOOT/BOOTX64.EFI
elif [[ $BOOTLDR == 'refind-efi' ]]; then
sed -i '/#extra_kernel_version_strings/ c extra_kernel_version_strings linux-hardened,linux-zen,linux-lts,linux'
cp -fv $MNT/boot/EFI/refind/refind_x64.efi $MNT/boot/EFI/BOOT/BOOTX64.EFI
fi
fi
return 0