diff --git a/config/grub/config/grub.cfg b/config/grub/config/grub.cfg index f6b5a193..1511d524 100644 --- a/config/grub/config/grub.cfg +++ b/config/grub/config/grub.cfg @@ -90,6 +90,11 @@ function search_isolinux { done echo # Insert newline } + +function try_without_config { + +} + menuentry 'Load Operating System (incl. fully encrypted disks) [o]' --hotkey='o' { if [ "${grub_scan_disk}" != "ata" ]; then @@ -146,31 +151,104 @@ menuentry 'Load Operating System (incl. fully encrypted disks) [o]' --hotkey='o try_user_config "${vol}" done - if [ "${grub_scan_disk}" != "ata" ]; then - # Last resort, if all else fails - 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 + # bruteforce as a last result. figure out how to boot + # linux without a grub configuration file. (crypto and lvm unsupported) + set vmlinuz="" + set initrd="" + set devtype="" + set devnum="" + set devletter="" + set partnum="" + for t in ata ahci; do + set vmlinuz="" + set initrd="" + if [ "${t}" = "ata" ] && [ "${grub_scan_disk}" = "ahci" ]; then + continue + elif [ "${t}" = "ahci" ] && [ "${grub_scan_disk}" = "ata" ]; then + continue + fi + for dev in 0 1 2 3 4 5 6 7 8; do + for part in 1 2 3 4 5 6 7 8 9; do + set root="${t}${devnum},${partnum}" + set devnum="${dev}" + set partnum="${part}" + for k in /vmlinuz* @/vmlinuz*; do + if [ ! -f "${k}" ] || [ ! -d /boot ]; then + continue + fi + set vmlinuz="${k}" + # do not break. if furthe rentries are + # available, due to alphabetic sorting, + # the next entry is likely a newer + # kernel version + done + for k in /boot/vmlinuz* @/boot/vmlinuz*; do + if [ "${vmlinuz}" != "" ]; then + break + fi + set vmlinuz="${k}" + done + if [ "${vmlinuz}" = "" ]; then + continue fi + for i in /initrd* /initramfs* @/initrd* @/initramfs*; do + if [ ! -f "${i}" ] || [ ! -d "/boot" ]; then + continue + done + set initrd="${i}" + # ditto. do not break yet + done + for i in /boot/initrd* /boot/initramfs* @/boot/initrd* @/boot/initramfs*; do + if [ "${initrd}" != "" ]; then + break + fi + set initrd="${i}" + done + if [ "${vmlinuz}" != "" ] && [ "${initrd}" != "" ]; then + set devtype="${t}" + break + fi + set vmlinuz="" + set initrd="" + done + if [ "${vmlinuz}" != "" ] && [ "${initrd}" != "" ]; then + break fi done - fi + if [ "${vmlinuz}" != "" ] && [ "${initrd}" != "" ]; then + break + fi + done - if [ "${grub_scan_disk}" != "ahci" ]; then - # Last resort (for setups that use IDE instead of SATA) - set root=ata0,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 + if [ "${vmlinuz}" = "" ] || [ "${initrd}" = "" ]; then + return fi + if [ "${devnum}" = "0" ]; then + set devletter="a" + elif [ "${devnum}" = "1" ]; then + set devletter="b" + elif [ "${devnum}" = "2" ]; then + set devletter="c" + elif [ "${devnum}" = "3" ]; then + set devletter="d" + elif [ "${devnum}" = "4" ]; then + set devletter="e" + elif [ "${devnum}" = "5" ]; then + set devletter="f" + elif [ "${devnum}" = "6" ]; then + set devletter="g" + elif [ "${devnum}" = "7" ]; then + set devletter="h" + elif [ "${devnum}" = "8" ]; then + set devletter="i" + fi + set btrfsvol="" + if [ "${vmlinuz#@}" != "${vmlinuz}" ]; then + set btrfsvol="rootflags=subvol=@" + fi + set root="${devtype}${devnum},${partnum}" + linux ${vmlinuz} root=/dev/sd${devletter}${partnum} ${btrfsvol} rw + initrd ${initrd} true # Prevent pager requiring to accept each line instead of whole screen }