summaryrefslogtreecommitdiff
path: root/mkgrub.sh
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2025-04-11 06:18:57 +0000
committerCoprDistGit <infra@openeuler.org>2025-04-11 06:18:57 +0000
commitff0827b72e6d4046af41c35eeb25a6ac7216feb7 (patch)
tree924ca3e18b7a334a992bd44959f5129f221634f8 /mkgrub.sh
parent2f8d928a90ba84e9d782a9d2a9a8cc904fdee7c3 (diff)
Diffstat (limited to 'mkgrub.sh')
-rw-r--r--mkgrub.sh97
1 files changed, 97 insertions, 0 deletions
diff --git a/mkgrub.sh b/mkgrub.sh
new file mode 100644
index 0000000..7e8bdd7
--- /dev/null
+++ b/mkgrub.sh
@@ -0,0 +1,97 @@
+#!/bin/bash
+
+# DISTRO directory overrides. Pass these vars in from outside:
+# export SYSLINUX_DIR=/usr/share/...;./mkgrub.sh
+[[ -z "$SYSLINUX_DIR" ]] && SYSLINUX_DIR="/usr/share/syslinux"
+[[ -z "$GRUB2_MOD_DIR" ]] && GRUB2_MOD_DIR="/usr/lib/grub"
+
+BOOTLOADERS_DIR="/var/lib/cobbler/loaders"
+TARGETS="arm64-efi i386-pc-pxe powerpc-ieee1275 x86_64-efi"
+
+rm -rf "${BOOTLOADERS_DIR}/.cobbler_postun_cleanup"
+
+# grub2 internal executable naming
+# aarch64 => grubaa64.efi
+# x86_64 => grubx64.efi
+# i386/i686 => bootia32.efi
+# IA64 => bootia64.efi
+# arm => bootarm.efi
+
+FS_MODULES="btrfs ext2 xfs jfs reiserfs"
+CD_MODULES=" all_video boot cat configfile echo true \
+ font gfxmenu gfxterm gzio halt iso9660 \
+ jpeg minicmd normal part_apple part_msdos part_gpt \
+ password_pbkdf2 png reboot search search_fs_uuid \
+ search_fs_file search_label sleep test video fat loadenv linux"
+PXE_MODULES="tftp http"
+CRYPTO_MODULES="luks gcry_rijndael gcry_sha1 gcry_sha256"
+MISC_MODULES="mdraid09 mdraid1x lvm serial regexp tr"
+
+TARGET_EXTRA_MODULES=""
+
+function link_loader
+{
+ local T="$1"
+ local L="$2"
+
+ if [[ -e "$T" ]] && [[ ! -e "${BOOTLOADERS_DIR}/$L" ]];then
+ set -x
+ ln -s "$T" "${BOOTLOADERS_DIR}/$L"
+ set +x
+ # Remember links for later deletion/cleanups
+ echo "$L" >> "${BOOTLOADERS_DIR}/.cobbler_postun_cleanup"
+ fi
+}
+
+
+mkdir -p "${BOOTLOADERS_DIR}/grub"
+for TARGET in $TARGETS;do
+ TARGET_MOD_DIR="$TARGET"
+ case $TARGET in
+ i386-pc-pxe)
+ # Name the x86 PXE executble with .0 in the end
+ # pxelinux.0 only wants to chainload bootloaders ending with .0
+ BINARY="grub.0"
+ TARGET_EXTRA_MODULES="chain pxe biosdisk"
+ # For i386-pc-pxe target the modules dir still is i386-pc
+ TARGET_MOD_DIR="i386-pc"
+ ;;
+ x86_64-efi)
+ TARGET_EXTRA_MODULES="chain efinet"
+ BINARY="grubx64.efi"
+ ;;
+ arm64-efi)
+ TARGET_EXTRA_MODULES="efinet"
+ BINARY="grubaa64.efi"
+ ;;
+ powerpc-ieee1275)
+ TARGET_EXTRA_MODULES="net ofnet"
+ BINARY="grub.ppc64le"
+ ;;
+ esac
+ GRUB_MODULES="${CD_MODULES} ${FS_MODULES} ${PXE_MODULES} ${CRYPTO_MODULES} ${MISC_MODULES} ${TARGET_EXTRA_MODULES}"
+ [ "$TARGET" == "x86_64-efi" ] && GRUB_MODULES=$(for file in $(ls /usr/lib/grub/x86_64-efi/*.mod); do basename ${file} | sed "s/\.mod//"; done)
+ MODULE_DIR="${GRUB2_MOD_DIR}/${TARGET_MOD_DIR}"
+ set -x
+ grub2-mkimage -O ${TARGET} -o "${BOOTLOADERS_DIR}/grub/${BINARY}" --prefix= ${GRUB_MODULES}
+ set +x
+ echo "grub2/${BINARY}" >> "${BOOTLOADERS_DIR}/.cobbler_postun_cleanup"
+ if [[ -e "$MODULE_DIR" ]] && [[ ! -e "${BOOTLOADERS_DIR}/grub/$TARGET_MOD_DIR" ]];then
+ set -x
+ ln -s "$MODULE_DIR" "${BOOTLOADERS_DIR}/grub/$TARGET_MOD_DIR"
+ set +x
+ echo "$TARGET_MOD_DIR" >> "${BOOTLOADERS_DIR}/.cobbler_postun_cleanup"
+ fi
+
+done
+
+link_loader "/usr/share/efi/x86_64/shim.efi" "grub/shim.efi"
+link_loader "/usr/share/efi/x86_64/grub.efi" "grub/grub.efi"
+link_loader "${SYSLINUX_DIR}/pxelinux.0" "pxelinux.0"
+link_loader "${SYSLINUX_DIR}/menu.c32" "menu.c32"
+link_loader "${SYSLINUX_DIR}/ldlinux.c32" "ldlinux.c32"
+link_loader "${SYSLINUX_DIR}/memdisk" "memdisk"
+# ToDo: Do this properly if still used
+link_loader "/usr/share/*pxe/undionly.kpxe" "undionly.pxe"
+link_loader "${SYSLINUX_DIR}/lpxelinux.0" "lpxelinux.0"
+link_loader "${SYSLINUX_DIR}/libutil.c32" "libutil.c32"