]> git.proxmox.com Git - proxmox-kernel-helper.git/commitdiff
add support for grub-on-esp (re)init
authorFabian Grünbichler <f.gruenbichler@proxmox.com>
Mon, 20 Nov 2023 14:09:42 +0000 (15:09 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Mon, 20 Nov 2023 16:27:20 +0000 (17:27 +0100)
init has to be explicit, re-init is auto-detected based on presense of
'proxmox' Grub EFI binary on ESP.

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
Reviewed-by: Stoiko Ivanov <s.ivanov@proxmox.com>
Tested-by: Stoiko Ivanov <s.ivanov@proxmox.com>
src/bin/proxmox-boot-tool
src/proxmox-boot/zz-proxmox-boot

index 35fb721c69f68786ee2011c785b0859d1a9c1eb5..befa2fb303027798cb96482360e599647282a240 100755 (executable)
@@ -126,6 +126,7 @@ format() {
 
 init_bootloader() {
        part="$1"
+       mode="$2"
 
        _get_partition_info "$part"
 
@@ -150,21 +151,39 @@ init_bootloader() {
        echo "Mounting '$part' on '$esp_mp'."
        mount -t vfat "$part" "$esp_mp"
 
-       if [ -d /sys/firmware/efi ]; then
-               echo "Installing systemd-boot.."
-               mkdir -p "$esp_mp/$PMX_ESP_DIR"
-               if ! command -V bootctl >/dev/null 2>&1 ;
-               then
-                       warn "E: bootctl is not available - make sure systemd-boot is installed"
-                       exit 1
+       if [ -z "$mode" ]; then
+               if [ -e "$esp_mp/EFI/proxmox/grubx64.efi" ]; then
+                       # for reinit support
+                       mode=grub
                fi
+       fi
+
+       if [ -d /sys/firmware/efi ]; then
+               if [ -n "$mode" ] && [ "$mode" = "grub" ]; then
+                       echo "Installing grub x86_64 target.."
+                       grub-install.real \
+                               --boot-directory "${esp_mp}" \
+                               --target x86_64-efi \
+                               --no-floppy \
+                               --efi-directory "${esp_mp}" \
+                               --bootloader-id 'proxmox' \
+                               "/dev/$PKNAME"
+               else
+                       echo "Installing systemd-boot.."
+                       mkdir -p "$esp_mp/$PMX_ESP_DIR"
+                       if ! command -V bootctl >/dev/null 2>&1 ;
+                       then
+                               warn "E: bootctl is not available - make sure systemd-boot is installed"
+                               exit 1
+                       fi
 
-               bootctl --graceful --path "$esp_mp" install
+                       bootctl --graceful --path "$esp_mp" install
 
-               echo "Configuring systemd-boot.."
-               echo "timeout 3" > "$esp_mp/$PMX_LOADER_CONF.tmp"
-               echo "default proxmox-*" >> "$esp_mp/$PMX_LOADER_CONF.tmp"
-               mv "$esp_mp/$PMX_LOADER_CONF.tmp" "$esp_mp/$PMX_LOADER_CONF"
+                       echo "Configuring systemd-boot.."
+                       echo "timeout 3" > "$esp_mp/$PMX_LOADER_CONF.tmp"
+                       echo "default proxmox-*" >> "$esp_mp/$PMX_LOADER_CONF.tmp"
+                       mv "$esp_mp/$PMX_LOADER_CONF.tmp" "$esp_mp/$PMX_LOADER_CONF"
+               fi
        else
                echo "Installing grub i386-pc target.."
                grub-install.real \
@@ -193,7 +212,7 @@ reinit() {
                warn "WARN: ${path} does not exist - clean '${ESP_LIST}'! - skipping"
                return
        fi
-       init_bootloader "$path"
+       init_bootloader "$path" "$mode"
 }
 
 _clean_impl() {
@@ -329,7 +348,7 @@ usage() {
                warn "  $0 format <partition> [--force]"
        fi
        if [ -z "$subcmd" ] || [ "$subcmd" = "init" ]; then
-               warn "  $0 init <partition>"
+               warn "  $0 init <partition> [grub]"
        fi
        if [ -z "$subcmd" ] || [ "$subcmd" = "reinit" ]; then
                warn "  $0 reinit"
index 43f50876366905b215cf5d991afce31bf4415240..09f9171dd562bfec6f2e083029ba9aea40d2f39f 100755 (executable)
@@ -77,7 +77,11 @@ update_esp_func() {
                { warn "creation of mountpoint ${mountpoint} failed - skipping"; return; }
        mount "${path}" "${mountpoint}" || \
                { warn "mount of ${path} failed - skipping"; return; }
-       if [ -d /sys/firmware/efi ]; then
+
+       if [ -e "${mountpoint}/EFI/proxmox/grubx64.efi" ]; then
+               grub=1
+       fi
+       if [ -d /sys/firmware/efi ] && [ "$grub" != 1 ]; then
                if [ ! -f "${mountpoint}/$PMX_LOADER_CONF" ]; then
                        warn "${path} contains no loader.conf - skipping"
                        return
@@ -91,14 +95,20 @@ update_esp_func() {
                return
        fi
        warn "Copying and configuring kernels on ${path}"
-       copy_and_config_kernels "${mountpoint}"
+       copy_and_config_kernels "${mountpoint}" "$grub"
 
        pinned_kernel=$(get_first_line "${PINNED_KERNEL_CONF}")
 
        if [ -e "${NEXT_BOOT_PIN}" ]; then
            pinned_kernel=$(get_first_line "${NEXT_BOOT_PIN}")
        fi
-       if [ -d /sys/firmware/efi ]; then
+       if [ "$grub" = 1 ]; then
+               set_grub_default "${pinned_kernel}"
+               remove_old_kernels_legacy "${mountpoint}"
+               mount --bind "${mountpoint}" "/boot"
+               update-grub
+               umount /boot
+       elif [ -d /sys/firmware/efi ]; then
                set_systemd_boot_default "${mountpoint}" "${pinned_kernel}"
                remove_old_kernels_efi "${mountpoint}"
        else
@@ -118,7 +128,7 @@ update_esp_func() {
 
 copy_and_config_kernels() {
        esp="$1"
-
+       grub="$2"
 
        for kver in ${BOOT_KVERS}; do
 
@@ -134,7 +144,7 @@ copy_and_config_kernels() {
                        continue
                fi
 
-               if [ -d /sys/firmware/efi ]; then
+               if [ -d /sys/firmware/efi ] && [ "$grub" != 1 ]; then
 
                        warn "  Copying kernel and creating boot-entry for ${kver}"
                        KERNEL_ESP_DIR="${PMX_ESP_DIR}/${kver}"