Ubuntu – How to install grub for UEFI in legacy mode

grub2uefiusb

My laptop has no CD-ROM. So I use YUMI to create a bootable USB stick, which seems not support UEFI.

I use legacy mode boot from USB and finish install ubuntu(Only one OS). Now I want to switch to UEFI mode. How to? The official doc says that use livecd from UEFI mode and use boot-repair. But I have no CD-ROM, and USB stick not support UEFI. I can't use this way.

I've already created esp and use GPT, but how to install grub UEFI in legacy mode, any way?

~$ sudo gdisk -l /dev/sda
GPT fdisk (gdisk) version 0.8.8

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
Disk /dev/sda: 41943040 sectors, 20.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): E9A1D023-63F1-4014-A152-2C5741B77981
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 41943006
Partitions will be aligned on 2048-sector boundaries
Total free space is 4029 sectors (2.0 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         1026047   500.0 MiB   EF00  
   2         1026048        41940991   19.5 GiB    8300  

~$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda2 during installation
UUID=d2f2277b-478f-48af-96eb-cc0ee071d0fe /               xfs     defaults        0       1
# /boot/efi was on /dev/sda1 during installation
UUID=E432-31B3  /boot/efi       vfat    utf8,umask=007,gid=46 0       1

Best Answer

First, one question is why you want to switch to EFI-mode booting. Based on your gdisk output, it looks like you've got a single-OS installation, so you don't seem to need to coexist with something else. If you can boot in BIOS/CSM/legacy mode already, why switch? As the saying goes, "if it ain't broke, don't fix it." (OTOH, I see no BIOS Boot Partition, so maybe you can't currently boot in BIOS mode....)

Supposing you have a reason to boot in EFI mode, though, let's start at the beginning....

YUMI is not the only tool for creating a bootable USB flash drive. You can also do it with dd, UNetbootin, Startup Disk Creator, Rufus, and other tools. All of the tools I've named are capable of creating an EFI-bootable USB flash drive, with the caveat that EFI implementations differ, so what works on one might not work on another. Some tools also have options that can affect how well a created disk will work, either in general or on a specific EFI. Thus, creating your installation disk with another tool should enable you to boot it in EFI mode (assuming, of course, that your computer uses an EFI rather than a traditional BIOS). That said, if you've already installed, re-creating your boot medium and re-installing is overkill....

If you have no other bootable OS on the computer, one solution is to install an EFI boot loader as EFI/BOOT/bootx64.efi on the EFI System Partition (ESP; your /dev/sda1). This is easily done if you're installing by hand, but if you're using a tool like grub-install, you'll have to move files around manually after the fact. Specifically, the EFI version of grub-install will put GRUB in EFI/ubuntu/grubx64.efi (perhaps with shimx64.efi in the same directory). You'll have to copy files to the right location to get them to launch when you boot the computer. If Secure Boot is inactive, copy EFI/ubuntu/grubx64.efi to EFI/BOOT/bootx64.efi. You might also need to copy EFI/ubuntu/grub.cfg to EFI/BOOT/grub.cfg, too. If Secure Boot is active, it gets more complex; you must copy shimx64.efi to EFI/BOOT/bootx64.efi and copy grubx64.efi to EFI/BOOT/grubx64.efi. (Note that all these filenames are relative to the ESP's root, so if you were to mount partitions as shown in your /etc/fstab, you must add /boot/efi/ to the start of each path.) With a boot loader installed to EFI/BOOT/bootx64.efi and nothing else referenced in the NVRAM entries, your computer should boot from that "fallback" filename.

Another option is to prepare an Ubuntu installer using one of the tools I mentioned earlier, then boot it in EFI mode. With that done, you should be able to run Boot Repair in EFI mode, so it should be able to set up GRUB in that mode. In fact, even in BIOS mode, Boot Repair should be able to copy EFI files as described in the previous paragraph. (I'm not sure how well this works in practice, though; Boot Repair might just try to do a BIOS-mode repair and not attempt to set up an EFI fallback boot loader.)

Yet another option is to use my rEFInd boot manager to get the process started. You can download the CD-R or USB flash drive version of rEFInd and boot from it. rEFInd should detect your Linux kernel(s) and enable you to boot. If this works, you'll be booted in EFI mode, and you can then install the rEFInd PPA or Debian package to use it permanently (without the USB drive); or you can install GRUB via grub-install and it should set things up correctly. (Note that you'll need the EFI GRUB package, grub-efi, installed for grub-install to set up the EFI version of GRUB.) Whether you install rEFInd or GRUB in this way, it will be able to set up an EFI NVRAM entry, since the boot from the rEFInd USB drive will be into EFI mode, thus enabling the OS to add EFI NVRAM variables.

Related Question