25 04 | 2012

Debian: switch to UEFI boot

Written by Tanguy

Classified in : Homepage, Debian

UEFI logo: a cube with u, e and fi written on each visible face

For those interested, here is a way to install Debian and boot it with UEFI if you have an UEFI motherboard. Using UEFI with Debian requires expert knowledge so if you do not feel up to it, keep your BIOS system.

1  Background

UEFI is a specification for motherboard's firmwares which is replacing the old BIOS. For now, UEFI motherboards still include a BIOS compatibility layer.

The UEFI boot process is quite different from the BIOS one. It involves one specific piece of the motherboard's firmware, the UEFI Boot Manager, which is able to load boot loaders from FAT file systems on specially-typed partitions. It can offer a boot menu (boot: Debian from HDD, Windows from HDD, USB stick, DVD?), which can be configured from a running operating system.

So, basically, to boot a system with UEFI, you need two things:

  • to install an UEFI boot loader on a FAT-formated EFI System Partition;
  • to tell the UEFI Boot Manager to create an entry for that boot loader.

2  Installation or preparation

If you are installing a new Debian system, read the first part. If you already have a BIOS-bootable Debian system installed, read the second one.

In both cases you will have to use Debian testing, because stable's GRUB has problems with UEFI. You can also use Debian stable while taking only GRUB from testing though.

2.1  Installation of a new Debian system

There is no installer image for UEFI, so you can either:

  • make your own, by installing an UEFI boot loader to an USB stick, which will load a regular installer kernel and initrd;
  • use a regular BIOS installer image, using the compatibility mode of your motherboard.

The installer does not provide a convenient way to install an UEFI boot loader, so you are going to install a regular BIOS boot loader at first, and switch to UEFI later.

Use the expert mode and format your hard drive with a GUID Partition Table (GPT). Create a small partition (1 MiB would be far enough), type it as a BIOS Boot Partition (this is the untitled flag above the “bootable” one in Partman), do not format it and do not mount it: this will be needed for BIOS booting. Create another small partition (same kind of size), type it as an EFI System Partition (this is the“bootable” flag), format it as FAT and mount it on /boot/efi: this will be needed for UEFI booting.

Finish the installation as usual, installing GRUB for BIOS, and boot your new system.

2.2  Preparation of an existing Debian system for UEFI

You need to use a GUID Partition Table on your hard drive. If you used an MBR, you lost; you may try to convert it to GPT using a tool such as gdisk, but that means operating without a net, loosing your current boot loader in the process.

If there is no space left on your hard drive, use Debian Live to make some. Create a small partition (1 MiB would be far enough), type it as an EFI System Partition, format it as FAT and mount it (permanently, using the fstab) on /boot/efi (that directory will not exist, so create it first).

3  Switch to GRUB UEFI

Install the package grub-efi-amd64. Prepare it by running the command (assuming your hard drive is /dev/sda):

# grub-install /dev/sda

That will do three things:

  1. generate a GRUB image;
  2. install it to the EFI partition at efi/debian/grubx64.efi (relatively to this filesystem's root, which means /boot/efi/efi/debian/grubx64.efi in absolute);
  3. try to configure the UEFI Boot Manager (the motherboard's boot menu) to load it on start-up

That last step will fail. This is expected, because the UEFI Boot Manager can only be configured from an operating system that was started from UEFI. So if you stop here, you get an unbootable system.

Now, copy (a symlink would be relevant here, but that cannot be done on a FAT file system!) the GRUB image to that other path on the EFI System Partition: efi/boot/bootx64.efi (again, relatively to the ESP filesystem's root, which means /boot/efi/efi/boot/bootx64.efi in absolute). This is where the UEFI firmware looks for a boot loader when it has not been configured for a specific path, typically on removable media. Reboot to check that…

If that trick worked, you are now on UEFI-booted system. Run grub-install again, which should now succeed to configure the UEFI Boot Manager. Reboot to check that you get a “debian” entry on the motherboard's boot menu, and remove efi/boot/bootx64.efi which is no longer needed.

26 comments

wednesday 25 april 2012 à 20:54 Simon said : #1

That would be nice to explain to readers why you think UEFI is interesting,

wednesday 25 april 2012 à 21:54 Tanguy said : #2

@Simon : The UEFI specification itself is complicated, inspired by systems such as DOS which should have been forgotten rather than taken as models, it allows for evil stuff such as vendor locking, implementations are often quite buggy, but it is already replacing BIOS in new motherboards and there may be a time when we no longer have BIOS compatibility. This time has not come yet, but when it does, if Debian (the Universal Operating System) is not prepared, it will not be installable on PCs (the most common computer platform) anymore, so it is best to start testing it now.

And for the boot process, I think it is far more clean and flexible than BIOS: instead of simply executing a hard-coded sector of the disk (which only allows to boot a single loader), it has a configured boot manager which can offer a choice between several operating systems and load regular files from a file system.

wednesday 25 april 2012 à 22:21 pingouin said : #3

Hello operator...
I thought that the kernel have a new hack to boot on uefi.
Hope the next Debian will have everything to install/boot easily with uefi motherboard.
I'm afraid to upgrade my hardware because there is no more new motherboards with classic bios.
Best.

wednesday 25 april 2012 à 22:38 Tanguy said : #4

@pingouin : I did not know that, I guess that would be something to turn the kernel itself into an EFI boot loader, although it would be strange move since such a possibility once existed for BIOS and was dropped in favor of using a dedicated boot loader (LILO, at that time, then GRUB).

For Debian, pieces are already here: Partman has a kind of support for EFI System Partitions, which is still perfectible, and GRUB does quite well with UEFI. What is missing is an integration with the Debian installer, I would say.

About hardware upgrades, I do not think you should worry for now, because new motherboards still include BIOS compatibility as far as I know.

thursday 26 april 2012 à 13:44 anonymouse said : #5

I've never seen a recommendation for an EFI System Partition to be soo small and I think it is a bit foolish to consider making it 1M. The general consensus of advice is to make it something of the order of 200M. If you will only ever use one Linux with one (nice) bootloader then you may get away with 1M for a long time to come, but if you dual boot or your bootloader changes you might well curse this decision.

Also reading the comments it seems you forgot to mention the most important reason for moving to UEFI, the ability to boot from disks >=2TiB (2TB disks are < 2TiB so they are ok).

thursday 26 april 2012 à 14:08 Tanguy said : #6

@anonymouse : 1 MiB is far enough for GRUB's core image, thanks to its modular design. Now, if you need to install other EFI stuff, such as monolithic boot loaders for other OSes, making it a bit larger would be a good idea indeed.

Now, for disks > 2 TiB, I think the only problem is that MBR cannot partition them beyont 2 TiB. But even with a BIOS, you can still use them normally as long as you partition them with GPT rather thant with MBR, can you not?

thursday 26 april 2012 à 16:01 Ben Hutchings said : #7

I've applied the EFI stub patches to Linux and they should be included in the next upload to sid (3.2.16-1).

You'll need to add a kernel postinst hook script to make this useful (copy the kernel and initrd to the EFI partition; update the boot variables). The linux-version command can help with this.

thursday 26 april 2012 à 16:15 Tanguy said : #8

@Ben Hutchings : Interesting, I am eager to see the documentation of that (for questions such as: where will it expect to find its initrd?) even if I think a flexible boot loader is preferable. So this is to load Linux directly from the UEFI without an intermediate boot loader, just as it used to be with BIOS and floppy disks in the old times, is it not? I wonder why this idea is reappearing years after it was dropped for BIOS, I guess UEFI makes it easier…

thursday 26 april 2012 à 17:50 Roderick Smith said : #9

I agree with anonymouse that 1 MiB is *WAY* too small for the ESP. Even if it's big enough now, there's too much chance that you'll need a bigger one in the future -- say, because you want to use another boot loader that requires storing the kernels on the ESP, or because you want to load EFI drivers, or because you want to dual-boot and the new OS requires more space than this. Also, the EFI specification requires that the ESP be FAT32, and IIRC, 1 MiB is too small for FAT32. (In practice, any FAT variety usually works, but the Windows 7 installer misbehaves badly if it finds anything but a FAT32 ESP. Other utilities might conceivably do the same.)

FWIW, I've done test installs of Debian in EFI mode by using an EFI boot loader to launch the installer's kernel and initial RAM disk. The process works, but it's got bugs similar to those in Ubuntu's EFI installer. The worst of these is (or was when I tested, several months ago) that it *always* erases the ESP. This means that it wipes out any existing boot loaders you might have for other OSes. The Ubuntu people claim this will be fixed with Ubuntu 12.04, but I don't know the status of this on Debian. Since Debian doesn't officially support EFI boots of its installer on x86-64 hardware, it's not really fair to call this a bug, IMHO.

One more point: In my experience, GRUB 2 is the *LEAST* reliable of the available EFI boot loaders. It's tricky to get working, on some systems it boots only some of the time, it can break at a moment's notice, and it often fails to detect other OSes. If it works in a default installation, then great; you might as well stick with it. If you have problems, though, my first advice (before even attempting to fix GRUB 2) is to switch to something else. The best is the kernel's EFI stub loader, but that's so new that it's not yet a practical choice for most people. (To be practical, it also requires either a good boot manager in the firmware, which most lack, or an ancillary boot manager like rEFInd.) ELILO was my favorite before the kernel's stub loader became available, but on some systems Fedora's patched GRUB Legacy works as well or better. You can get elilo in the Debian repositories, but not Fedora's patched GRUB Legacy. I've got a Web page with further details on all of these: http://www.rodsbooks.com/efi-bootloaders/.

friday 27 april 2012 à 07:26 Coudy said : #10

Hi,
and when I use SW raid10 created with mdadm ? Can I boot with EFI ?

friday 27 april 2012 à 08:45 Tanguy said : #11

@Roderick Smith : Nice website about UEFI, good work!

@Coudy : Sure you can, just like you can with BIOS. In that perspective, BIOS uses a fixed sector to boot, while UEFI uses a specially-typed partition, but these approaches have no fundamental differences when it comes to using software RAID.

wednesday 22 august 2012 à 16:44 Steve McIntyre said : #12

I'm working on creating Debian EFI CDs now. Test builds at

http://cdimage.debian.org/cdimage/unofficial/efi-development/

Testing and feedback welcome!

tuesday 04 september 2012 à 19:48 alexey said : #13

it seems to me you forgot "update-grub" somewhere along the way, without it I don't have .efi files - only .mod ones
not tested yet, though

saturday 13 october 2012 à 16:54 scottnyc said : #14

hey steve mcintyre thx for this, installing it now

thursday 22 november 2012 à 16:34 r.ductor said : #15

@Tanguy

Hi, thanks for this enlightening post.
I'm confused about one point:
in section 2 you write
" ... FAT and mount it on /boot/efi",
while in section 3 you mention the relative paths:
efi/boot/bootx64.efi
efi/debian/grubx64.efi

Please, could you check, and maybe give absolute paths for efi/...

Thanks

thursday 22 november 2012 à 17:01 Tanguy said : #16

@r.ductor : There is an ambiguity here, indeed. These paths are relative to the root of the EFI System Partition filesystem, which means /boot/efi/efi/{boot,debian}/… in absolute. I indicated it in my article too.

thursday 22 november 2012 à 17:11 r.ductor said : #17

Thanks! Another point: some docs mention the path where efi autodetects a boot loader efi/boot/... in capital letters, take e.g. wikipedia
"The default location for the OS loader is \EFI\BOOT\boot[architecture name].efi, where the architecture name can be e.g. IA32, X64 or IA64."
according to your post this is not mandatory, can you comment on this?

thursday 22 november 2012 à 17:32 Tanguy said : #18

@r.ductor : Well, I cannot really. I think FAT is supposed to be case insensitive, so since I hate uppercase paths, I simply use lowercase ones…

tuesday 27 november 2012 à 03:33 ebeck said : #19

I installed Grub 2 to my MBR, my bad. I don't want the pain and anguish. I will just switch the boot order in the BIOS, put the Windows Boot Manager at #1, and Win 7 boots without Grub loading at all. Screw it!!!

wednesday 06 february 2013 à 12:13 Florent said : #20

Hello,

Thx for this howto, but I have a problem at the end :

I have copy grubx64.efi on /boot/efi/EFI/boot/bootx64.efi

The motherboard's system have the entry and start grub. but when I select the kernel to load I have this error :

error couldn't terminate EFI services.
Chargement de Linux 3.2.0-4'amd64

And I need to hardreboot...

Any Idea ?

wednesday 06 february 2013 à 12:50 Florent said : #21

I have installed grub via SID and it's OK now. (Testing = NOK for me)

thursday 28 march 2013 à 19:19 Endy said : #22

Thanx Tanguy :) I was precisely trying to do that.

saturday 20 april 2013 à 08:24 Giovanni said : #23

I have a problem that seems related to this discussion but my knowledge of linux is not so deep. I would like advice.
I've installed Debian Wheezy in a SSD on a new PC with Asus P9X79 mb. I followed the automated path for partition, and I ended up with 3 partitions, swap root and probably boot. So far so good.

I removed the SSD with Debian and I inserted a HD where I installed Windows 7 from scratch. When I tried to switch back the Windows 7 HD with the Debian SSD the mb sees it but does not recognize it as bootable. Somebody tells this could happen because the MB removes from its memory the references to boots that are not found at boot time, so swapping disks can be bad.
Do you confirm ? is there a workaround (apart reinstalling all and crossing my fingers)?
Thanks, g.

monday 22 april 2013 à 09:49 Tanguy said : #24

@Giovanni : Your lead to this problem is probably correct. With UEFI, the boot entries are defined in the motherboard's flash memory during the OS installation. So, when you installed Debian, it was the only operating system available so it defined only a boot entry for itself. Then when you installed Windows to another hard disk the same thing occurred, and the (now invalid) Debian boot entry was removed. You may want to install everything to a single drive, or have both drives connected at the same time.

tuesday 14 january 2014 à 10:17 Olivier Mehani said : #25

1 MiB for /boot/efi is too small for a FAT32 system and, seemingly for a FAT16 one too. It appears that the minimum for a FAT32 system is 32MiB, but that didn't quite work for me (probably rounding to cylinder boundaries or something like that).

I ended up with a 30 MiB BIOS boot partition, and a 34.5 MiB FAT32 partition. This satisfies, at least, the partition manager.

thursday 19 june 2014 à 11:49 Milton said : #26

This helped me so much! I have bookmarked and come back to this article several times. Thank you! Thank you! Thank you!

Write a comment

What is the last letter of the word xfgfia? : 

Archives