From c8eb79aa793966ea5dd8aec49ed1df2e621c9beb Mon Sep 17 00:00:00 2001 From: Qiumiao Zhang Date: Thu, 7 Aug 2025 02:46:00 +0000 Subject: [PATCH] fix 'grub2-install --boot-directory=xxx /dev/sda' execution failure Signed-off-by: Qiumiao Zhang --- ...-check-to-enable-btrfs-relative-path.patch | 150 --------- ...orkaround-volatile-efi-boot-variable.patch | 289 ------------------ ...-install-bailout-root-device-probing.patch | 163 ---------- grub.patches | 3 - grub2.spec | 10 +- 5 files changed, 9 insertions(+), 606 deletions(-) delete mode 100644 0001-Unify-the-check-to-enable-btrfs-relative-path.patch delete mode 100644 0001-Workaround-volatile-efi-boot-variable.patch delete mode 100644 0001-grub-install-bailout-root-device-probing.patch diff --git a/0001-Unify-the-check-to-enable-btrfs-relative-path.patch b/0001-Unify-the-check-to-enable-btrfs-relative-path.patch deleted file mode 100644 index 520a5de..0000000 --- a/0001-Unify-the-check-to-enable-btrfs-relative-path.patch +++ /dev/null @@ -1,150 +0,0 @@ -From 80bb1b17b3f596dbd7331cf9cb20a46c8ef9800b Mon Sep 17 00:00:00 2001 -From: Michael Chang -Date: Sat, 22 Aug 2020 02:32:43 +0800 -Subject: [PATCH] Unify the check to enable btrfs relative path - -This unified the test in grub-install and grub-mkconfig that the path to -default or selected btrfs subvolume/snapshot is used if the root file -system is btrfs and the config has enabled btrfs snapshot booting. - -Signed-off-by: Michael Chang ---- - util/grub-install.c | 67 +++++++++++++++++++++++++++------------ - util/grub-mkconfig_lib.in | 3 +- - 2 files changed, 48 insertions(+), 22 deletions(-) - ---- a/util/grub-install.c -+++ b/util/grub-install.c -@@ -886,6 +886,7 @@ - const char *efi_file = NULL; - char **grub_devices; - grub_fs_t grub_fs; -+ grub_fs_t root_fs; - grub_device_t grub_dev = NULL; - enum grub_install_plat platform; - char *grubdir, *device_map; -@@ -898,6 +899,8 @@ - int efidir_is_mac = 0; - int is_prep = 0; - const char *pkgdatadir; -+ char *rootdir_path; -+ char **rootdir_devices; - - grub_util_host_init (&argc, &argv); - product_version = xstrdup (PACKAGE_VERSION); -@@ -911,9 +914,6 @@ - - grub_util_load_config (&config); - -- if (config.is_suse_btrfs_snapshot_enabled) -- use_relative_path_on_btrfs = 1; -- - if (!bootloader_id && config.grub_distributor) - { - char *ptr; -@@ -1064,6 +1064,45 @@ - grub_hostfs_init (); - grub_host_init (); - -+ { -+ char *rootdir_grub_devname; -+ grub_device_t rootdir_grub_dev; -+ char *t = grub_util_path_concat (2, "/", rootdir); -+ -+ rootdir_path = grub_canonicalize_file_name (t); -+ if (!rootdir_path) -+ grub_util_error (_("failed to get canonical path of `%s'"), t); -+ -+ rootdir_devices = grub_guess_root_devices (rootdir_path); -+ if (!rootdir_devices || !rootdir_devices[0]) -+ grub_util_error (_("cannot find a device for %s (is /dev mounted?)"), -+ rootdir_path); -+ -+ for (curdev = rootdir_devices; *curdev; curdev++) -+ grub_util_pull_device (*curdev); -+ -+ rootdir_grub_devname = grub_util_get_grub_dev (rootdir_devices[0]); -+ if (!rootdir_grub_devname) -+ grub_util_error (_("cannot find a GRUB drive for %s. Check your device.map"), -+ rootdir_devices[0]); -+ -+ rootdir_grub_dev = grub_device_open (rootdir_grub_devname); -+ if (! rootdir_grub_dev) -+ grub_util_error ("%s", grub_errmsg); -+ -+ root_fs = grub_fs_probe (rootdir_grub_dev); -+ if (!root_fs) -+ grub_util_error ("%s", grub_errmsg); -+ -+ if (config.is_suse_btrfs_snapshot_enabled -+ && grub_strncmp(root_fs->name, "btrfs", sizeof ("btrfs") - 1) == 0) -+ use_relative_path_on_btrfs = 1; -+ -+ free (t); -+ free (rootdir_grub_devname); -+ grub_device_close (rootdir_grub_dev); -+ } -+ - switch (platform) - { - case GRUB_INSTALL_PLATFORM_I386_EFI: -@@ -1478,8 +1517,7 @@ - debug_image); - } - -- if (config.is_suse_btrfs_snapshot_enabled -- && grub_strncmp(grub_fs->name, "btrfs", sizeof ("btrfs") - 1) == 0) -+ if (use_relative_path_on_btrfs) - { - if (!load_cfg_f) - load_cfg_f = grub_util_fopen (load_cfg, "wb"); -@@ -1670,21 +1708,13 @@ - - #ifdef __linux__ - -- if (config.is_suse_btrfs_snapshot_enabled -- && grub_strncmp(grub_fs->name, "btrfs", sizeof ("btrfs") - 1) == 0) -+ if (use_relative_path_on_btrfs) - { - char *subvol = NULL; - char *mount_path = NULL; -- char **rootdir_devices = NULL; -- char *t = grub_util_path_concat (2, "/", rootdir); -- char *rootdir_path = grub_canonicalize_file_name (t); -- -- if (rootdir_path && grub_util_is_directory (rootdir_path)) -- rootdir_devices = grub_guess_root_devices (rootdir_path); -- -- if (rootdir_devices && rootdir_devices[0]) -- if (grub_strcmp (rootdir_devices[0], grub_devices[0]) == 0) -- subvol = grub_util_get_btrfs_subvol (platdir, &mount_path); -+ -+ if (grub_strcmp (rootdir_devices[0], grub_devices[0]) == 0) -+ subvol = grub_util_get_btrfs_subvol (platdir, &mount_path); - - if (subvol && mount_path) - { -@@ -1709,11 +1739,6 @@ - } - } - -- free (t); -- free (rootdir_path); -- for (curdev = rootdir_devices; *curdev; curdev++) -- free (*curdev); -- free (rootdir_devices); - free (subvol); - free (mount_path); - } ---- a/util/grub-mkconfig_lib.in -+++ b/util/grub-mkconfig_lib.in -@@ -49,7 +49,8 @@ - - make_system_path_relative_to_its_root () - { -- if [ "x${SUSE_BTRFS_SNAPSHOT_BOOTING}" = "xtrue" ] ; then -+ if [ "x${SUSE_BTRFS_SNAPSHOT_BOOTING}" = "xtrue" ] && -+ [ "x${GRUB_FS}" = "xbtrfs" ] ; then - "${grub_mkrelpath}" -r "$1" - else - "${grub_mkrelpath}" "$1" diff --git a/0001-Workaround-volatile-efi-boot-variable.patch b/0001-Workaround-volatile-efi-boot-variable.patch deleted file mode 100644 index d64e136..0000000 --- a/0001-Workaround-volatile-efi-boot-variable.patch +++ /dev/null @@ -1,289 +0,0 @@ -From 71575829c303fe8522b46fc96b1f99f1aa4178e7 Mon Sep 17 00:00:00 2001 -From: Michael Chang -Date: Fri, 19 Mar 2021 22:58:45 +0800 -Subject: [PATCH] Workaround volatile efi boot variable - -The efi variable in Microsoft Azure virtual machine is volatile that it cannot -persist across power cycling. If we use efi variable to communicate with efi -boot manager for booting a distribution, the process would silently fail as the -default loader in the efi system partition will start to take over the process -whenever the efi variable evaporated. - -That will lead to undefined symbol error one day as the default path didn't -receive any grub update so it cannot keep up with new ABI requirement by -updated grub modules. - -The patch will try to workaround the problem by providing grub update to the -default path along with the distribution specific one. To avoid negative side -effects of inadvertently overwritting other loader intended in default path, -care must be taken to ensure that: - -1. The workaround only takes place on detected Azure virtual machine -2. The default path is not in use by shim for the secure boot ---- - Makefile.util.def | 1 + - .../osdep/basic/efi_removable_fallback.c | 26 +++ - grub-core/osdep/efi_removable_fallback.c | 5 + - .../osdep/linux/efi_removable_fallback.c | 151 ++++++++++++++++++ - include/grub/util/install.h | 3 + - util/grub-install.c | 19 +++ - 6 files changed, 205 insertions(+) - create mode 100644 grub-core/osdep/basic/efi_removable_fallback.c - create mode 100644 grub-core/osdep/efi_removable_fallback.c - create mode 100644 grub-core/osdep/linux/efi_removable_fallback.c - ---- a/Makefile.util.def -+++ b/Makefile.util.def -@@ -681,6 +681,9 @@ - common = grub-core/osdep/journaled_fs.c; - extra_dist = grub-core/osdep/basic/journaled_fs.c; - extra_dist = grub-core/osdep/linux/journaled_fs.c; -+ common = grub-core/osdep/efi_removable_fallback.c; -+ extra_dist = grub-core/osdep/basic/efi_removable_fallback.c; -+ extra_dist = grub-core/osdep/linux/efi_removable_fallback.c; - - ldadd = '$(LIBLZMA)'; - ldadd = libgrubmods.a; ---- /dev/null -+++ b/grub-core/osdep/basic/efi_removable_fallback.c -@@ -0,0 +1,26 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2013 Free Software Foundation, Inc. -+ * -+ * GRUB is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation, either version 3 of the License, or -+ * (at your option) any later version. -+ * -+ * GRUB is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with GRUB. If not, see . -+ */ -+ -+#include -+ -+const char * -+grub_install_efi_removable_fallback (const char *efidir, enum grub_install_plat platform) -+{ -+ return NULL; -+} -+ ---- /dev/null -+++ b/grub-core/osdep/efi_removable_fallback.c -@@ -0,0 +1,5 @@ -+#ifdef __linux__ -+#include "linux/efi_removable_fallback.c" -+#else -+#include "basic/efi_removable_fallback.c" -+#endif ---- /dev/null -+++ b/grub-core/osdep/linux/efi_removable_fallback.c -@@ -0,0 +1,151 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2013 Free Software Foundation, Inc. -+ * -+ * GRUB is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation, either version 3 of the License, or -+ * (at your option) any later version. -+ * -+ * GRUB is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with GRUB. If not, see . -+ */ -+ -+#include -+ -+#include -+#include -+#include -+#include -+ -+static char * -+get_dmi_id (const char *id) -+{ -+ FILE *fp; -+ char *buf = NULL; -+ size_t len = 0; -+ -+ char *dmi_entry; -+ -+ dmi_entry = grub_util_path_concat (2, "/sys/class/dmi/id", id); -+ -+ fp = grub_util_fopen (dmi_entry, "r"); -+ if (!fp) -+ { -+ free (dmi_entry); -+ return NULL; -+ } -+ -+ if (getline (&buf, &len, fp) == -1) -+ { -+ fclose (fp); -+ free (dmi_entry); -+ return NULL; -+ } -+ -+ fclose (fp); -+ free (dmi_entry); -+ return buf; -+} -+ -+ -+static struct dmi { -+ const char *id; -+ const char *val; -+} azure_dmi [3] = { -+ {"bios_vendor", "Microsoft Corporation"}, -+ {"product_name", "Virtual Machine"}, -+ {"sys_vendor", "Microsoft Corporation"}, -+}; -+ -+static int -+is_azure (void) -+{ -+ int i; -+ int n = sizeof (azure_dmi) / sizeof (struct dmi); -+ -+ for (i = 0; i < n; ++i) -+ { -+ char *val; -+ -+ val = get_dmi_id (azure_dmi[i].id); -+ if (!val) -+ break; -+ if (strncmp (val, azure_dmi[i].val, strlen (azure_dmi[i].val)) != 0) -+ { -+ free (val); -+ break; -+ } -+ free (val); -+ } -+ -+ return (i == n) ? 1 : 0; -+} -+ -+static int -+guess_shim_installed (const char *instdir) -+{ -+ const char *shim[] = {"fallback.efi", "MokManager.efi", NULL}; -+ const char **s; -+ -+ for (s = shim; *s ; ++s) -+ { -+ char *p = grub_util_path_concat (2, instdir, *s); -+ -+ if (access (p, F_OK) == 0) -+ { -+ free (p); -+ return 1; -+ } -+ free (p); -+ } -+ -+ return 0; -+} -+ -+const char * -+grub_install_efi_removable_fallback (const char *efidir, enum grub_install_plat platform) -+{ -+ char *instdir; -+ -+ if (!is_azure ()) -+ return NULL; -+ -+ instdir = grub_util_path_concat (3, efidir, "EFI", "BOOT"); -+ -+ if (guess_shim_installed (instdir)) -+ { -+ grub_util_info ("skip removable fallback occupied by shim"); -+ return NULL; -+ } -+ -+ free (instdir); -+ -+ switch (platform) -+ { -+ case GRUB_INSTALL_PLATFORM_I386_EFI: -+ return "BOOTIA32.EFI"; -+ case GRUB_INSTALL_PLATFORM_X86_64_EFI: -+ return "BOOTX64.EFI"; -+ case GRUB_INSTALL_PLATFORM_IA64_EFI: -+ return "BOOTIA64.EFI"; -+ case GRUB_INSTALL_PLATFORM_ARM_EFI: -+ return "BOOTARM.EFI"; -+ case GRUB_INSTALL_PLATFORM_ARM64_EFI: -+ return "BOOTAA64.EFI"; -+ case GRUB_INSTALL_PLATFORM_RISCV32_EFI: -+ return "BOOTRISCV32.EFI"; -+ case GRUB_INSTALL_PLATFORM_RISCV64_EFI: -+ return "BOOTRISCV64.EFI"; -+ default: -+ grub_util_error ("%s", _("You've found a bug")); -+ break; -+ } -+ return NULL; -+} -+ ---- a/include/grub/util/install.h -+++ b/include/grub/util/install.h -@@ -303,4 +303,7 @@ - - int - grub_install_sync_fs_journal (const char *path); -+ -+const char * -+grub_install_efi_removable_fallback (const char *efidir, enum grub_install_plat platform); - #endif ---- a/util/grub-install.c -+++ b/util/grub-install.c -@@ -901,6 +901,7 @@ - const char *pkgdatadir; - char *rootdir_path; - char **rootdir_devices; -+ char *efidir_root; - - grub_util_host_init (&argc, &argv); - product_version = xstrdup (PACKAGE_VERSION); -@@ -1175,6 +1176,7 @@ - } - if (!efidir) - grub_util_error ("%s", _("cannot find EFI directory")); -+ efidir_root = grub_strdup (efidir); - efidir_device_names = grub_guess_root_devices (efidir); - if (!efidir_device_names || !efidir_device_names[0]) - grub_util_error (_("cannot find a device for %s (is /dev mounted?)"), -@@ -2217,6 +2219,23 @@ - free (grub_efi_cfg); - } - } -+ if (!removable) -+ { -+ const char *f; -+ -+ f = grub_install_efi_removable_fallback (efidir_root, platform); -+ if (f) -+ { -+ char *t = grub_util_path_concat (3, efidir_root, "EFI", "BOOT"); -+ char *dst = grub_util_path_concat (2, t, f); -+ -+ grub_install_mkdir_p (t); -+ fprintf (stderr, _("Install to %s as fallback.\n"), dst); -+ grub_install_copy_file (imgfile, dst, 1); -+ grub_free (t); -+ grub_free (dst); -+ } -+ } - if (!removable && update_nvram) - { - char * efifile_path; diff --git a/0001-grub-install-bailout-root-device-probing.patch b/0001-grub-install-bailout-root-device-probing.patch deleted file mode 100644 index 0a5c712..0000000 --- a/0001-grub-install-bailout-root-device-probing.patch +++ /dev/null @@ -1,163 +0,0 @@ -From 58dcf7985b20de876a6fc44a591aa377d0a0302c Mon Sep 17 00:00:00 2001 -From: Michael Chang -Date: Thu, 10 Feb 2022 22:16:58 +0800 -Subject: [PATCH] grub-install: bailout root device probing - -The root device is probed to test if the filesystem is btrfs in order to setup -boot configs for snapshot booting. However when the root device is a lvm thin -volume, due to lack in grub support, the probing will be errored out and entire -installation process aborts. - -Here we call out stat to bailout the situation whenever grub fails to probe -filesystem in it's own right. - - stat -f -c %T / - -The command is also used by grub-mkconfig for the same purpose. - -Signed-off-by: Michael Chang ---- - grub-core/osdep/basic/no_platform.c | 5 +++++ - grub-core/osdep/unix/platform.c | 34 +++++++++++++++++++++++++++++ - grub-core/osdep/windows/platform.c | 6 +++++ - include/grub/util/install.h | 3 +++ - util/grub-install.c | 31 ++++++++++++++++++-------- - 5 files changed, 70 insertions(+), 9 deletions(-) - ---- a/grub-core/osdep/basic/no_platform.c -+++ b/grub-core/osdep/basic/no_platform.c -@@ -51,3 +51,8 @@ - grub_util_error ("%s", _("no zIPL routines are available for your platform")); - } - -+char * -+grub_install_get_filesystem (const char *path) -+{ -+ return NULL; -+} ---- a/grub-core/osdep/unix/platform.c -+++ b/grub-core/osdep/unix/platform.c -@@ -250,3 +250,37 @@ - "-z", dest, NULL })) - grub_util_error (_("`%s' failed.\n"), PACKAGE"-zipl-setup"); - } -+ -+char * -+grub_install_get_filesystem (const char *path) -+{ -+ int fd; -+ pid_t pid; -+ FILE *fp; -+ ssize_t len; -+ char *buf = NULL; -+ size_t bufsz = 0; -+ -+ pid = grub_util_exec_pipe ((const char * []){ "stat", "-f", "-c", "%T", path, NULL }, &fd); -+ if (!pid) -+ return NULL; -+ -+ fp = fdopen (fd, "r"); -+ if (!fp) -+ return NULL; -+ -+ len = getline (&buf, &bufsz, fp); -+ if (len == -1) -+ { -+ free (buf); -+ fclose (fp); -+ return NULL; -+ } -+ -+ fclose (fp); -+ -+ if (len > 0 && buf[len - 1] == '\n') -+ buf[len - 1] = '\0'; -+ -+ return buf; -+} ---- a/grub-core/osdep/windows/platform.c -+++ b/grub-core/osdep/windows/platform.c -@@ -440,3 +440,9 @@ - { - grub_util_error ("%s", _("no zIPL routines are available for your platform")); - } -+ -+char * -+grub_install_get_filesystem (const char *path) -+{ -+ return NULL; -+} ---- a/include/grub/util/install.h -+++ b/include/grub/util/install.h -@@ -251,6 +251,9 @@ - void - grub_install_zipl (const char *d, int i, int f); - -+char * -+grub_install_get_filesystem (const char *path); -+ - int - grub_install_compress_gzip (const char *src, const char *dest); - int ---- a/util/grub-install.c -+++ b/util/grub-install.c -@@ -887,7 +887,6 @@ - const char *efi_file = NULL; - char **grub_devices; - grub_fs_t grub_fs; -- grub_fs_t root_fs; - grub_device_t grub_dev = NULL; - enum grub_install_plat platform; - char *grubdir, *device_map; -@@ -1067,8 +1066,10 @@ - grub_host_init (); - - { -- char *rootdir_grub_devname; -- grub_device_t rootdir_grub_dev; -+ grub_device_t rootdir_grub_dev = NULL; -+ char *rootdir_grub_devname = NULL; -+ char *root_fs_name = NULL; -+ - char *t = grub_util_path_concat (2, "/", rootdir); - - rootdir_path = grub_canonicalize_file_name (t); -@@ -1089,20 +1090,32 @@ - rootdir_devices[0]); - - rootdir_grub_dev = grub_device_open (rootdir_grub_devname); -- if (! rootdir_grub_dev) -- grub_util_error ("%s", grub_errmsg); -+ if (!rootdir_grub_dev) -+ { -+ root_fs_name = grub_install_get_filesystem (t); -+ if (root_fs_name) -+ grub_errno = 0; -+ } -+ else -+ { -+ grub_fs_t root_fs = grub_fs_probe (rootdir_grub_dev); -+ if (root_fs) -+ root_fs_name = grub_strdup (root_fs->name); -+ } - -- root_fs = grub_fs_probe (rootdir_grub_dev); -- if (!root_fs) -+ if (!root_fs_name) - grub_util_error ("%s", grub_errmsg); - - if (config.is_suse_btrfs_snapshot_enabled -- && grub_strncmp(root_fs->name, "btrfs", sizeof ("btrfs") - 1) == 0) -+ && root_fs_name -+ && grub_strncmp(root_fs_name, "btrfs", sizeof ("btrfs") - 1) == 0) - use_relative_path_on_btrfs = 1; - -+ free (root_fs_name); - free (t); - free (rootdir_grub_devname); -- grub_device_close (rootdir_grub_dev); -+ if (rootdir_grub_dev) -+ grub_device_close (rootdir_grub_dev); - } - - switch (platform) diff --git a/grub.patches b/grub.patches index 5f1154c..9470e26 100644 --- a/grub.patches +++ b/grub.patches @@ -91,7 +91,6 @@ Patch90: 0001-kern-mm.c-Make-grub_calloc-inline.patch Patch91: 0002-cmdline-Provide-cmdline-functions-as-module.patch Patch92: 0001-ieee1275-powerpc-implements-fibre-channel-discovery-.patch Patch93: 0002-ieee1275-powerpc-enables-device-mapper-discovery.patch -Patch94: 0001-Unify-the-check-to-enable-btrfs-relative-path.patch Patch95: 0001-efi-linux-provide-linux-command.patch Patch96: 0001-Add-support-for-Linux-EFI-stub-loading-on-aarch64.patch Patch97: 0002-arm64-make-sure-fdt-has-address-cells-and-size-cells.patch @@ -100,7 +99,6 @@ Patch99: 0004-arm-arm64-loader-Better-memory-allocation-and-error-.patch Patch100: 0006-efi-Set-image-base-address-before-jumping-to-the-PE-.patch Patch101: 0044-squash-kern-Add-lockdown-support.patch Patch102: 0001-ieee1275-Avoiding-many-unecessary-open-close.patch -Patch103: 0001-Workaround-volatile-efi-boot-variable.patch Patch104: 0001-templates-Follow-the-path-of-usr-merged-kernel-confi.patch Patch105: 0001-ieee1275-implement-FCP-methods-for-WWPN-and-LUNs.patch Patch106: 0001-arm64-Fix-EFI-loader-kernel-image-allocation.patch @@ -142,7 +140,6 @@ Patch141: 0002-Add-grub_disk_write_tail-helper-function.patch Patch142: 0003-grub-install-support-prep-environment-block.patch Patch143: 0004-Introduce-prep_load_env-command.patch Patch144: 0005-export-environment-at-start-up.patch -Patch145: 0001-grub-install-bailout-root-device-probing.patch Patch146: 0001-install-fix-software-raid1-on-esp.patch Patch147: 0001-grub-probe-Deduplicate-probed-partmap-output.patch Patch148: 0001-Fix-infinite-boot-loop-on-headless-system-in-qemu.patch diff --git a/grub2.spec b/grub2.spec index a149742..e6beeeb 100644 --- a/grub2.spec +++ b/grub2.spec @@ -23,7 +23,7 @@ Name: grub2 Epoch: 1 Version: 2.12 -Release: 41 +Release: 42 Summary: Bootloader with support for Linux, Multiboot and more License: GPLv3+ URL: http://www.gnu.org/software/grub/ @@ -464,6 +464,14 @@ fi %{_datadir}/man/man* %changelog +* Thu Aug 7 2025 zhangqiumiao - 1:2.12-42 +- Type:bugfix +- CVE:NA +- SUG:NA +- DESC:Revert 'grub-install: bailout root device probing' + Revert 'Workaround volatile efi boot variable' + Revert 'Unify the check to enable btrfs relative path' + * Tue May 27 2025 Xue Liu - 1:2.12-41 - Type:bugfix - CVE:NA -- Gitee