mirror of
https://git.proxmox.com/git/grub2
synced 2025-07-26 05:15:29 +00:00
mbr: Warn if MBR gap is small and user uses advanced modules
We don't want to support small MBR gap in pair with anything but the simplest config of biosdisk + part_msdos + simple filesystem. In this path "simple filesystems" are all current filesystems except ZFS and Btrfs. Signed-off-by: Vladimir Serbinenko <phcoder@google.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
parent
ba4b3a7b1e
commit
5fd18f77ee
@ -25,6 +25,9 @@
|
|||||||
#include <grub/msdos_partition.h>
|
#include <grub/msdos_partition.h>
|
||||||
#include <grub/gpt_partition.h>
|
#include <grub/gpt_partition.h>
|
||||||
#include <grub/i18n.h>
|
#include <grub/i18n.h>
|
||||||
|
#ifdef GRUB_UTIL
|
||||||
|
#include <grub/emu/misc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
GRUB_MOD_LICENSE ("GPLv3+");
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
@ -169,7 +172,8 @@ static grub_err_t
|
|||||||
gpt_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
|
gpt_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
|
||||||
unsigned int max_nsectors,
|
unsigned int max_nsectors,
|
||||||
grub_embed_type_t embed_type,
|
grub_embed_type_t embed_type,
|
||||||
grub_disk_addr_t **sectors)
|
grub_disk_addr_t **sectors,
|
||||||
|
int warn_short)
|
||||||
{
|
{
|
||||||
struct gpt_partition_map_embed_ctx ctx = {
|
struct gpt_partition_map_embed_ctx ctx = {
|
||||||
.start = 0,
|
.start = 0,
|
||||||
@ -191,6 +195,9 @@ gpt_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
|
|||||||
N_("this GPT partition label contains no BIOS Boot Partition;"
|
N_("this GPT partition label contains no BIOS Boot Partition;"
|
||||||
" embedding won't be possible"));
|
" embedding won't be possible"));
|
||||||
|
|
||||||
|
if (ctx.len < GRUB_MIN_RECOMMENDED_MBR_GAP)
|
||||||
|
grub_util_warn ("Your BIOS Boot Partition is under 1 MiB, please increase its size.");
|
||||||
|
|
||||||
if (ctx.len < *nsectors)
|
if (ctx.len < *nsectors)
|
||||||
return grub_error (GRUB_ERR_OUT_OF_RANGE,
|
return grub_error (GRUB_ERR_OUT_OF_RANGE,
|
||||||
N_("your BIOS Boot Partition is too small;"
|
N_("your BIOS Boot Partition is too small;"
|
||||||
|
@ -236,7 +236,8 @@ static grub_err_t
|
|||||||
pc_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
|
pc_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
|
||||||
unsigned int max_nsectors,
|
unsigned int max_nsectors,
|
||||||
grub_embed_type_t embed_type,
|
grub_embed_type_t embed_type,
|
||||||
grub_disk_addr_t **sectors)
|
grub_disk_addr_t **sectors,
|
||||||
|
int warn_short)
|
||||||
{
|
{
|
||||||
grub_disk_addr_t end = ~0ULL;
|
grub_disk_addr_t end = ~0ULL;
|
||||||
struct grub_msdos_partition_mbr mbr;
|
struct grub_msdos_partition_mbr mbr;
|
||||||
@ -390,6 +391,9 @@ pc_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
|
|||||||
return GRUB_ERR_NONE;
|
return GRUB_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (end < GRUB_MIN_RECOMMENDED_MBR_GAP && warn_short)
|
||||||
|
grub_util_warn ("You have a short MBR gap and use advanced config. Please increase post-MBR gap.");
|
||||||
|
|
||||||
if (end <= 1)
|
if (end <= 1)
|
||||||
return grub_error (GRUB_ERR_FILE_NOT_FOUND,
|
return grub_error (GRUB_ERR_FILE_NOT_FOUND,
|
||||||
N_("this msdos-style partition label has no "
|
N_("this msdos-style partition label has no "
|
||||||
|
@ -51,11 +51,14 @@ struct grub_partition_map
|
|||||||
grub_err_t (*iterate) (struct grub_disk *disk,
|
grub_err_t (*iterate) (struct grub_disk *disk,
|
||||||
grub_partition_iterate_hook_t hook, void *hook_data);
|
grub_partition_iterate_hook_t hook, void *hook_data);
|
||||||
#ifdef GRUB_UTIL
|
#ifdef GRUB_UTIL
|
||||||
|
#define GRUB_MIN_RECOMMENDED_MBR_GAP 1900
|
||||||
|
|
||||||
/* Determine sectors available for embedding. */
|
/* Determine sectors available for embedding. */
|
||||||
grub_err_t (*embed) (struct grub_disk *disk, unsigned int *nsectors,
|
grub_err_t (*embed) (struct grub_disk *disk, unsigned int *nsectors,
|
||||||
unsigned int max_nsectors,
|
unsigned int max_nsectors,
|
||||||
grub_embed_type_t embed_type,
|
grub_embed_type_t embed_type,
|
||||||
grub_disk_addr_t **sectors);
|
grub_disk_addr_t **sectors,
|
||||||
|
int warn_short);
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
typedef struct grub_partition_map *grub_partition_map_t;
|
typedef struct grub_partition_map *grub_partition_map_t;
|
||||||
|
@ -193,13 +193,13 @@ grub_util_bios_setup (const char *dir,
|
|||||||
const char *boot_file, const char *core_file,
|
const char *boot_file, const char *core_file,
|
||||||
const char *dest, int force,
|
const char *dest, int force,
|
||||||
int fs_probe, int allow_floppy,
|
int fs_probe, int allow_floppy,
|
||||||
int add_rs_codes);
|
int add_rs_codes, int warn_short_mbr_gap);
|
||||||
void
|
void
|
||||||
grub_util_sparc_setup (const char *dir,
|
grub_util_sparc_setup (const char *dir,
|
||||||
const char *boot_file, const char *core_file,
|
const char *boot_file, const char *core_file,
|
||||||
const char *dest, int force,
|
const char *dest, int force,
|
||||||
int fs_probe, int allow_floppy,
|
int fs_probe, int allow_floppy,
|
||||||
int add_rs_codes);
|
int add_rs_codes, int warn_short_mbr_gap);
|
||||||
|
|
||||||
char *
|
char *
|
||||||
grub_install_get_image_targets_string (void);
|
grub_install_get_image_targets_string (void);
|
||||||
@ -265,4 +265,7 @@ grub_util_get_target_name (const struct grub_install_image_target_desc *t);
|
|||||||
extern char *grub_install_copy_buffer;
|
extern char *grub_install_copy_buffer;
|
||||||
#define GRUB_INSTALL_COPY_BUFFER_SIZE 1048576
|
#define GRUB_INSTALL_COPY_BUFFER_SIZE 1048576
|
||||||
|
|
||||||
|
int
|
||||||
|
grub_install_is_short_mbrgap_supported (void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -234,6 +234,31 @@ char *grub_install_source_directory = NULL;
|
|||||||
char *grub_install_locale_directory = NULL;
|
char *grub_install_locale_directory = NULL;
|
||||||
char *grub_install_themes_directory = NULL;
|
char *grub_install_themes_directory = NULL;
|
||||||
|
|
||||||
|
int
|
||||||
|
grub_install_is_short_mbrgap_supported (void)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
static const char *whitelist[] =
|
||||||
|
{
|
||||||
|
"part_msdos", "biosdisk", "affs", "afs", "bfs", "archelp",
|
||||||
|
"cpio", "cpio_be", "newc", "odc", "ext2", "fat", "exfat",
|
||||||
|
"f2fs", "fshelp", "hfs", "hfsplus", "iso9660", "jfs", "minix",
|
||||||
|
"minix2", "minix3", "minix_be", "minix2_be", "nilfs2", "ntfs",
|
||||||
|
"ntfscomp", "reiserfs", "romfs", "sfs", "tar", "udf", "ufs1",
|
||||||
|
"ufs1_be", "ufs2", "xfs"
|
||||||
|
};
|
||||||
|
|
||||||
|
for (i = 0; i < modules.n_entries; i++) {
|
||||||
|
for (j = 0; j < ARRAY_SIZE (whitelist); j++)
|
||||||
|
if (strcmp(modules.entries[i], whitelist[j]) == 0)
|
||||||
|
break;
|
||||||
|
if (j == ARRAY_SIZE (whitelist))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
grub_install_push_module (const char *val)
|
grub_install_push_module (const char *val)
|
||||||
{
|
{
|
||||||
|
@ -1721,7 +1721,8 @@ main (int argc, char *argv[])
|
|||||||
if (install_bootsector)
|
if (install_bootsector)
|
||||||
grub_util_bios_setup (platdir, "boot.img", "core.img",
|
grub_util_bios_setup (platdir, "boot.img", "core.img",
|
||||||
install_drive, force,
|
install_drive, force,
|
||||||
fs_probe, allow_floppy, add_rs_codes);
|
fs_probe, allow_floppy, add_rs_codes,
|
||||||
|
!grub_install_is_short_mbrgap_supported ());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275:
|
case GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275:
|
||||||
@ -1748,7 +1749,7 @@ main (int argc, char *argv[])
|
|||||||
grub_util_sparc_setup (platdir, "boot.img", "core.img",
|
grub_util_sparc_setup (platdir, "boot.img", "core.img",
|
||||||
install_drive, force,
|
install_drive, force,
|
||||||
fs_probe, allow_floppy,
|
fs_probe, allow_floppy,
|
||||||
0 /* unused */ );
|
0 /* unused */, 0 /* unused */ );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -315,7 +315,7 @@ main (int argc, char *argv[])
|
|||||||
arguments.core_file ? : DEFAULT_CORE_FILE,
|
arguments.core_file ? : DEFAULT_CORE_FILE,
|
||||||
dest_dev, arguments.force,
|
dest_dev, arguments.force,
|
||||||
arguments.fs_probe, arguments.allow_floppy,
|
arguments.fs_probe, arguments.allow_floppy,
|
||||||
arguments.add_rs_codes);
|
arguments.add_rs_codes, 0);
|
||||||
|
|
||||||
/* Free resources. */
|
/* Free resources. */
|
||||||
grub_fini_all ();
|
grub_fini_all ();
|
||||||
|
@ -254,7 +254,8 @@ SETUP (const char *dir,
|
|||||||
const char *boot_file, const char *core_file,
|
const char *boot_file, const char *core_file,
|
||||||
const char *dest, int force,
|
const char *dest, int force,
|
||||||
int fs_probe, int allow_floppy,
|
int fs_probe, int allow_floppy,
|
||||||
int add_rs_codes __attribute__ ((unused))) /* unused on sparc64 */
|
int add_rs_codes __attribute__ ((unused)), /* unused on sparc64 */
|
||||||
|
int warn_small)
|
||||||
{
|
{
|
||||||
char *core_path;
|
char *core_path;
|
||||||
char *boot_img, *core_img, *boot_path;
|
char *boot_img, *core_img, *boot_path;
|
||||||
@ -530,7 +531,7 @@ SETUP (const char *dir,
|
|||||||
GRUB_EMBED_PCBIOS, §ors);
|
GRUB_EMBED_PCBIOS, §ors);
|
||||||
else if (ctx.dest_partmap)
|
else if (ctx.dest_partmap)
|
||||||
err = ctx.dest_partmap->embed (dest_dev->disk, &nsec, maxsec,
|
err = ctx.dest_partmap->embed (dest_dev->disk, &nsec, maxsec,
|
||||||
GRUB_EMBED_PCBIOS, §ors);
|
GRUB_EMBED_PCBIOS, §ors, warn_small);
|
||||||
else
|
else
|
||||||
err = fs->fs_embed (dest_dev, &nsec, maxsec,
|
err = fs->fs_embed (dest_dev, &nsec, maxsec,
|
||||||
GRUB_EMBED_PCBIOS, §ors);
|
GRUB_EMBED_PCBIOS, §ors);
|
||||||
|
Loading…
Reference in New Issue
Block a user