Subject: Re: bug#66560: [DOCUMENTATION] doc: Include steps for mounting EFI partitions.

From: Maxim Cournoyer <[email-masked]>
Date: Tue, 31 Oct 2023 13:54:26 -0400

Hi!

Thanks for attempting to improve the documentation!

Christina O'Donnell <[email-masked]> writes:

> This patch ammends the Chrooting section of the Guix manual to help EFI users
> who have misconfigured their bootloader. This was neccessary for me after the
> first couple botched installation attempts.
>
> * doc/guix.texi (Chrooting into an existing system): Add missing mounts for
> repairing broken EFI partitions.
> ---
>  doc/guix.texi | 32 ++++++++++++++++++++++++++++++--
>  1 file changed, 30 insertions(+), 2 deletions(-)
>
> diff --git a/doc/guix.texi b/doc/guix.texi
> index 3517c95251..72909fc0cb 100644
> --- a/doc/guix.texi
> +++ b/doc/guix.texi
> @@ -3046,8 +3046,36 @@ Chrooting into an existing system
>  mount --rbind /dev /mnt/dev
>  @end example
>  
> -If your system is EFI-based, you must also mount the ESP partition.
> -Assuming it is @file{/dev/sda1}, you can do so with:
> +@item
> +There are a few more steps for those who are on EFI-based systems. If
> +you're using another bootloader method then you may safely skip these.
> +They are adapted from @url{https://wiki.debian.org/GrubEFIReinstall, a
> +page on the Debian Wiki}.

It seems odd to use an item entry like the above; I'd use nested
enumeration at that point instead.

> +@item
> +Verify that you are booting in from UEFI by checking that
> +@file{/sys/firmware/efi} isn't empty.

If you look at the latest manual, this should not be empty since mount
--rbind is used (the 'r' in the name is for recursive) for the whole
/sys directory:

          mount --rbind /proc /mnt/proc
          mount --rbind /sys /mnt/sys
          mount --rbind /dev /mnt/dev

> +@item
> +If the directory @file{/sys/firmware/efi/efivars} is empty, you need to
> +boot the rescue system including the kernel option "efi=runtime" and
> +mount the EFI variables before proceeding:
> +
> +@example sh
> +mount -t efivarfs none /sys/firmware/efi/efivars
> +@end example

Maybe the only information missing here is the "if empty, run with
"efi=runtime" bit?  Also note that the latest version of the manually
mentions using Guix System rather than another live rescue image, so
perhaps it just wouldn't happen then?  It seems we assume that
/sys/firmware/efi exists for UEFI systems in the documentation
elswehere, without having to mention that "efi=runtime" bit, so I'm
inclined to think it's not necessary for Guix System.

> +@item
> +If your bootloader installation failed, you may need to bind
> +@file{efivars} between the two systems.
> +
> +@example sh
> +mount --bind /sys/firmware/efi/efivars /mnt/sys/firmware/efi/efivars
> +@end example

This should be covered by the --rbind, asusming the host contains
/sys/firmware/efi/efivars.

So I think we don't need to change anything to the manual.  If the
"efi=runtime" advice is truly useful even on Guix System, we could
mention it like so:

--8<---------------cut here---------------start------------->8---
modified   doc/guix.texi
@@ -43075,6 +43075,11 @@ Chrooting into an existing system
 mount /dev/sda1 /mnt/boot/efi
 @end example
 
+If using an EFI-based system, also make sure that the directory
+@file{/sys/firmware/efi/efivars} is @emph{not} empty.  If it is empty,
+you will need to reboot your rescue system with the kernel option
+@option{efi=runtime} and redo the steps from the beginning.
+
 @item
 Enter your system via chroot:
--8<---------------cut here---------------end--------------->8---

-- 
Thanks,
Maxim