forked from pool/grub2
Accepting request 961057 from home:michael-chang:branches:Base:System
- Fix grub-install error when efi system partition is created as mdadm software raid1 device (bsc#1179981) (bsc#1195204) * 0001-install-fix-software-raid1-on-esp.patch - Fix riscv64 build error * 0001-RISC-V-Adjust-march-flags-for-binutils-2.38.patch - Fix error in grub-install when linux root device is on lvm thin volume (bsc#1192622) (bsc#1191974) * 0001-grub-install-bailout-root-device-probing.patch - VUL-0: grub2: grub2-once uses fixed file name in /var/tmp (bsc#1190474) (CVE-2021-46705) OBS-URL: https://build.opensuse.org/request/show/961057 OBS-URL: https://build.opensuse.org/package/show/Base:System/grub2?expand=0&rev=407
This commit is contained in:
parent
24522d5d12
commit
b873cb8d2f
47
0001-RISC-V-Adjust-march-flags-for-binutils-2.38.patch
Normal file
47
0001-RISC-V-Adjust-march-flags-for-binutils-2.38.patch
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
From 4e7de0959f3e99824d4a688398958ea022a1d023 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
|
||||||
|
Date: Sat, 29 Jan 2022 13:36:55 +0100
|
||||||
|
Subject: [PATCH] RISC-V: Adjust -march flags for binutils 2.38
|
||||||
|
|
||||||
|
As of version 2.38 binutils defaults to ISA specification version
|
||||||
|
2019-12-13. This version of the specification has has separated the
|
||||||
|
the csr read/write (csrr*/csrw*) instructions and the fence.i from
|
||||||
|
the I extension and put them into separate Zicsr and Zifencei
|
||||||
|
extensions.
|
||||||
|
|
||||||
|
This implies that we have to adjust the -march flag passed to the
|
||||||
|
compiler accordingly.
|
||||||
|
|
||||||
|
Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
|
||||||
|
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||||
|
---
|
||||||
|
configure.ac | 8 ++++++++
|
||||||
|
1 file changed, 8 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/configure.ac b/configure.ac
|
||||||
|
index af8e2615ce..906eb1cedc 100644
|
||||||
|
--- a/configure.ac
|
||||||
|
+++ b/configure.ac
|
||||||
|
@@ -866,11 +866,19 @@ if test x"$platform" != xemu ; then
|
||||||
|
CFLAGS="$TARGET_CFLAGS -march=rv32imac -mabi=ilp32 -Werror"
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||||
|
[grub_cv_target_cc_soft_float="-march=rv32imac -mabi=ilp32"], [])
|
||||||
|
+ # ISA spec version 20191213 factored out extensions Zicsr and Zifencei
|
||||||
|
+ CFLAGS="$TARGET_CFLAGS -march=rv32imac_zicsr_zifencei -mabi=ilp32 -Werror"
|
||||||
|
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||||
|
+ [grub_cv_target_cc_soft_float="-march=rv32imac_zicsr_zifencei -mabi=ilp32"], [])
|
||||||
|
fi
|
||||||
|
if test "x$target_cpu" = xriscv64; then
|
||||||
|
CFLAGS="$TARGET_CFLAGS -march=rv64imac -mabi=lp64 -Werror"
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||||
|
[grub_cv_target_cc_soft_float="-march=rv64imac -mabi=lp64"], [])
|
||||||
|
+ # ISA spec version 20191213 factored out extensions Zicsr and Zifencei
|
||||||
|
+ CFLAGS="$TARGET_CFLAGS -march=rv64imac_zicsr_zifencei -mabi=lp64 -Werror"
|
||||||
|
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||||
|
+ [grub_cv_target_cc_soft_float="-march=rv64imac_zicsr_zifencei -mabi=lp64"], [])
|
||||||
|
fi
|
||||||
|
if test "x$target_cpu" = xia64; then
|
||||||
|
CFLAGS="$TARGET_CFLAGS -mno-inline-float-divide -mno-inline-sqrt -Werror"
|
||||||
|
--
|
||||||
|
2.34.1
|
||||||
|
|
176
0001-grub-install-bailout-root-device-probing.patch
Normal file
176
0001-grub-install-bailout-root-device-probing.patch
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
From 58dcf7985b20de876a6fc44a591aa377d0a0302c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Michael Chang <mchang@suse.com>
|
||||||
|
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 <mchang@suse.com>
|
||||||
|
---
|
||||||
|
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(-)
|
||||||
|
|
||||||
|
diff --git a/grub-core/osdep/basic/no_platform.c b/grub-core/osdep/basic/no_platform.c
|
||||||
|
index a173dafe90..dfbdd58e4e 100644
|
||||||
|
--- a/grub-core/osdep/basic/no_platform.c
|
||||||
|
+++ b/grub-core/osdep/basic/no_platform.c
|
||||||
|
@@ -51,3 +51,8 @@ grub_install_zipl (const char *d, int i, int f)
|
||||||
|
grub_util_error ("%s", _("no zIPL routines are available for your platform"));
|
||||||
|
}
|
||||||
|
|
||||||
|
+char *
|
||||||
|
+grub_install_get_filesystem (const char *path)
|
||||||
|
+{
|
||||||
|
+ return NULL;
|
||||||
|
+}
|
||||||
|
diff --git a/grub-core/osdep/unix/platform.c b/grub-core/osdep/unix/platform.c
|
||||||
|
index 4df143671a..68186480b2 100644
|
||||||
|
--- a/grub-core/osdep/unix/platform.c
|
||||||
|
+++ b/grub-core/osdep/unix/platform.c
|
||||||
|
@@ -250,3 +250,37 @@ grub_install_zipl (const char *dest, int install, int force)
|
||||||
|
"-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;
|
||||||
|
+}
|
||||||
|
diff --git a/grub-core/osdep/windows/platform.c b/grub-core/osdep/windows/platform.c
|
||||||
|
index 733c36d72c..1d2e356e6b 100644
|
||||||
|
--- a/grub-core/osdep/windows/platform.c
|
||||||
|
+++ b/grub-core/osdep/windows/platform.c
|
||||||
|
@@ -430,3 +430,9 @@ grub_install_zipl (const char *d, int i, int f)
|
||||||
|
{
|
||||||
|
grub_util_error ("%s", _("no zIPL routines are available for your platform"));
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+char *
|
||||||
|
+grub_install_get_filesystem (const char *path)
|
||||||
|
+{
|
||||||
|
+ return NULL;
|
||||||
|
+}
|
||||||
|
diff --git a/include/grub/util/install.h b/include/grub/util/install.h
|
||||||
|
index 154487b72b..456955c3d7 100644
|
||||||
|
--- a/include/grub/util/install.h
|
||||||
|
+++ b/include/grub/util/install.h
|
||||||
|
@@ -252,6 +252,9 @@ grub_install_sgi_setup (const char *install_device,
|
||||||
|
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
|
||||||
|
diff --git a/util/grub-install.c b/util/grub-install.c
|
||||||
|
index 7bc5f84378..213f54a782 100644
|
||||||
|
--- a/util/grub-install.c
|
||||||
|
+++ b/util/grub-install.c
|
||||||
|
@@ -871,7 +871,6 @@ main (int argc, char *argv[])
|
||||||
|
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;
|
||||||
|
@@ -1049,8 +1048,10 @@ main (int argc, char *argv[])
|
||||||
|
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);
|
||||||
|
@@ -1071,20 +1072,32 @@ main (int argc, char *argv[])
|
||||||
|
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)
|
||||||
|
--
|
||||||
|
2.34.1
|
||||||
|
|
415
0001-install-fix-software-raid1-on-esp.patch
Normal file
415
0001-install-fix-software-raid1-on-esp.patch
Normal file
@ -0,0 +1,415 @@
|
|||||||
|
From 6444774dae24f439dae3b4bc8d73449d50f06240 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Michael Chang <mchang@suse.com>
|
||||||
|
Date: Thu, 31 Dec 2020 21:54:07 +0800
|
||||||
|
Subject: [PATCH] install: fix software raid1 on esp
|
||||||
|
|
||||||
|
While running grub-install on an efi system where efi system partition
|
||||||
|
is configured as mdadm software raid1, it fails with errors like this:
|
||||||
|
|
||||||
|
grub2-install: info: copying `/boot/grub2/x86_64-efi/core.efi' -> `/boot/efi/EFI/opensuse/grubx64.efi'.
|
||||||
|
grub2-install: info: Registering with EFI: distributor = `opensuse', path = `\EFI\opensuse\grubx64.efi', ESP at mduuid/9182c46b9d469f79b48850b68f3371a5.
|
||||||
|
grub2-install: info: executing efibootmgr --version </dev/null >/dev/null.
|
||||||
|
grub2-install: info: executing modprobe -q efivars.
|
||||||
|
grub2-install: info: executing efibootmgr -c -d.
|
||||||
|
efibootmgr: option requires an argument -- 'd'
|
||||||
|
efibootmgr version 14
|
||||||
|
usage: efibootmgr [options]
|
||||||
|
|
||||||
|
This should work with mdadm raid1 with metadata 0.9 and 1.0 whose
|
||||||
|
superblocks are at the end of device. However
|
||||||
|
grub_install_register_efi() doesn't seem to work if the target is
|
||||||
|
multiple devices so that it errors out.
|
||||||
|
|
||||||
|
The patch changes grub_install_register_efi() to accept multiple devices
|
||||||
|
that can be used to creating efi boot entries for probed raid1 member
|
||||||
|
devices on mounted efi system partition.
|
||||||
|
|
||||||
|
This patch also adds check for metadata 0.9 or 1.0 or the validation
|
||||||
|
will fail to continue the install.
|
||||||
|
|
||||||
|
Signed-off-by: Michael Chang <mchang@suse.com>
|
||||||
|
---
|
||||||
|
grub-core/disk/diskfilter.c | 27 +++----
|
||||||
|
grub-core/disk/mdraid1x_linux.c | 3 +
|
||||||
|
grub-core/osdep/basic/no_platform.c | 3 +-
|
||||||
|
grub-core/osdep/unix/platform.c | 57 +++++++++++----
|
||||||
|
grub-core/osdep/windows/platform.c | 3 +-
|
||||||
|
include/grub/diskfilter.h | 3 +-
|
||||||
|
include/grub/util/install.h | 5 +-
|
||||||
|
util/grub-install.c | 107 ++++++++++++++++++++++++++--
|
||||||
|
8 files changed, 171 insertions(+), 37 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/grub-core/disk/diskfilter.c b/grub-core/disk/diskfilter.c
|
||||||
|
index 39d74cb867..de0c02cf94 100644
|
||||||
|
--- a/grub-core/disk/diskfilter.c
|
||||||
|
+++ b/grub-core/disk/diskfilter.c
|
||||||
|
@@ -159,8 +159,8 @@ scan_disk_partition_iter (grub_disk_t disk, grub_partition_t p, void *data)
|
||||||
|
for (m = arr->pvs; m; m = m->next)
|
||||||
|
if (m->disk && m->disk->id == disk->id
|
||||||
|
&& m->disk->dev->id == disk->dev->id
|
||||||
|
- && m->part_start == grub_partition_get_start (disk->partition)
|
||||||
|
- && m->part_size == grub_disk_native_sectors (disk))
|
||||||
|
+ && grub_partition_get_start (m->disk->partition) == grub_partition_get_start (disk->partition)
|
||||||
|
+ && grub_disk_native_sectors (m->disk) == grub_disk_native_sectors (disk))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1330,19 +1330,23 @@ insert_array (grub_disk_t disk, const struct grub_diskfilter_pv_id *id,
|
||||||
|
? (grub_memcmp (pv->id.uuid, id->uuid, id->uuidlen) == 0)
|
||||||
|
: (pv->id.id == id->id))
|
||||||
|
{
|
||||||
|
+ char *part_name = NULL;
|
||||||
|
struct grub_diskfilter_lv *lv;
|
||||||
|
/* FIXME: Check whether the update time of the superblocks are
|
||||||
|
the same. */
|
||||||
|
- if (pv->disk && grub_disk_native_sectors (disk) >= pv->part_size)
|
||||||
|
+ if (pv->disk && grub_disk_native_sectors (disk) >= grub_disk_native_sectors (pv->disk))
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
- pv->disk = grub_disk_open (disk->name);
|
||||||
|
+ if (disk->partition)
|
||||||
|
+ {
|
||||||
|
+ char *p = grub_partition_get_name (disk->partition);
|
||||||
|
+ if (p)
|
||||||
|
+ part_name = grub_xasprintf ("%s,%s", disk->name, p);
|
||||||
|
+ grub_free (p);
|
||||||
|
+ }
|
||||||
|
+ pv->disk = grub_disk_open (part_name ? : disk->name);
|
||||||
|
+ grub_free (part_name);
|
||||||
|
if (!pv->disk)
|
||||||
|
return grub_errno;
|
||||||
|
- /* This could happen to LVM on RAID, pv->disk points to the
|
||||||
|
- raid device, we shouldn't change it. */
|
||||||
|
- pv->start_sector -= pv->part_start;
|
||||||
|
- pv->part_start = grub_partition_get_start (disk->partition);
|
||||||
|
- pv->part_size = grub_disk_native_sectors (disk);
|
||||||
|
|
||||||
|
#ifdef GRUB_UTIL
|
||||||
|
{
|
||||||
|
@@ -1359,7 +1363,6 @@ insert_array (grub_disk_t disk, const struct grub_diskfilter_pv_id *id,
|
||||||
|
#endif
|
||||||
|
if (start_sector != (grub_uint64_t)-1)
|
||||||
|
pv->start_sector = start_sector;
|
||||||
|
- pv->start_sector += pv->part_start;
|
||||||
|
/* Add the device to the array. */
|
||||||
|
for (lv = array->lvs; lv; lv = lv->next)
|
||||||
|
if (!lv->became_readable_at && lv->fullname && is_lv_readable (lv, 0))
|
||||||
|
@@ -1447,8 +1450,8 @@ grub_diskfilter_get_pv_from_disk (grub_disk_t disk,
|
||||||
|
{
|
||||||
|
if (pv->disk && pv->disk->id == disk->id
|
||||||
|
&& pv->disk->dev->id == disk->dev->id
|
||||||
|
- && pv->part_start == grub_partition_get_start (disk->partition)
|
||||||
|
- && pv->part_size == grub_disk_native_sectors (disk))
|
||||||
|
+ && grub_partition_get_start (pv->disk->partition) == grub_partition_get_start (disk->partition)
|
||||||
|
+ && grub_disk_native_sectors (pv->disk) == grub_disk_native_sectors (disk))
|
||||||
|
{
|
||||||
|
if (vg_out)
|
||||||
|
*vg_out = vg;
|
||||||
|
diff --git a/grub-core/disk/mdraid1x_linux.c b/grub-core/disk/mdraid1x_linux.c
|
||||||
|
index 38444b02c7..a2aafb69fb 100644
|
||||||
|
--- a/grub-core/disk/mdraid1x_linux.c
|
||||||
|
+++ b/grub-core/disk/mdraid1x_linux.c
|
||||||
|
@@ -208,6 +208,9 @@ grub_mdraid_detect (grub_disk_t disk,
|
||||||
|
grub_le_to_cpu32 (sb.chunksize),
|
||||||
|
grub_le_to_cpu32 (sb.layout),
|
||||||
|
grub_le_to_cpu32 (sb.level));
|
||||||
|
+#ifdef GRUB_UTIL
|
||||||
|
+ array->mdraid1x_minor_version = minor_version;
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
diff --git a/grub-core/osdep/basic/no_platform.c b/grub-core/osdep/basic/no_platform.c
|
||||||
|
index dfbdd58e4e..37b9570dbc 100644
|
||||||
|
--- a/grub-core/osdep/basic/no_platform.c
|
||||||
|
+++ b/grub-core/osdep/basic/no_platform.c
|
||||||
|
@@ -33,7 +33,8 @@ grub_install_register_ieee1275 (int is_prep, const char *install_device,
|
||||||
|
void
|
||||||
|
grub_install_register_efi (grub_device_t efidir_grub_dev,
|
||||||
|
const char *efifile_path,
|
||||||
|
- const char *efi_distributor)
|
||||||
|
+ const char *efi_distributor,
|
||||||
|
+ const char *force_disk)
|
||||||
|
{
|
||||||
|
grub_util_error ("%s", _("no EFI routines are available for your platform"));
|
||||||
|
}
|
||||||
|
diff --git a/grub-core/osdep/unix/platform.c b/grub-core/osdep/unix/platform.c
|
||||||
|
index 68186480b2..c7cf74c677 100644
|
||||||
|
--- a/grub-core/osdep/unix/platform.c
|
||||||
|
+++ b/grub-core/osdep/unix/platform.c
|
||||||
|
@@ -132,15 +132,14 @@ grub_install_remove_efi_entries_by_distributor (const char *efi_distributor)
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
-grub_install_register_efi (grub_device_t efidir_grub_dev,
|
||||||
|
+grub_install_register_efi (const grub_disk_t *efidir_grub_disk,
|
||||||
|
const char *efifile_path,
|
||||||
|
- const char *efi_distributor)
|
||||||
|
+ const char *efi_distributor,
|
||||||
|
+ const char *force_disk)
|
||||||
|
{
|
||||||
|
- const char * efidir_disk;
|
||||||
|
- int efidir_part;
|
||||||
|
int ret;
|
||||||
|
- efidir_disk = grub_util_biosdisk_get_osdev (efidir_grub_dev->disk);
|
||||||
|
- efidir_part = efidir_grub_dev->disk->partition ? efidir_grub_dev->disk->partition->number + 1 : 1;
|
||||||
|
+ const grub_disk_t *curdisk;
|
||||||
|
+ int ndev = 0;
|
||||||
|
|
||||||
|
if (grub_util_exec_redirect_null ((const char * []){ "efibootmgr", "--version", NULL }))
|
||||||
|
{
|
||||||
|
@@ -158,22 +157,50 @@ grub_install_register_efi (grub_device_t efidir_grub_dev,
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
- char *efidir_part_str = xasprintf ("%d", efidir_part);
|
||||||
|
+ for (curdisk = efidir_grub_disk; *curdisk; curdisk++)
|
||||||
|
+ ndev++;
|
||||||
|
|
||||||
|
- if (!verbosity)
|
||||||
|
- ret = grub_util_exec ((const char * []){ "efibootmgr", "-q",
|
||||||
|
+ for (curdisk = efidir_grub_disk; *curdisk; curdisk++)
|
||||||
|
+ {
|
||||||
|
+ const char * efidir_disk;
|
||||||
|
+ int efidir_part;
|
||||||
|
+ char *efidir_part_str;
|
||||||
|
+ char *new_efi_distributor = NULL;
|
||||||
|
+ grub_disk_t disk = *curdisk;
|
||||||
|
+
|
||||||
|
+ efidir_disk = force_disk ? : grub_util_biosdisk_get_osdev (disk);
|
||||||
|
+ if (!efidir_disk)
|
||||||
|
+ grub_util_error (_("%s: no device for efi"), disk->name);
|
||||||
|
+
|
||||||
|
+ efidir_part = disk->partition ? disk->partition->number + 1 : 1;
|
||||||
|
+ efidir_part_str = xasprintf ("%d", efidir_part);
|
||||||
|
+ if (ndev > 1)
|
||||||
|
+ {
|
||||||
|
+ const char *p = grub_strrchr (efidir_disk, '/');
|
||||||
|
+ new_efi_distributor = xasprintf ("%s (%s%d)\n",
|
||||||
|
+ efi_distributor,
|
||||||
|
+ p ? p + 1: efidir_disk,
|
||||||
|
+ efidir_part);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!verbosity)
|
||||||
|
+ ret = grub_util_exec ((const char * []){ "efibootmgr", "-q",
|
||||||
|
"-c", "-d", efidir_disk,
|
||||||
|
"-p", efidir_part_str, "-w",
|
||||||
|
- "-L", efi_distributor, "-l",
|
||||||
|
+ "-L", new_efi_distributor ? : efi_distributor, "-l",
|
||||||
|
efifile_path, NULL });
|
||||||
|
- else
|
||||||
|
- ret = grub_util_exec ((const char * []){ "efibootmgr",
|
||||||
|
+ else
|
||||||
|
+ ret = grub_util_exec ((const char * []){ "efibootmgr",
|
||||||
|
"-c", "-d", efidir_disk,
|
||||||
|
"-p", efidir_part_str, "-w",
|
||||||
|
- "-L", efi_distributor, "-l",
|
||||||
|
+ "-L", new_efi_distributor ? : efi_distributor, "-l",
|
||||||
|
efifile_path, NULL });
|
||||||
|
- free (efidir_part_str);
|
||||||
|
- return ret;
|
||||||
|
+ free (efidir_part_str);
|
||||||
|
+ free (new_efi_distributor);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
diff --git a/grub-core/osdep/windows/platform.c b/grub-core/osdep/windows/platform.c
|
||||||
|
index 1d2e356e6b..3517803251 100644
|
||||||
|
--- a/grub-core/osdep/windows/platform.c
|
||||||
|
+++ b/grub-core/osdep/windows/platform.c
|
||||||
|
@@ -204,7 +204,8 @@ set_efi_variable_bootn (grub_uint16_t n, void *in, grub_size_t len)
|
||||||
|
int
|
||||||
|
grub_install_register_efi (grub_device_t efidir_grub_dev,
|
||||||
|
const char *efifile_path,
|
||||||
|
- const char *efi_distributor)
|
||||||
|
+ const char *efi_distributor,
|
||||||
|
+ const char *force_disk)
|
||||||
|
{
|
||||||
|
grub_uint16_t *boot_order, *new_boot_order;
|
||||||
|
grub_uint16_t *distributor16;
|
||||||
|
diff --git a/include/grub/diskfilter.h b/include/grub/diskfilter.h
|
||||||
|
index 8deb1a8c30..94ed8673d7 100644
|
||||||
|
--- a/include/grub/diskfilter.h
|
||||||
|
+++ b/include/grub/diskfilter.h
|
||||||
|
@@ -49,6 +49,7 @@ struct grub_diskfilter_vg {
|
||||||
|
|
||||||
|
#ifdef GRUB_UTIL
|
||||||
|
struct grub_diskfilter *driver;
|
||||||
|
+ grub_uint8_t mdraid1x_minor_version;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -66,8 +67,6 @@ struct grub_diskfilter_pv {
|
||||||
|
/* Optional. */
|
||||||
|
char *name;
|
||||||
|
grub_disk_t disk;
|
||||||
|
- grub_disk_addr_t part_start;
|
||||||
|
- grub_disk_addr_t part_size;
|
||||||
|
grub_disk_addr_t start_sector; /* Sector number where the data area starts. */
|
||||||
|
struct grub_diskfilter_pv *next;
|
||||||
|
/* Optional. */
|
||||||
|
diff --git a/include/grub/util/install.h b/include/grub/util/install.h
|
||||||
|
index 456955c3d7..9f9e0b2ac1 100644
|
||||||
|
--- a/include/grub/util/install.h
|
||||||
|
+++ b/include/grub/util/install.h
|
||||||
|
@@ -237,9 +237,10 @@ int
|
||||||
|
grub_install_get_powerpc_secure_boot (void);
|
||||||
|
|
||||||
|
int
|
||||||
|
-grub_install_register_efi (grub_device_t efidir_grub_dev,
|
||||||
|
+grub_install_register_efi (const grub_disk_t *efidir_grub_disk,
|
||||||
|
const char *efifile_path,
|
||||||
|
- const char *efi_distributor);
|
||||||
|
+ const char *efi_distributor,
|
||||||
|
+ const char *force_disk);
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_install_register_ieee1275 (int is_prep, const char *install_device,
|
||||||
|
diff --git a/util/grub-install.c b/util/grub-install.c
|
||||||
|
index 213f54a782..0cabc79119 100644
|
||||||
|
--- a/util/grub-install.c
|
||||||
|
+++ b/util/grub-install.c
|
||||||
|
@@ -1694,6 +1694,40 @@ main (int argc, char *argv[])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
prefix_drive = xasprintf ("(%s)", grub_drives[0]);
|
||||||
|
+
|
||||||
|
+ if (platform == GRUB_INSTALL_PLATFORM_X86_64_EFI
|
||||||
|
+ && grub_dev->disk
|
||||||
|
+ && grub_dev->disk->partition
|
||||||
|
+ && grub_fs->fs_uuid)
|
||||||
|
+ {
|
||||||
|
+ int raid_level;
|
||||||
|
+ char *uuid = NULL;
|
||||||
|
+ char *escaped_relpath = NULL;
|
||||||
|
+
|
||||||
|
+ raid_level = probe_raid_level (grub_dev->disk);
|
||||||
|
+ if (raid_level != 1)
|
||||||
|
+ goto out;
|
||||||
|
+
|
||||||
|
+ escaped_relpath = escape (relative_grubdir);
|
||||||
|
+ if (!escaped_relpath)
|
||||||
|
+ goto out;
|
||||||
|
+
|
||||||
|
+ if (grub_fs->fs_uuid (grub_dev, &uuid) || !uuid)
|
||||||
|
+ {
|
||||||
|
+ grub_print_error ();
|
||||||
|
+ grub_errno = 0;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!load_cfg_f)
|
||||||
|
+ load_cfg_f = grub_util_fopen (load_cfg, "wb");
|
||||||
|
+ have_load_cfg = 1;
|
||||||
|
+ fprintf (load_cfg_f, "search --no-floppy --fs-uuid --set=root --hint='%s' %s\n", grub_drives[0], uuid);
|
||||||
|
+ fprintf (load_cfg_f, "set prefix=($root)'%s'\n", escaped_relpath);
|
||||||
|
+ grub_install_push_module ("search");
|
||||||
|
+ out:
|
||||||
|
+ grub_free (escaped_relpath);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
@@ -2232,9 +2266,13 @@ main (int argc, char *argv[])
|
||||||
|
{
|
||||||
|
/* Try to make this image bootable using the EFI Boot Manager, if available. */
|
||||||
|
int ret;
|
||||||
|
- ret = grub_install_register_efi (efidir_grub_dev,
|
||||||
|
+ grub_disk_t efidir_grub_disk[2];
|
||||||
|
+ efidir_grub_disk[0] = efidir_grub_dev->disk;
|
||||||
|
+ efidir_grub_disk[1] = NULL;
|
||||||
|
+ ret = grub_install_register_efi (efidir_grub_disk,
|
||||||
|
"\\System\\Library\\CoreServices",
|
||||||
|
- efi_distributor);
|
||||||
|
+ efi_distributor,
|
||||||
|
+ NULL);
|
||||||
|
if (ret)
|
||||||
|
grub_util_error (_("efibootmgr failed to register the boot entry: %s"),
|
||||||
|
strerror (ret));
|
||||||
|
@@ -2287,7 +2325,11 @@ main (int argc, char *argv[])
|
||||||
|
{
|
||||||
|
char * efifile_path;
|
||||||
|
char * part;
|
||||||
|
+ int raid_level;
|
||||||
|
int ret;
|
||||||
|
+ grub_disk_t *efidir_grub_disk;
|
||||||
|
+ grub_disk_memberlist_t list = NULL, cur;
|
||||||
|
+ char * force_disk = NULL;
|
||||||
|
|
||||||
|
/* Try to make this image bootable using the EFI Boot Manager, if available. */
|
||||||
|
if (!efi_distributor || efi_distributor[0] == '\0')
|
||||||
|
@@ -2304,8 +2346,65 @@ main (int argc, char *argv[])
|
||||||
|
efidir_grub_dev->disk->name,
|
||||||
|
(part ? ",": ""), (part ? : ""));
|
||||||
|
grub_free (part);
|
||||||
|
- ret = grub_install_register_efi (efidir_grub_dev,
|
||||||
|
- efifile_path, efi_distributor);
|
||||||
|
+
|
||||||
|
+ raid_level = probe_raid_level (efidir_grub_dev->disk);
|
||||||
|
+ if (raid_level >= 0 && raid_level != 1)
|
||||||
|
+ grub_util_warn (_("unsupported raid level %d detected for efi system partition"), raid_level);
|
||||||
|
+ if (raid_level == 1 && !efidir_grub_dev->disk->partition)
|
||||||
|
+ {
|
||||||
|
+ const char *raidname = NULL;
|
||||||
|
+
|
||||||
|
+ if (efidir_grub_dev->disk->dev->disk_raidname)
|
||||||
|
+ raidname = efidir_grub_dev->disk->dev->disk_raidname (efidir_grub_dev->disk);
|
||||||
|
+ if (raidname
|
||||||
|
+ && (grub_strncmp (raidname, "mdraid09", sizeof ("mdraid09")) == 0
|
||||||
|
+ || (grub_strcmp (raidname, "mdraid1x") == 0
|
||||||
|
+ && ((struct grub_diskfilter_lv *) efidir_grub_dev->disk->data)->vg->mdraid1x_minor_version == 0)))
|
||||||
|
+ {
|
||||||
|
+ if (efidir_grub_dev->disk->dev->disk_memberlist)
|
||||||
|
+ list = efidir_grub_dev->disk->dev->disk_memberlist (efidir_grub_dev->disk);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ grub_util_warn (_("this array has metadata at the start and may not be suitable as a efi system partition."
|
||||||
|
+ " please ensure that your firmware understands md/v1.x metadata, or use --metadata=0.90"
|
||||||
|
+ " to create the array."));
|
||||||
|
+ /* Try to continue regardless metadata, nothing to lose here */
|
||||||
|
+ if (efidir_grub_dev->disk->dev->disk_memberlist)
|
||||||
|
+ list = efidir_grub_dev->disk->dev->disk_memberlist (efidir_grub_dev->disk);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ else if (raid_level == 1)
|
||||||
|
+ force_disk = grub_util_get_os_disk (install_device);
|
||||||
|
+ if (list)
|
||||||
|
+ {
|
||||||
|
+ int i;
|
||||||
|
+ int ndisk = 0;
|
||||||
|
+
|
||||||
|
+ for (cur = list; cur; cur = cur->next)
|
||||||
|
+ ++ndisk;
|
||||||
|
+ efidir_grub_disk = xcalloc (ndisk + 1, sizeof (*efidir_grub_disk));
|
||||||
|
+ for (cur = list, i = 0; i < ndisk; cur = cur->next, i++)
|
||||||
|
+ efidir_grub_disk[i] = cur->disk;
|
||||||
|
+ efidir_grub_disk[ndisk] = NULL;
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ efidir_grub_disk = xcalloc (2, sizeof (*efidir_grub_disk));
|
||||||
|
+ efidir_grub_disk[0] = efidir_grub_dev->disk;
|
||||||
|
+ efidir_grub_disk[1] = NULL;
|
||||||
|
+ }
|
||||||
|
+ ret = grub_install_register_efi (efidir_grub_disk,
|
||||||
|
+ efifile_path, efi_distributor,
|
||||||
|
+ force_disk);
|
||||||
|
+ while (list)
|
||||||
|
+ {
|
||||||
|
+ cur = list;
|
||||||
|
+ list = list->next;
|
||||||
|
+ grub_free (cur);
|
||||||
|
+ }
|
||||||
|
+ grub_free (force_disk);
|
||||||
|
+ grub_free (efidir_grub_disk);
|
||||||
|
if (ret)
|
||||||
|
grub_util_error (_("efibootmgr failed to register the boot entry: %s"),
|
||||||
|
strerror (ret));
|
||||||
|
--
|
||||||
|
2.34.1
|
||||||
|
|
@ -1,3 +1,23 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Mar 11 09:30:05 UTC 2022 - Michael Chang <mchang@suse.com>
|
||||||
|
|
||||||
|
- Fix grub-install error when efi system partition is created as mdadm software
|
||||||
|
raid1 device (bsc#1179981) (bsc#1195204)
|
||||||
|
* 0001-install-fix-software-raid1-on-esp.patch
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Mar 10 09:10:23 UTC 2022 - Michael Chang <mchang@suse.com>
|
||||||
|
|
||||||
|
- Fix riscv64 build error
|
||||||
|
* 0001-RISC-V-Adjust-march-flags-for-binutils-2.38.patch
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Mar 10 07:08:52 UTC 2022 - Michael Chang <mchang@suse.com>
|
||||||
|
|
||||||
|
- Fix error in grub-install when linux root device is on lvm thin volume
|
||||||
|
(bsc#1192622) (bsc#1191974)
|
||||||
|
* 0001-grub-install-bailout-root-device-probing.patch
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Fri Mar 4 03:37:40 UTC 2022 - Michael Chang <mchang@suse.com>
|
Fri Mar 4 03:37:40 UTC 2022 - Michael Chang <mchang@suse.com>
|
||||||
|
|
||||||
@ -123,7 +143,7 @@ Thu Oct 21 12:51:46 UTC 2021 - Michael Chang <mchang@suse.com>
|
|||||||
- Use /usr/lib/os-release as fallback (bsc#1191196)
|
- Use /usr/lib/os-release as fallback (bsc#1191196)
|
||||||
* grub2-default-distributor.patch
|
* grub2-default-distributor.patch
|
||||||
* grub2-check-default.sh
|
* grub2-check-default.sh
|
||||||
- VUL-0: grub2: grub2-once uses fixed file name in /var/tmp (bsc#1190474)
|
- VUL-0: grub2: grub2-once uses fixed file name in /var/tmp (bsc#1190474) (CVE-2021-46705)
|
||||||
* grub2-once
|
* grub2-once
|
||||||
* grub2-once.service
|
* grub2-once.service
|
||||||
- Fix unknown TPM error on buggy uefi firmware (bsc#1191504)
|
- Fix unknown TPM error on buggy uefi firmware (bsc#1191504)
|
||||||
|
@ -356,6 +356,9 @@ Patch838: 0002-Add-grub_disk_write_tail-helper-function.patch
|
|||||||
Patch839: 0003-grub-install-support-prep-environment-block.patch
|
Patch839: 0003-grub-install-support-prep-environment-block.patch
|
||||||
Patch840: 0004-Introduce-prep_load_env-command.patch
|
Patch840: 0004-Introduce-prep_load_env-command.patch
|
||||||
Patch841: 0005-export-environment-at-start-up.patch
|
Patch841: 0005-export-environment-at-start-up.patch
|
||||||
|
Patch842: 0001-grub-install-bailout-root-device-probing.patch
|
||||||
|
Patch843: 0001-RISC-V-Adjust-march-flags-for-binutils-2.38.patch
|
||||||
|
Patch844: 0001-install-fix-software-raid1-on-esp.patch
|
||||||
|
|
||||||
Requires: gettext-runtime
|
Requires: gettext-runtime
|
||||||
%if 0%{?suse_version} >= 1140
|
%if 0%{?suse_version} >= 1140
|
||||||
|
Loading…
Reference in New Issue
Block a user