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" _NoFileErr="\nFile does not exist.\n"
_WelTitle="Welcome to the" _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" _NotRoot="\nThis installer must be run as root or using sudo.\n"
_Not64Bit="\nThis installer only supports x86_64 architectures.\n" _Not64Bit="\nThis installer only supports x86_64 architectures.\n"

View File

@ -8,7 +8,7 @@
# Some ideas and code reworked from other resources # Some ideas and code reworked from other resources
# AIF, Cnichi, Calamares, Arch Wiki.. Credit where credit is due # AIF, Cnichi, Calamares, Arch Wiki.. Credit where credit is due
VER="2.0.1" # version VER="2.0.0" # version
DIST="ArchLabs" # distributor DIST="ArchLabs" # distributor
MNT="/mnt" # mountpoint MNT="/mnt" # mountpoint
@ -108,6 +108,7 @@ SHL=$((LINES - 20))
# command used to install each bootloader # command used to install each bootloader
declare -A BCMDS=( declare -A BCMDS=(
[refind-efi]="refind-install"
[grub]="grub-install --recheck --force" [grub]="grub-install --recheck --force"
[syslinux]="syslinux-install_update -i -a -m" [syslinux]="syslinux-install_update -i -a -m"
[systemd-boot]="bootctl --path=/boot install" [systemd-boot]="bootctl --path=/boot install"
@ -1702,17 +1703,19 @@ setup_boot()
if [[ $SYS == 'BIOS' ]]; then if [[ $SYS == 'BIOS' ]]; then
BOOTLDR="$(menubox "$_PrepMount" "$_MntBootBody" \ BOOTLDR="$(menubox "$_PrepMount" "$_MntBootBody" \
"grub" "The Grand Unified Bootloader, standard among many Linux distributions" \ "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 else
BOOTLDR="$(menubox "$_PrepMount" "$_MntBootBody" \ BOOTLDR="$(menubox "$_PrepMount" "$_MntBootBody" \
"systemd-boot" "A simple UEFI boot manager which executes configured EFI images" \ "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 fi
[[ $BOOTLDR ]] || return 1 [[ $BOOTLDR ]] || return 1
if [[ $BOOT_PART != "" ]]; then if [[ $BOOT_PART ]]; then
mount_partition "$BOOT_PART" "/boot" && SEP_BOOT=true || return 1 mount_partition "$BOOT_PART" "/boot" && SEP_BOOT=true || return 1
setup_boot_device setup_boot_device
fi fi
@ -1721,9 +1724,6 @@ setup_boot()
setup_grub() 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" EDIT_FILES[bootloader]="/etc/default/grub"
if [[ $SYS == 'BIOS' ]]; then if [[ $SYS == 'BIOS' ]]; then
@ -1751,12 +1751,49 @@ setup_grub()
setup_syslinux() setup_syslinux()
{ {
EDIT_FILES[bootloader]="/boot/syslinux/syslinux.cfg" 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() setup_systemd-boot()
{ {
EDIT_FILES[bootloader]="/boot/loader/entries/$DIST.conf" 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() prerun_grub()
@ -1765,11 +1802,16 @@ prerun_grub()
s/GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT=\"\"/g" $MNT/etc/default/grub s/GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT=\"\"/g" $MNT/etc/default/grub
if [[ $LUKS_DEV ]]; then if [[ $LUKS_DEV ]]; then
sed -i "s~#GRUB_ENABLE_CRYPTODISK~GRUB_ENABLE_CRYPTODISK~g; 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 fi
if [[ $SYS == 'BIOS' && $LVM && $SEP_BOOT == false ]]; then 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 fi
# setup for os-prober module
mkdir -p /run/lvm mkdir -p /run/lvm
mkdir -p /run/udev mkdir -p /run/udev
mkdir -p $MNT/hostrun/lvm mkdir -p $MNT/hostrun/lvm
@ -1782,21 +1824,21 @@ prerun_grub()
prerun_systemd-boot() prerun_systemd-boot()
{ {
mkdir -p ${MNT}/boot/loader/entries mkdir -p $MNT/boot/loader/entries
cat > ${MNT}/boot/loader/loader.conf << EOF cat > $MNT/boot/loader/loader.conf << EOF
default $DIST default $DIST
timeout 5 timeout 5
editor no editor no
EOF EOF
cat > ${MNT}/boot/loader/entries/${DIST}.conf << EOF cat > $MNT/boot/loader/entries/$DIST.conf << EOF
title $DIST Linux 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 initrd /initramfs-$KERNEL.img
options root=$ROOT_PART_ID $([[ $LUKS_DEV ]] && printf "%s " "$LUKS_DEV")rw options root=$ROOT_PART_ID $([[ $LUKS_DEV ]] && printf "%s " "$LUKS_DEV")rw
EOF EOF
cat > ${MNT}/boot/loader/entries/${DIST}-fallback.conf << EOF cat > $MNT/boot/loader/entries/$DIST-fallback.conf << EOF
title $DIST Linux Fallback 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 initrd /initramfs-$KERNEL-fallback.img
options root=$ROOT_PART_ID $([[ $LUKS_DEV ]] && printf "%s " "$LUKS_DEV")rw options root=$ROOT_PART_ID $([[ $LUKS_DEV ]] && printf "%s " "$LUKS_DEV")rw
EOF EOF
@ -1818,17 +1860,21 @@ EOF
prerun_syslinux() prerun_syslinux()
{ {
mkdir -pv $MNT/boot/syslinux local cfgdir="$MNT/boot/syslinux" cfgsrcdir="/usr/lib/syslinux/bios"
cp -rfv $RUN/syslinux/splash.png $MNT/boot/syslinux/ if [[ $SYS == 'UEFI' ]]; then
cp -rfv /usr/lib/syslinux/bios/* $MNT/boot/syslinux/ cfgdir="$MNT/boot/EFI/syslinux"; cfgsrcdir="/usr/lib/syslinux/efi64/"
cat > $MNT/boot/syslinux/syslinux.cfg << EOF fi
mkdir -pv $cfgdir
cp -rfv $cfgsrcdir/* $cfgdir/
cat > $cfgdir/syslinux.cfg << EOF
UI vesamenu.c32 UI vesamenu.c32
MENU TITLE $DIST Boot Menu MENU TITLE $DIST Boot Menu
MENU BACKGROUND splash.png MENU BACKGROUND splash.png
TIMEOUT 50 TIMEOUT 50
DEFAULT $DIST 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 WIDTH 78
MENU MARGIN 4 MENU MARGIN 4
MENU ROWS 4 MENU ROWS 4
@ -1852,15 +1898,15 @@ LABEL $DIST
MENU LABEL $DIST Linux MENU LABEL $DIST Linux
LINUX ../vmlinuz-$KERNEL LINUX ../vmlinuz-$KERNEL
APPEND root=$ROOT_PART_ID $([[ $LUKS_DEV ]] && printf "%s " "$LUKS_DEV")rw 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 LABEL ${DIST}fallback
MENU LABEL $DIST Linux Fallback MENU LABEL $DIST Linux Fallback
LINUX ../vmlinuz-$KERNEL LINUX ../vmlinuz-$KERNEL
APPEND root=$ROOT_PART_ID $([[ $LUKS_DEV ]] && printf "%s " "$LUKS_DEV")rw 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 #LABEL grub2
#MENU LABEL Grub2 #MENU LABEL Grub2
@ -1882,7 +1928,7 @@ install_bootloader()
ROOT_PART_ID="$ROOT_PART" ROOT_PART_ID="$ROOT_PART"
elif [[ $BOOTLDR == 'syslinux' ]]; then elif [[ $BOOTLDR == 'syslinux' ]]; then
ROOT_PART_ID="UUID=$(blkid -s UUID -o value $ROOT_PART)" 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)" ROOT_PART_ID="PARTUUID=$(blkid -s PARTUUID -o value $ROOT_PART)"
fi fi
@ -1902,8 +1948,8 @@ install_bootloader()
find $MNT/boot/ -name 'syslinux*' -exec rm -rf '{}' \; >/dev/null 2>&1 find $MNT/boot/ -name 'syslinux*' -exec rm -rf '{}' \; >/dev/null 2>&1
fi fi
prerun_$BOOTLDR
printf "Installing and setting up $BOOTLDR\n" printf "Installing and setting up $BOOTLDR\n"
prerun_$BOOTLDR
chrun "${BCMDS[$BOOTLDR]}" 2>$ERR chrun "${BCMDS[$BOOTLDR]}" 2>$ERR
errshow 1 "${BCMDS[$BOOTLDR]}" errshow 1 "${BCMDS[$BOOTLDR]}"
@ -1913,9 +1959,20 @@ install_bootloader()
rm -rf $MNT/hostrun >/dev/null 2>&1 rm -rf $MNT/hostrun >/dev/null 2>&1
fi 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 mkdir -pv $MNT/boot/EFI/BOOT
cp -fv $MNT/boot/EFI/$DIST/grubx64.efi $MNT/boot/EFI/BOOT/BOOTX64.EFI 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 fi
return 0 return 0