Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Step:FrontRunner
grub2.29024
0003-grub-install-support-prep-environment-bloc...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0003-grub-install-support-prep-environment-block.patch of Package grub2.29024
From c31fc5aa0ded9ce1e774d0a3526cfee19be1b77f Mon Sep 17 00:00:00 2001 From: Michael Chang <mchang@suse.com> Date: Mon, 7 Feb 2022 20:49:01 +0800 Subject: [PATCH 3/5] grub-install: support prep environment block The grub-install can be instructed to create environment block at end of PReP paritition with probed device identities and properties in variables to facilitate root device discovery. So far these variables are defined for this purpose: ENV_FS_UUID - The filesystem uuid for the grub root device ENV_CRYPTO_UUID - The crytodisk uuid for the grub root device ENV_GRUB_DIR - The path to grub prefix directory ENV_HINT - The recommended hint string for searching root device The size of environment block is defined in GRUB_ENVBLK_PREP_SIZE which is 4096 bytes and can be extended in the future. Signed-off-by: Michael Chang <mchang@suse.com> --- include/grub/lib/envblk.h | 3 +++ util/grub-install.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/include/grub/lib/envblk.h b/include/grub/lib/envblk.h index 83f3fcf841..d01927bcf7 100644 --- a/include/grub/lib/envblk.h +++ b/include/grub/lib/envblk.h @@ -24,6 +24,9 @@ #ifndef ASM_FILE +#include <grub/disk.h> +#define GRUB_ENVBLK_PREP_SIZE (GRUB_DISK_SECTOR_SIZE << 3) + struct grub_envblk { char *buf; diff --git a/util/grub-install.c b/util/grub-install.c index 8fb5ea616b..7bc5f84378 100644 --- a/util/grub-install.c +++ b/util/grub-install.c @@ -43,6 +43,7 @@ #include <grub/util/ofpath.h> #include <grub/hfsplus.h> #include <grub/time.h> +#include <grub/lib/envblk.h> #include <string.h> @@ -2112,6 +2113,43 @@ main (int argc, char *argv[]) { grub_util_error ("%s", _("failed to copy Grub to the PReP partition")); } + + if ((signed_grub_mode >= SIGNED_GRUB_FORCE) || ((signed_grub_mode == SIGNED_GRUB_AUTO) && (ppc_sb_state > 0))) + { + char *uuid = NULL; + const char *cryptouuid = NULL; + grub_envblk_t envblk = NULL; + char *buf; + + /* TODO: Add LVM/RAID on encrypted partitions */ + if (grub_dev->disk && grub_dev->disk->dev->id == GRUB_DISK_DEVICE_CRYPTODISK_ID) + cryptouuid = grub_util_cryptodisk_get_uuid (grub_dev->disk); + if (grub_fs->fs_uuid && grub_fs->fs_uuid (grub_dev, &uuid)) + { + grub_print_error (); + grub_errno = 0; + uuid = NULL; + } + buf = grub_envblk_buf (GRUB_ENVBLK_PREP_SIZE); + envblk = grub_envblk_open (buf, GRUB_ENVBLK_PREP_SIZE); + if (uuid) + grub_envblk_set (envblk, "ENV_FS_UUID", uuid); + if (cryptouuid) + grub_envblk_set (envblk, "ENV_CRYPTO_UUID", cryptouuid); + if (relative_grubdir) + grub_envblk_set (envblk, "ENV_GRUB_DIR", relative_grubdir); + if (have_abstractions) + grub_envblk_set (envblk, "ENV_HINT", grub_dev->disk->name); + if (use_relative_path_on_btrfs) + grub_envblk_set (envblk, "btrfs_relative_path", "1"); + if (envblk) + { + fprintf (stderr, _("Write environment block to PReP.\n")); + if (grub_disk_write_tail (ins_dev->disk, envblk->size, envblk->buf)) + grub_util_error ("%s", _("failed to write environment block to the PReP partition")); + } + grub_envblk_close (envblk); + } grub_device_close (ins_dev); if (update_nvram) grub_install_register_ieee1275 (1, grub_util_get_os_disk (install_device), -- 2.34.1
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor