2008-06-18 Robert Millan <rmh@aybabtu.com>

* util/i386/pc/grub-install.in: If the drive is LVM or RAID, prepend
        it in prefix.

        * util/i386/pc/grub-setup.c (main): Don't handle prefix at all.  Set
        `must_embed' to 1 when root_dev is a RAID device.  When dest_dev is
        a RAID device, run setup() for all members independently on whether
        LVM abstraction is being used.
        (setup): Don't handle prefix at all; let grub-mkimage take care of it.
        If grub-mkimage has set `*install_dos_part == -2', don't override this
        value.
        Perform *install_dos_part adjustments independently on whether
        we're embedding or not.
        Clarify error message when image is too big for embedding.
        Remove duplicate *install_dos_part stanza.
This commit is contained in:
robertmh 2008-06-18 17:35:26 +00:00
parent b23e5644cf
commit 7847c51e22
3 changed files with 73 additions and 95 deletions

View file

@ -1,3 +1,20 @@
2008-06-18 Robert Millan <rmh@aybabtu.com>
* util/i386/pc/grub-install.in: If the drive is LVM or RAID, prepend
it in prefix.
* util/i386/pc/grub-setup.c (main): Don't handle prefix at all. Set
`must_embed' to 1 when root_dev is a RAID device. When dest_dev is
a RAID device, run setup() for all members independently on whether
LVM abstraction is being used.
(setup): Don't handle prefix at all; let grub-mkimage take care of it.
If grub-mkimage has set `*install_dos_part == -2', don't override this
value.
Perform *install_dos_part adjustments independently on whether
we're embedding or not.
Clarify error message when image is too big for embedding.
Remove duplicate *install_dos_part stanza.
2008-06-17 Robert Millan <rmh@aybabtu.com> 2008-06-17 Robert Millan <rmh@aybabtu.com>
* term/ieee1275/ofconsole.c (fgcolor, bgcolor): Remove variables. * term/ieee1275/ofconsole.c (fgcolor, bgcolor): Remove variables.

View file

@ -231,10 +231,18 @@ partmap_module=`$grub_probe --target=partmap --device ${grub_device} 2> /dev/nul
# Device abstraction module, if any (lvm, raid). # Device abstraction module, if any (lvm, raid).
devabstraction_module=`$grub_probe --target=abstraction --device ${grub_device}` devabstraction_module=`$grub_probe --target=abstraction --device ${grub_device}`
if [ "x${devabstraction_module}" = "x" ] ; then
prefix_drive=
else
prefix_drive=`$grub_probe --target=drive --device ${grub_device}`
fi
# The order in this list is critical. Be careful when modifiing it. # The order in this list is critical. Be careful when modifiing it.
modules="$modules $fs_module $partmap_module biosdisk $devabstraction_module" modules="$modules $fs_module $partmap_module biosdisk $devabstraction_module"
$grub_mkimage --output=${grubdir}/core.img --prefix=`make_system_path_relative_to_its_root ${grubdir}`/ $modules || exit 1 $grub_mkimage --output=${grubdir}/core.img \
--prefix=${prefix_drive}`make_system_path_relative_to_its_root ${grubdir}`/ \
$modules || exit 1
# Now perform the installation. # Now perform the installation.
$grub_setup --directory=${grubdir} --device-map=${device_map} \ $grub_setup --directory=${grubdir} --device-map=${device_map} \

View file

@ -87,7 +87,7 @@ grub_refresh (void)
} }
static void static void
setup (const char *prefix, const char *dir, setup (const char *dir,
const char *boot_file, const char *core_file, const char *boot_file, const char *core_file,
const char *root, const char *dest, int must_embed) const char *root, const char *dest, int must_embed)
{ {
@ -101,7 +101,6 @@ setup (const char *prefix, const char *dir,
grub_uint16_t *boot_drive_check; grub_uint16_t *boot_drive_check;
struct boot_blocklist *first_block, *block; struct boot_blocklist *first_block, *block;
grub_int32_t *install_dos_part, *install_bsd_part; grub_int32_t *install_dos_part, *install_bsd_part;
char *install_prefix;
char *tmp_img; char *tmp_img;
int i; int i;
grub_disk_addr_t first_sector; grub_disk_addr_t first_sector;
@ -234,8 +233,6 @@ setup (const char *prefix, const char *dir,
+ GRUB_KERNEL_MACHINE_INSTALL_DOS_PART); + GRUB_KERNEL_MACHINE_INSTALL_DOS_PART);
install_bsd_part = (grub_int32_t *) (core_img + GRUB_DISK_SECTOR_SIZE install_bsd_part = (grub_int32_t *) (core_img + GRUB_DISK_SECTOR_SIZE
+ GRUB_KERNEL_MACHINE_INSTALL_BSD_PART); + GRUB_KERNEL_MACHINE_INSTALL_BSD_PART);
install_prefix = (core_img + GRUB_DISK_SECTOR_SIZE
+ GRUB_KERNEL_MACHINE_PREFIX);
/* Open the root device and the destination device. */ /* Open the root device and the destination device. */
root_dev = grub_device_open (root); root_dev = grub_device_open (root);
@ -274,6 +271,40 @@ setup (const char *prefix, const char *dir,
if (dest_dev->disk->id & 0x80) if (dest_dev->disk->id & 0x80)
/* Replace the jmp (2 bytes) with double nop's. */ /* Replace the jmp (2 bytes) with double nop's. */
*boot_drive_check = 0x9090; *boot_drive_check = 0x9090;
/* If we hardcoded drive as part of prefix, we don't want to
override the current setting. */
if (*install_dos_part != -2)
{
/* Embed information about the installed location. */
if (root_dev->disk->partition)
{
if (strcmp (root_dev->disk->partition->partmap->name,
"pc_partition_map") == 0)
{
struct grub_pc_partition *pcdata =
root_dev->disk->partition->data;
*install_dos_part
= grub_cpu_to_le32 (pcdata->dos_part);
*install_bsd_part
= grub_cpu_to_le32 (pcdata->bsd_part);
}
else if (strcmp (root_dev->disk->partition->partmap->name,
"gpt_partition_map") == 0)
{
*install_dos_part = grub_cpu_to_le32 (root_dev->disk->partition->index);
*install_bsd_part = grub_cpu_to_le32 (-1);
}
else
grub_util_error ("No PC style partitions found");
}
else
*install_dos_part = *install_bsd_part = grub_cpu_to_le32 (-1);
}
grub_util_info ("dos partition is %d, bsd partition is %d",
grub_le_to_cpu32 (*install_dos_part),
grub_le_to_cpu32 (*install_bsd_part));
/* If the destination device can have partitions and it is the MBR, /* If the destination device can have partitions and it is the MBR,
try to embed the core image into after the MBR. */ try to embed the core image into after the MBR. */
@ -299,39 +330,6 @@ setup (const char *prefix, const char *dir,
block->len = 0; block->len = 0;
block->segment = 0; block->segment = 0;
/* Embed information about the installed location. */
if (must_embed)
*install_dos_part = *install_bsd_part = grub_cpu_to_le32 (-2);
else if (root_dev->disk->partition)
{
if (strcmp (root_dev->disk->partition->partmap->name,
"pc_partition_map") == 0)
{
struct grub_pc_partition *pcdata =
root_dev->disk->partition->data;
*install_dos_part
= grub_cpu_to_le32 (pcdata->dos_part);
*install_bsd_part
= grub_cpu_to_le32 (pcdata->bsd_part);
}
else if (strcmp (root_dev->disk->partition->partmap->name,
"gpt_partition_map") == 0)
{
*install_dos_part = grub_cpu_to_le32 (root_dev->disk->partition->index);
*install_bsd_part = grub_cpu_to_le32 (-1);
}
else
grub_util_error ("No PC style partitions found");
}
else
*install_dos_part = *install_bsd_part = grub_cpu_to_le32 (-1);
grub_util_info ("dos partition is %d, bsd partition is %d, prefix is %s",
grub_le_to_cpu32 (*install_dos_part),
grub_le_to_cpu32 (*install_bsd_part),
prefix);
strcpy (install_prefix, prefix);
/* Write the core image onto the disk. */ /* Write the core image onto the disk. */
if (grub_disk_write (dest_dev->disk, embed_region.start, 0, core_size, core_img)) if (grub_disk_write (dest_dev->disk, embed_region.start, 0, core_size, core_img))
grub_util_error ("%s", grub_errmsg); grub_util_error ("%s", grub_errmsg);
@ -362,7 +360,7 @@ setup (const char *prefix, const char *dir,
able_to_embed = 0; able_to_embed = 0;
if (must_embed && ! able_to_embed) if (must_embed && ! able_to_embed)
grub_util_error ("Can't embed the core image, but this is required when\n" grub_util_error ("Core image is too big for embedding, but this is required when\n"
"the root device is on a RAID array or LVM volume."); "the root device is on a RAID array or LVM volume.");
/* The core image must be put on a filesystem unfortunately. */ /* The core image must be put on a filesystem unfortunately. */
@ -370,7 +368,7 @@ setup (const char *prefix, const char *dir,
/* Make sure that GRUB reads the identical image as the OS. */ /* Make sure that GRUB reads the identical image as the OS. */
tmp_img = xmalloc (core_size); tmp_img = xmalloc (core_size);
core_path = grub_util_get_path (prefix, core_file); core_path = grub_util_get_path (DEFAULT_DIRECTORY "core.img", core_file);
/* It is a Good Thing to sync two times. */ /* It is a Good Thing to sync two times. */
sync (); sync ();
@ -488,38 +486,6 @@ setup (const char *prefix, const char *dir,
the boot device. */ the boot device. */
*root_drive = 0xFF; *root_drive = 0xFF;
/* Embed information about the installed location. */
if (root_dev->disk->partition)
{
struct grub_pc_partition *pcdata =
root_dev->disk->partition->data;
if (strcmp (root_dev->disk->partition->partmap->name,
"pc_partition_map") == 0)
{
*install_dos_part
= grub_cpu_to_le32 (pcdata->dos_part);
*install_bsd_part
= grub_cpu_to_le32 (pcdata->bsd_part);
}
else if (strcmp (root_dev->disk->partition->partmap->name,
"gpt_partition_map") == 0)
{
*install_dos_part = grub_cpu_to_le32 (root_dev->disk->partition->index);
*install_bsd_part = grub_cpu_to_le32 (-1);
}
else
grub_util_error ("No PC style partitions found");
}
else
*install_dos_part = *install_bsd_part = grub_cpu_to_le32 (-1);
grub_util_info ("dos partition is %d, bsd partition is %d, prefix is %s",
grub_le_to_cpu32 (*install_dos_part),
grub_le_to_cpu32 (*install_bsd_part),
prefix);
strcpy (install_prefix, prefix);
/* Write the first two sectors of the core image onto the disk. */ /* Write the first two sectors of the core image onto the disk. */
core_path = grub_util_get_path (dir, core_file); core_path = grub_util_get_path (dir, core_file);
grub_util_info ("opening the core image `%s'", core_path); grub_util_info ("opening the core image `%s'", core_path);
@ -608,7 +574,6 @@ main (int argc, char *argv[])
char *dir = 0; char *dir = 0;
char *dev_map = 0; char *dev_map = 0;
char *root_dev = 0; char *root_dev = 0;
char *prefix;
char *dest_dev; char *dest_dev;
int must_embed = 0; int must_embed = 0;
@ -714,8 +679,6 @@ main (int argc, char *argv[])
/* For simplicity. */ /* For simplicity. */
dest_dev = xstrdup (dest_dev); dest_dev = xstrdup (dest_dev);
prefix = grub_get_prefix (dir ? : DEFAULT_DIRECTORY);
if (root_dev) if (root_dev)
{ {
char *tmp = get_device_name (root_dev); char *tmp = get_device_name (root_dev);
@ -740,44 +703,35 @@ main (int argc, char *argv[])
#ifdef __linux__ #ifdef __linux__
if (grub_util_lvm_isvolume (root_dev)) if (grub_util_lvm_isvolume (root_dev))
must_embed = 1;
if (root_dev[0] == 'm' && root_dev[1] == 'd'
&& root_dev[2] >= '0' && root_dev[2] <= '9')
{ {
char *newprefix; /* FIXME: we can avoid this on RAID1. */
must_embed = 1; must_embed = 1;
newprefix = xmalloc (1 + strlen (root_dev) + 1 + strlen (prefix) + 1);
sprintf (newprefix, "(%s)%s", root_dev, prefix);
free (prefix);
prefix = newprefix;
} }
else if (dest_dev[0] == 'm' && dest_dev[1] == 'd'
&& dest_dev[2] >= '0' && dest_dev[2] <= '9') if (dest_dev[0] == 'm' && dest_dev[1] == 'd'
&& dest_dev[2] >= '0' && dest_dev[2] <= '9')
{ {
char **devicelist; char **devicelist;
char *raid_prefix;
int i; int i;
raid_prefix = xmalloc (1 + strlen (dest_dev) + 1 + strlen (prefix) + 1);
sprintf (raid_prefix, "(%s)%s", dest_dev, prefix);
devicelist = grub_util_raid_getmembers (dest_dev); devicelist = grub_util_raid_getmembers (dest_dev);
for (i = 0; devicelist[i]; i++) for (i = 0; devicelist[i]; i++)
{ {
setup (raid_prefix, setup (dir ? : DEFAULT_DIRECTORY,
dir ? : DEFAULT_DIRECTORY,
boot_file ? : DEFAULT_BOOT_FILE, boot_file ? : DEFAULT_BOOT_FILE,
core_file ? : DEFAULT_CORE_FILE, core_file ? : DEFAULT_CORE_FILE,
root_dev, grub_util_get_grub_dev (devicelist[i]), 1); root_dev, grub_util_get_grub_dev (devicelist[i]), 1);
} }
free (raid_prefix);
} }
else else
#endif #endif
/* Do the real work. */ /* Do the real work. */
setup (prefix, setup (dir ? : DEFAULT_DIRECTORY,
dir ? : DEFAULT_DIRECTORY,
boot_file ? : DEFAULT_BOOT_FILE, boot_file ? : DEFAULT_BOOT_FILE,
core_file ? : DEFAULT_CORE_FILE, core_file ? : DEFAULT_CORE_FILE,
root_dev, dest_dev, must_embed); root_dev, dest_dev, must_embed);
@ -791,7 +745,6 @@ main (int argc, char *argv[])
free (dir); free (dir);
free (dev_map); free (dev_map);
free (root_dev); free (root_dev);
free (prefix);
free (dest_dev); free (dest_dev);
return 0; return 0;