From ba6b880a5c268ef3b60db50ded424c041ac57a0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Ferr=C3=A3o?= <2031761+viniciusferrao@users.noreply.github.com> Date: Wed, 26 Aug 2026 17:25:01 -0300 Subject: [PATCH] refactor(install): make RISC-V EFI fix-up testable --- .../xcat/install/scripts/post.rhels10.riscv64 | 43 +++++++++++-------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/xCAT-server/share/xcat/install/scripts/post.rhels10.riscv64 b/xCAT-server/share/xcat/install/scripts/post.rhels10.riscv64 index 09245064c..3ede6003f 100644 --- a/xCAT-server/share/xcat/install/scripts/post.rhels10.riscv64 +++ b/xCAT-server/share/xcat/install/scripts/post.rhels10.riscv64 @@ -1,3 +1,4 @@ +#!/bin/sh # riscv64 UEFI boot entry fix-up for EL10 kickstart installs. # # The EL10 anaconda has no RISC-V EFI platform: it asks for the x86 boot @@ -9,43 +10,49 @@ # stub next to it, so point the boot entry at that image and also place the # removable-media fallback loader \EFI\BOOT\BOOTRISCV64.EFI for firmware # without usable NVRAM entries. Runs in the installed system chroot. -if [ "$(uname -m)" = "riscv64" ] && [ -d /boot/efi/EFI ]; then +xcat_riscv_install_root=${XCAT_INSTALL_ROOT:-} +xcat_riscv_uname=${XCAT_UNAME:-uname} +xcat_riscv_efibootmgr=${XCAT_EFIBOOTMGR:-efibootmgr} +xcat_riscv_findmnt=${XCAT_FINDMNT:-findmnt} +xcat_riscv_lsblk=${XCAT_LSBLK:-lsblk} + +if [ "$("$xcat_riscv_uname" -m)" = "riscv64" ] && [ -d "$xcat_riscv_install_root/boot/efi/EFI" ]; then grubefi="" - for candidate in /boot/efi/EFI/*/grubriscv64.efi; do + for candidate in "$xcat_riscv_install_root"/boot/efi/EFI/*/grubriscv64.efi; do [ -f "$candidate" ] || continue grubefi="$candidate" break done if [ -n "$grubefi" ]; then vendordir="$(basename "$(dirname "$grubefi")")" - mkdir -p /boot/efi/EFI/BOOT - cp -f "$grubefi" /boot/efi/EFI/BOOT/BOOTRISCV64.EFI - echo "riscv64: installed \\EFI\\BOOT\\BOOTRISCV64.EFI from \\EFI\\$vendordir\\grubriscv64.efi" - if command -v efibootmgr >/dev/null 2>&1 && efibootmgr >/dev/null 2>&1; then - espdev="$(findmnt -no SOURCE /boot/efi 2>/dev/null)" + mkdir -p "$xcat_riscv_install_root/boot/efi/EFI/BOOT" + cp -f "$grubefi" "$xcat_riscv_install_root/boot/efi/EFI/BOOT/BOOTRISCV64.EFI" + printf '%s\n' "riscv64: installed \\EFI\\BOOT\\BOOTRISCV64.EFI from \\EFI\\$vendordir\\grubriscv64.efi" + if command -v "$xcat_riscv_efibootmgr" >/dev/null 2>&1 && "$xcat_riscv_efibootmgr" >/dev/null 2>&1; then + espdev="$("$xcat_riscv_findmnt" -no SOURCE "$xcat_riscv_install_root/boot/efi" 2>/dev/null)" # lsblk pads its output, and efibootmgr wants bare values - disk="$(lsblk -no PKNAME "$espdev" 2>/dev/null | head -1 | tr -d '[:space:]')" - part="$(lsblk -no PARTN "$espdev" 2>/dev/null | head -1 | tr -d '[:space:]')" + disk="$("$xcat_riscv_lsblk" -no PKNAME "$espdev" 2>/dev/null | head -1 | tr -d '[:space:]')" + part="$("$xcat_riscv_lsblk" -no PARTN "$espdev" 2>/dev/null | head -1 | tr -d '[:space:]')" if [ -n "$disk" ] && [ -n "$part" ]; then # drop the x86 entries anaconda created for this install, and any # riscv64 entry a previous provisioning of this node left behind, so # reinstalling does not fill the firmware variable store with copies - for bootnum in $(efibootmgr -v 2>/dev/null | awk '/\\EFI\\[^\\]+\\(shimx64|grubx64|grubriscv64)\.efi/ { sub(/^Boot/, "", $1); sub(/\*$/, "", $1); print $1 }'); do - efibootmgr -q -b "$bootnum" -B || true + for bootnum in $("$xcat_riscv_efibootmgr" -v 2>/dev/null | awk '/\\EFI\\[^\\]+\\(shimx64|grubx64|grubriscv64)\.efi/ { sub(/^Boot/, "", $1); sub(/\*$/, "", $1); print $1 }'); do + "$xcat_riscv_efibootmgr" -q -b "$bootnum" -B || true done - label="$(. /etc/os-release 2>/dev/null; echo "${NAME:-Linux}")" - if efibootmgr -q -c -d "/dev/$disk" -p "$part" -L "$label" -l "\\EFI\\$vendordir\\grubriscv64.efi"; then - echo "riscv64: UEFI boot entry \"$label\" -> \\EFI\\$vendordir\\grubriscv64.efi on /dev/$disk part $part" + label="$(. "$xcat_riscv_install_root/etc/os-release" 2>/dev/null; echo "${NAME:-Linux}")" + if "$xcat_riscv_efibootmgr" -q -c -d "/dev/$disk" -p "$part" -L "$label" -l "\\EFI\\$vendordir\\grubriscv64.efi"; then + printf '%s\n' "riscv64: UEFI boot entry \"$label\" -> \\EFI\\$vendordir\\grubriscv64.efi on /dev/$disk part $part" else - echo "riscv64: efibootmgr could not create the boot entry; the firmware will use \\EFI\\BOOT\\BOOTRISCV64.EFI" + printf '%s\n' "riscv64: efibootmgr could not create the boot entry; the firmware will use \\EFI\\BOOT\\BOOTRISCV64.EFI" fi else - echo "riscv64: could not determine the ESP disk/partition; the firmware will use \\EFI\\BOOT\\BOOTRISCV64.EFI" + printf '%s\n' "riscv64: could not determine the ESP disk/partition; the firmware will use \\EFI\\BOOT\\BOOTRISCV64.EFI" fi else - echo "riscv64: efibootmgr unavailable; the firmware will use \\EFI\\BOOT\\BOOTRISCV64.EFI" + printf '%s\n' "riscv64: efibootmgr unavailable; the firmware will use \\EFI\\BOOT\\BOOTRISCV64.EFI" fi else - echo "riscv64: no \\EFI\\*\\grubriscv64.efi on the ESP; is grub2-efi-riscv64 in the package list?" + printf '%s\n' "riscv64: no \\EFI\\*\\grubriscv64.efi on the ESP; is grub2-efi-riscv64 in the package list?" fi fi