function switch_to_grub_config { set root="${1}" # a) Check possible file locations... for p in boot/grub/coreboot_ grub/coreboot_ boot/grub/libreboot_ grub/libreboot_ boot/grub/autoboot_ grub/autoboot_ boot/grub/ grub/ boot/grub2/ grub2/; do if [ -f "/${p}grub.cfg" ]; then # b) And eventually try to load the config. Using ESC one can still exit and revert back to # libreboot's menu. configfile /${p}grub.cfg fi done } function parse_isolinux_config { set root=${1} for p in /isolinux /syslinux; do if [ -f "${p}${p}.cfg" ]; then syslinux_configfile -i ${p}${p}.cfg elif [ -f "/boot${p}${p}.cfg" ]; then syslinux_configfile -i /boot${p}${p}.cfg fi done } menuentry 'Load Operating System (incl. fully encrypted disks) [o]' --hotkey='o' { # GRUB handles (almost) every possible disk setup, but only the location of /boot is actually important, # since GRUB only loads the user's config. As soon as the kernel takes over, libreboot's done. # filesystems and encryption on both raw devices and partitions in all various combinations # need to be supported. Since full disk encryption is possible with GRUB as payload and probably desired/used # by most users, libreboot GRUB config tries to load the operating system (kernel) in the following way: # Try to decrypt raw devices first. This inside a LUKS container is pretty common # prompt user for passphrase if LUKS header is found cryptomount ahci0 for j in 1 2 3 4 5 6 7 8 9; do cryptomount ahci0,${j} done # 2. Look for user config. If the above routine successfully decrypted a LUKS container, its content # will be searched before everything else for obvious reasons. Regardless of this, the devices' # hirachy stays the same. for d in crypto0 ahci0; do switch_to_grub_config ${d} done for j in 1 2 3 4 5 6 7 8 9; do for d in crypto0 ahci0; do switch_to_grub_config "${d},${j}" done done for l in lvm/matrix-root lvm/matrix-boot; do switch_to_grub_config ${l} done # prompt user for passphrase if LUKS header is found but try using external keyfiles first search -n -f /keyfile --set=kf --hint usb0, --hint usb1, if [ $? = 0 ]; then kf="-k (${kf})/keyfile ${d}" fi for d in ${devs}; do cryptomount ${kf} ${d} done # 3. Do the same routine again, but for possibly decrypted data this time. switch_to_grub_config crypto0 for j in 1 2 3 4 5 6 7 8 9; do switch_to_grub_config "crypto0,${j}" done for l in lvm/matrix-root lvm/matrix-boot; do switch_to_grub_config ${l} done # 3. Last resort, if none of the above succeeds, all you have is GRUB's shell set root=ahci0,1 for p in / /boot/; do if [ -f "${p}vmlinuz" ]; then linux ${p}vmlinuz root=/dev/sda1 rw if [ -f "${p}initrd.img" ]; then initrd ${p}initrd.img fi fi done } menuentry 'Parse ISOLINUX menu (AHCI) [a]' --hotkey='a' { # Check for filesystem on raw device without partition table (MBR/GPT), e.g. BTRFS or ZFS parse_isolinux_config ahci0 # Look for partitions # GPT allows more than 4 partitions, /boot on /dev/sda7 is quite unlikely but still possible for j in 1 2 3 4 5 6 7 8 9; do parse_isolinux_config "ahci0,${j}" done } menuentry 'Parse ISOLINUX menu (USB) [u]' --hotkey='u' { for i in 0 1; do # Check for filesystem on raw device without partition table (MBR/GPT), e.g. BTRFS or ZFS parse_isolinux_config usb${i} # Look for partitions # GPT allows more than 4 partitions, /boot on /dev/sda7 is quite unlikely but still possible for j in 1 2 3 4 5 6 7 8 9; do parse_isolinux_config "usb${i},${j}" done done } menuentry 'Parse ISOLINUX menu (CD/DVD) [d]' --hotkey='d' { insmod ata for x in ata0 ahci1; do parse_isolinux_config ${x} done } menuentry 'Switch to grubtest.cfg [t]' --hotkey='t' { set root=cbfsdisk configfile /grubtest.cfg } menuentry 'Search for GRUB configuration (grub.cfg) outside of CBFS [s]' --hotkey='s' { insmod ahci insmod usbms insmod part_msdos insmod part_gpt for x in (ahci0,1) (ahci0,2) (ahci0,3) (ahci0,4) (usb0) (usb0,1) (usb0,2) (usb0,3) (usb0,4); do if [ -f "$x/grub/grub.cfg" ] ; then submenu "Load Config from $x" $x { root=$2 source /grub/grub.cfg unset superusers } fi if [ -f "$x/boot/grub/grub.cfg" ] ; then submenu "Load Config from $x" $x { root=$2 source /boot/grub/grub.cfg unset superusers } fi if [ -f "$x/grub2/grub.cfg" ] ; then submenu "Load Config from $x" $x { root=$2 source /grub2/grub.cfg unset superusers } fi if [ -f "$x/boot/grub2/grub.cfg" ] ; then submenu "Load Config from $x" $x { root=$2 source /boot/grub2/grub.cfg unset superusers } fi done } menuentry 'Poweroff [p]' --hotkey='p' { halt } menuentry 'Reboot [r]' --hotkey='r' { reboot }