Package: gummiboot
Version: 45-2
Severity: wishlist
Tags: patch

It would be nice if gummiboot would support installing its EFI loader 
to multiple EFI system partitions in order to gain failsafe support for 
RAID setups under UEFI. The attached patch allows (optionally) 
configuring multiple targets via GUMMIBOOT_EFI.

# gdisk -l /dev/sda
…
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          616447   300.0 MiB   EF00  EFI System
   2          616448        31457246   14.7 GiB    FD00  Linux RAID

# gdisk -l /dev/sdb
…
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          616447   300.0 MiB   EF00  EFI System
   2          616448        31457246   14.7 GiB    FD00  Linux RAID

An lvm2 volume group is on /dev/md0 (RAID1 using mdadm).

/etc/fstab:
LABEL=UEFI0     /boot/efi               vfat    auto,user,rw,quiet,umask=000    
        1 1
LABEL=UEFI1     /boot/efi1      vfat    auto,user,rw,quiet,umask=000            
1 1
/dev/vg-efi/debian64    /       ext4    defaults,relatime,errors=remount-ro     
1 1

Installing the patched gummiboot and configuring
/etc/default/gummiboot:
$ grep -v -e ^$ -e ^\# /etc/default/gummiboot
GUMMIBOOT_EFI="/boot/efi /boot/efi1"
GUMMIBOOT_ROOT="/dev/mapper/vg--efi-debian64"
GUMMIBOOT_OPTIONS="ro quiet systemd.show_status=1"

Installing gummiboot to both EFI system partitions:
# gummiboot install --path="/boot/efi"
# gummiboot install --path="/boot/efi1"
# update-gummiboot

setting up efibootmgr:
# efibootmgr -c -d /dev/sda -p 1 -l /EFI/Boot/Bootx64.efi -L "gummiboot-primary"
# efibootmgr -c -d /dev/sdb -p 1 -l /EFI/Boot/Bootx64.efi -L 
"gummiboot-secondary"
# efibootmgr -v
BootCurrent: 0000
BootOrder: 0000,0001
Boot0000* gummiboot-primary     
HD(1,800,96000,a5409805-1336-4a17-8972-4d459592080a)File(\EFI\Boot\Bootx64.efi)
Boot0001* gummiboot-secondary   
HD(1,800,96000,ac4d7872-1e4c-4b4d-903d-0037299d15ae)File(\EFI\Boot\Bootx64.efi)

Checking the contents of both configured GUMMIBOOT_EFI locations:
$ find /boot/efi /boot/efi1/ -type f | sort
/boot/efi1/EFI/Boot/bootx64.efi
/boot/efi1/EFI/gummiboot/gummibootx64.efi
/boot/efi1/f2f45aa2a06b475da40dae5565017d7a/3.14-2-amd64/initrd
/boot/efi1/f2f45aa2a06b475da40dae5565017d7a/3.14-2-amd64/linux
/boot/efi1/f2f45aa2a06b475da40dae5565017d7a/3.16-rc6-amd64/initrd
/boot/efi1/f2f45aa2a06b475da40dae5565017d7a/3.16-rc6-amd64/linux
/boot/efi1/loader/entries/f2f45aa2a06b475da40dae5565017d7a-3.14-2-amd64.conf
/boot/efi1/loader/entries/f2f45aa2a06b475da40dae5565017d7a-3.16-rc6-amd64.conf
/boot/efi1/loader/loader.conf
/boot/efi/EFI/Boot/bootx64.efi
/boot/efi/EFI/gummiboot/gummibootx64.efi
/boot/efi/f2f45aa2a06b475da40dae5565017d7a/3.14-2-amd64/initrd
/boot/efi/f2f45aa2a06b475da40dae5565017d7a/3.14-2-amd64/linux
/boot/efi/f2f45aa2a06b475da40dae5565017d7a/3.16-rc6-amd64/initrd
/boot/efi/f2f45aa2a06b475da40dae5565017d7a/3.16-rc6-amd64/linux
/boot/efi/loader/entries/f2f45aa2a06b475da40dae5565017d7a-3.14-2-amd64.conf
/boot/efi/loader/entries/f2f45aa2a06b475da40dae5565017d7a-3.16-rc6-amd64.conf
/boot/efi/loader/loader.conf

Regards
        Stefan Lippers-Hollmann
From 0239ea69e443402540613399abfddf8a3100d0f6 Mon Sep 17 00:00:00 2001
From: Stefan Lippers-Hollmann <s....@gmx.de>
Date: Fri, 25 Jul 2014 03:08:11 +0200
Subject: [PATCH 2/2] allow using multiple target locations for $GUMMIBOOT_EFI

This is useful for keeping multiple EFI system partitions in sync,
e.g. for a RAID setup using multiple disks. The EFI system partitions
must not be on the RAID array itself.

With this patch, it's possible to configure this in
/etc/default/gummiboot using this syntax:

GUMMIBOOT_EFI="/boot/efi /boot/efi1"

As before, gummiboot and efibootmgr need to be installed manually.

Signed-off-by: Stefan Lippers-Hollmann <s....@gmx.de>
---
 debian/gummiboot.postinst |  4 +++-
 debian/update-gummiboot   | 22 ++++++++++++++--------
 2 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/debian/gummiboot.postinst b/debian/gummiboot.postinst
index 02fb99e..441837e 100644
--- a/debian/gummiboot.postinst
+++ b/debian/gummiboot.postinst
@@ -12,7 +12,9 @@ if [ "$1" = "configure" -a "$2" = "" ]; then
 fi
 
 if [ "$1" = "configure" ]; then
-    gummiboot update --path="$GUMMIBOOT_EFI" || :
+    for GUMMIBOOT_EFI_TARGET in $GUMMIBOOT_EFI; do
+        gummiboot update --path="$GUMMIBOOT_EFI_TARGET" || :
+    done
 fi
 
 #DEBHELPER#
diff --git a/debian/update-gummiboot b/debian/update-gummiboot
index 055742c..560c4bc 100755
--- a/debian/update-gummiboot
+++ b/debian/update-gummiboot
@@ -29,14 +29,17 @@ determine_root() {
 }
 
 install_kernel() {
-    install -D /boot/vmlinuz-$KERNEL $GUMMIBOOT_EFI/$MACHINE_ID/$KERNEL/linux
-    if [ -e /boot/initrd.img-$KERNEL ]; then
-        install -D /boot/initrd.img-$KERNEL $GUMMIBOOT_EFI/$MACHINE_ID/$KERNEL/initrd
-    fi
+    for GUMMIBOOT_EFI_TARGET in $GUMMIBOOT_EFI; do
+        install -D /boot/vmlinuz-$KERNEL $GUMMIBOOT_EFI_TARGET/$MACHINE_ID/$KERNEL/linux
+        if [ -e /boot/initrd.img-$KERNEL ]; then
+            install -D /boot/initrd.img-$KERNEL $GUMMIBOOT_EFI_TARGET/$MACHINE_ID/$KERNEL/initrd
+        fi
+    done
 }
 
 install_entry() {
-    dir="$GUMMIBOOT_EFI/loader/entries/"
+    for GUMMIBOOT_EFI_TARGET in $GUMMIBOOT_EFI; do
+    dir="$GUMMIBOOT_EFI_TARGET/loader/entries/"
     entry="$dir/$MACHINE_ID-$KERNEL.conf"
     options="root=$GUMMIBOOT_ROOT $GUMMIBOOT_OPTIONS"
 
@@ -49,9 +52,10 @@ machine-id $MACHINE_ID
 options $options
 linux /$MACHINE_ID/$KERNEL/linux
 EOF
-    if [ -e $GUMMIBOOT_EFI/$MACHINE_ID/$KERNEL/initrd ]; then
+    if [ -e $GUMMIBOOT_EFI_TARGET/$MACHINE_ID/$KERNEL/initrd ]; then
         echo "initrd /$MACHINE_ID/$KERNEL/initrd" >> $entry
     fi
+    done
 }
 
 
@@ -77,8 +81,10 @@ do_install() {
 
 do_remove() {
     echo "Remove $KERNEL from ESP" >&2
-    rm -r $GUMMIBOOT_EFI/$MACHINE_ID/$KERNEL/ || true
-    rm $GUMMIBOOT_EFI/loader/entries/$MACHINE_ID-$KERNEL.conf || true
+    for GUMMIBOOT_EFI_TARGET in $GUMMIBOOT_EFI; do
+        rm -r $GUMMIBOOT_EFI_TARGET/$MACHINE_ID/$KERNEL/ || true
+        rm $GUMMIBOOT_EFI_TARGET/loader/entries/$MACHINE_ID-$KERNEL.conf || true
+    done
 }
 
 if [ -e /boot/vmlinuz-$KERNEL ]; then
-- 
2.0.1

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to