* [PATCH] boot from LVM / RAID
@ 2008-06-06 16:09 Robert Millan
2008-06-15 18:22 ` Robert Millan
0 siblings, 1 reply; 7+ messages in thread
From: Robert Millan @ 2008-06-06 16:09 UTC (permalink / raw)
To: grub-devel
[-- Attachment #1: Type: text/plain, Size: 407 bytes --]
This patch makes it possible to boot directly from LVM or RAID.
It is archieved by permitting that grub_prefix include a drive component as
part of its path. The kernel already knows how to extract root from there,
as long as `grub_install_dos_part == -2'.
--
Robert Millan
<GPLv2> I know my rights; I want my phone call!
<DRM> What good is a phone call… if you are unable to speak?
(as seen on /.)
[-- Attachment #2: root_on_lvm.diff --]
[-- Type: text/x-diff, Size: 4178 bytes --]
2008-06-06 Robert Millan <rmh@aybabtu.com>
Make boot directly from LVM or RAID possible.
* kern/i386/pc/init.c (make_install_device): Remove memdisk check.
It is assumed that if we have a memdisk, grub-mkimage has set
grub_prefix to include the "(memdisk)" drive in it.
* util/i386/pc/grub-install.in (prefix_drive): New variable. If
we need to include a drive in the prefix (because we're installing
on LVM or RAID), it is set in this variable.
Include ${grub_prefix} in `--prefix' parameter of ${grub_mkimage}
invokation.
* util/i386/pc/grub-mkimage.c (main): If a memdisk was requested,
add "(memdisk)" drive explicitly to the beginning of the prefix.
* util/i386/pc/grub-setup.c (setup): Don't write to `install_prefix',
since it has been set by grub-mkimage based on request from
grub-install, which knows better than anyone else which prefix we
need.
diff -x ChangeLog -x configure -x config.h.in -x CVS -x '*~' -x '*.mk' -urp ../grub2/kern/i386/pc/init.c ./kern/i386/pc/init.c
--- ../grub2/kern/i386/pc/init.c 2008-04-07 16:34:46.000000000 +0200
+++ ./kern/i386/pc/init.c 2008-06-06 16:14:37.000000000 +0200
@@ -64,12 +64,7 @@ make_install_device (void)
/* XXX: This should be enough. */
char dev[100];
- if (grub_memdisk_image_size)
- {
- grub_sprintf (dev, "(memdisk)%s", grub_prefix);
- grub_strcpy (grub_prefix, dev);
- }
- else if (grub_install_dos_part != -2)
+ if (grub_install_dos_part != -2)
{
/* If the root drive is not set explicitly, assume that it is identical
to the boot drive. */
diff -x ChangeLog -x configure -x config.h.in -x CVS -x '*~' -x '*.mk' -urp ../grub2/util/i386/pc/grub-install.in ./util/i386/pc/grub-install.in
--- ../grub2/util/i386/pc/grub-install.in 2008-06-06 17:49:43.000000000 +0200
+++ ./util/i386/pc/grub-install.in 2008-06-06 17:50:39.000000000 +0200
@@ -231,10 +231,18 @@ partmap_module=`$grub_probe --target=par
# Device abstraction module, if any (lvm, raid).
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
+
# _chain is often useful
modules="$modules $fs_module $partmap_module biosdisk $devabstraction_module _chain"
-$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.
$grub_setup --directory=${grubdir} --device-map=${device_map} \
diff -x ChangeLog -x configure -x config.h.in -x CVS -x '*~' -x '*.mk' -urp ../grub2/util/i386/pc/grub-mkimage.c ./util/i386/pc/grub-mkimage.c
--- ../grub2/util/i386/pc/grub-mkimage.c 2008-01-21 16:48:27.000000000 +0100
+++ ./util/i386/pc/grub-mkimage.c 2008-06-06 12:36:57.000000000 +0200
@@ -278,6 +278,11 @@ main (int argc, char *argv[])
free (memdisk);
memdisk = xstrdup (optarg);
+
+ if (prefix)
+ free (prefix);
+
+ prefix = xstrdup ("(memdisk)/boot/grub");
break;
case 'h':
diff -x ChangeLog -x configure -x config.h.in -x CVS -x '*~' -x '*.mk' -urp ../grub2/util/i386/pc/grub-setup.c ./util/i386/pc/grub-setup.c
--- ../grub2/util/i386/pc/grub-setup.c 2008-05-06 15:34:29.000000000 +0200
+++ ./util/i386/pc/grub-setup.c 2008-06-06 17:52:00.000000000 +0200
@@ -330,7 +330,6 @@ setup (const char *prefix, const char *d
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. */
if (grub_disk_write (dest_dev->disk, embed_region.start, 0, core_size, core_img))
@@ -518,7 +517,6 @@ setup (const char *prefix, const char *d
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. */
core_path = grub_util_get_path (dir, core_file);
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH] boot from LVM / RAID 2008-06-06 16:09 [PATCH] boot from LVM / RAID Robert Millan @ 2008-06-15 18:22 ` Robert Millan 2008-06-15 21:33 ` new patch (boot from LVM / RAID) Robert Millan 0 siblings, 1 reply; 7+ messages in thread From: Robert Millan @ 2008-06-15 18:22 UTC (permalink / raw) To: grub-devel On Fri, Jun 06, 2008 at 06:09:46PM +0200, Robert Millan wrote: > > This patch makes it possible to boot directly from LVM or RAID. > > It is archieved by permitting that grub_prefix include a drive component as > part of its path. The kernel already knows how to extract root from there, > as long as `grub_install_dos_part == -2'. The memdisk part of this was basicaly a bugfix, so I checked it in. The rest seems to duplicate stuff that grub-setup was already doing, and I think I'll have to take a closer look (I'll send another mail about that later). -- Robert Millan <GPLv2> I know my rights; I want my phone call! <DRM> What good is a phone call… if you are unable to speak? (as seen on /.) ^ permalink raw reply [flat|nested] 7+ messages in thread
* new patch (boot from LVM / RAID) 2008-06-15 18:22 ` Robert Millan @ 2008-06-15 21:33 ` Robert Millan 2008-06-15 21:34 ` Robert Millan 0 siblings, 1 reply; 7+ messages in thread From: Robert Millan @ 2008-06-15 21:33 UTC (permalink / raw) To: grub-devel On Sun, Jun 15, 2008 at 08:22:19PM +0200, Robert Millan wrote: > > The memdisk part of this was basicaly a bugfix, so I checked it in. The rest > seems to duplicate stuff that grub-setup was already doing, and I think I'll > have to take a closer look (I'll send another mail about that later). I think I sorted this out. The tip of the iceberg was that grub-setup is prepending a drive to prefix twice when we run LVM on RAID. However, it is actually wrong that grub-setup mangles prefix in first place! core.img might be loaded by other means (e.g. from GRUB Legacy), and then these adjustments have no effect. I also think it's more flexible if these kind of decisions are taken in a higher layer, so my patch moves this to grub-install, which relies on grub-probe. Then with grub-mkimage being capable of prepending a drive to prefix, there's no need to do it in grub-setup. This also fixes some minor issues I found along the way. Any comments? -- Robert Millan <GPLv2> I know my rights; I want my phone call! <DRM> What good is a phone call… if you are unable to speak? (as seen on /.) ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: new patch (boot from LVM / RAID) 2008-06-15 21:33 ` new patch (boot from LVM / RAID) Robert Millan @ 2008-06-15 21:34 ` Robert Millan 2008-06-17 20:42 ` Robert Millan 0 siblings, 1 reply; 7+ messages in thread From: Robert Millan @ 2008-06-15 21:34 UTC (permalink / raw) To: grub-devel [-- Attachment #1: Type: text/plain, Size: 290 bytes --] On Sun, Jun 15, 2008 at 11:33:32PM +0200, Robert Millan wrote: > > Any comments? Ah, and usually it helps if I remember to attach things :-) -- Robert Millan <GPLv2> I know my rights; I want my phone call! <DRM> What good is a phone call… if you are unable to speak? (as seen on /.) [-- Attachment #2: root_on_lvm.diff --] [-- Type: text/x-diff, Size: 10257 bytes --] 2008-06-15 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. diff -x ChangeLog -x configure -x config.h.in -x CVS -x '*~' -x '*.mk' -urp ../grub2/util/i386/pc/grub-install.in ./util/i386/pc/grub-install.in --- ../grub2/util/i386/pc/grub-install.in 2008-06-14 21:05:20.000000000 +0200 +++ ./util/i386/pc/grub-install.in 2008-06-15 20:25:27.000000000 +0200 @@ -231,10 +231,18 @@ partmap_module=`$grub_probe --target=par # Device abstraction module, if any (lvm, raid). 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. 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. $grub_setup --directory=${grubdir} --device-map=${device_map} \ diff -x ChangeLog -x configure -x config.h.in -x CVS -x '*~' -x '*.mk' -urp ../grub2/util/i386/pc/grub-setup.c ./util/i386/pc/grub-setup.c --- ../grub2/util/i386/pc/grub-setup.c 2008-06-14 13:34:09.000000000 +0200 +++ ./util/i386/pc/grub-setup.c 2008-06-15 20:55:43.000000000 +0200 @@ -87,7 +87,7 @@ grub_refresh (void) } static void -setup (const char *prefix, const char *dir, +setup (const char *dir, const char *boot_file, const char *core_file, const char *root, const char *dest, int must_embed) { @@ -101,7 +101,6 @@ setup (const char *prefix, const char *d grub_uint16_t *boot_drive_check; struct boot_blocklist *first_block, *block; grub_int32_t *install_dos_part, *install_bsd_part; - char *install_prefix; char *tmp_img; int i; grub_disk_addr_t first_sector; @@ -234,8 +233,6 @@ setup (const char *prefix, const char *d + GRUB_KERNEL_MACHINE_INSTALL_DOS_PART); install_bsd_part = (grub_int32_t *) (core_img + GRUB_DISK_SECTOR_SIZE + 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. */ root_dev = grub_device_open (root); @@ -274,6 +271,40 @@ setup (const char *prefix, const char *d if (dest_dev->disk->id & 0x80) /* Replace the jmp (2 bytes) with double nop's. */ *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, try to embed the core image into after the MBR. */ @@ -299,39 +330,6 @@ setup (const char *prefix, const char *d block->len = 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. */ if (grub_disk_write (dest_dev->disk, embed_region.start, 0, core_size, core_img)) grub_util_error ("%s", grub_errmsg); @@ -362,7 +360,7 @@ setup (const char *prefix, const char *d able_to_embed = 0; 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 core image must be put on a filesystem unfortunately. */ @@ -370,7 +368,7 @@ setup (const char *prefix, const char *d /* Make sure that GRUB reads the identical image as the OS. */ 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. */ sync (); @@ -488,38 +486,6 @@ setup (const char *prefix, const char *d the boot device. */ *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. */ core_path = grub_util_get_path (dir, core_file); grub_util_info ("opening the core image `%s'", core_path); @@ -608,7 +574,6 @@ main (int argc, char *argv[]) char *dir = 0; char *dev_map = 0; char *root_dev = 0; - char *prefix; char *dest_dev; int must_embed = 0; @@ -714,8 +679,6 @@ main (int argc, char *argv[]) /* For simplicity. */ dest_dev = xstrdup (dest_dev); - prefix = grub_get_prefix (dir ? : DEFAULT_DIRECTORY); - if (root_dev) { char *tmp = get_device_name (root_dev); @@ -740,44 +703,35 @@ main (int argc, char *argv[]) #ifdef __linux__ 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; - - 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 *raid_prefix; 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); for (i = 0; devicelist[i]; i++) { - setup (raid_prefix, - dir ? : DEFAULT_DIRECTORY, + setup (dir ? : DEFAULT_DIRECTORY, boot_file ? : DEFAULT_BOOT_FILE, core_file ? : DEFAULT_CORE_FILE, root_dev, grub_util_get_grub_dev (devicelist[i]), 1); } - - free (raid_prefix); } else #endif /* Do the real work. */ - setup (prefix, - dir ? : DEFAULT_DIRECTORY, + setup (dir ? : DEFAULT_DIRECTORY, boot_file ? : DEFAULT_BOOT_FILE, core_file ? : DEFAULT_CORE_FILE, root_dev, dest_dev, must_embed); @@ -791,7 +745,6 @@ main (int argc, char *argv[]) free (dir); free (dev_map); free (root_dev); - free (prefix); free (dest_dev); return 0; ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: new patch (boot from LVM / RAID) 2008-06-15 21:34 ` Robert Millan @ 2008-06-17 20:42 ` Robert Millan 2008-06-18 17:35 ` Robert Millan 2008-06-22 17:56 ` Guntsche Michael 0 siblings, 2 replies; 7+ messages in thread From: Robert Millan @ 2008-06-17 20:42 UTC (permalink / raw) To: grub-devel No comment on this? I can't assure you it's 100% bug-free, but I know it fixes existing problems, and I think it's the right way to do it. If I don't hear any objection, I'll check it in tomorrow. On Sun, Jun 15, 2008 at 11:34:36PM +0200, Robert Millan wrote: > 2008-06-15 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. > > diff -x ChangeLog -x configure -x config.h.in -x CVS -x '*~' -x '*.mk' -urp ../grub2/util/i386/pc/grub-install.in ./util/i386/pc/grub-install.in > --- ../grub2/util/i386/pc/grub-install.in 2008-06-14 21:05:20.000000000 +0200 > +++ ./util/i386/pc/grub-install.in 2008-06-15 20:25:27.000000000 +0200 > @@ -231,10 +231,18 @@ partmap_module=`$grub_probe --target=par > # Device abstraction module, if any (lvm, raid). > 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. > 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. > $grub_setup --directory=${grubdir} --device-map=${device_map} \ > diff -x ChangeLog -x configure -x config.h.in -x CVS -x '*~' -x '*.mk' -urp ../grub2/util/i386/pc/grub-setup.c ./util/i386/pc/grub-setup.c > --- ../grub2/util/i386/pc/grub-setup.c 2008-06-14 13:34:09.000000000 +0200 > +++ ./util/i386/pc/grub-setup.c 2008-06-15 20:55:43.000000000 +0200 > @@ -87,7 +87,7 @@ grub_refresh (void) > } > > static void > -setup (const char *prefix, const char *dir, > +setup (const char *dir, > const char *boot_file, const char *core_file, > const char *root, const char *dest, int must_embed) > { > @@ -101,7 +101,6 @@ setup (const char *prefix, const char *d > grub_uint16_t *boot_drive_check; > struct boot_blocklist *first_block, *block; > grub_int32_t *install_dos_part, *install_bsd_part; > - char *install_prefix; > char *tmp_img; > int i; > grub_disk_addr_t first_sector; > @@ -234,8 +233,6 @@ setup (const char *prefix, const char *d > + GRUB_KERNEL_MACHINE_INSTALL_DOS_PART); > install_bsd_part = (grub_int32_t *) (core_img + GRUB_DISK_SECTOR_SIZE > + 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. */ > root_dev = grub_device_open (root); > @@ -274,6 +271,40 @@ setup (const char *prefix, const char *d > if (dest_dev->disk->id & 0x80) > /* Replace the jmp (2 bytes) with double nop's. */ > *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, > try to embed the core image into after the MBR. */ > @@ -299,39 +330,6 @@ setup (const char *prefix, const char *d > block->len = 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. */ > if (grub_disk_write (dest_dev->disk, embed_region.start, 0, core_size, core_img)) > grub_util_error ("%s", grub_errmsg); > @@ -362,7 +360,7 @@ setup (const char *prefix, const char *d > able_to_embed = 0; > > 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 core image must be put on a filesystem unfortunately. */ > @@ -370,7 +368,7 @@ setup (const char *prefix, const char *d > > /* Make sure that GRUB reads the identical image as the OS. */ > 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. */ > sync (); > @@ -488,38 +486,6 @@ setup (const char *prefix, const char *d > the boot device. */ > *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. */ > core_path = grub_util_get_path (dir, core_file); > grub_util_info ("opening the core image `%s'", core_path); > @@ -608,7 +574,6 @@ main (int argc, char *argv[]) > char *dir = 0; > char *dev_map = 0; > char *root_dev = 0; > - char *prefix; > char *dest_dev; > int must_embed = 0; > > @@ -714,8 +679,6 @@ main (int argc, char *argv[]) > /* For simplicity. */ > dest_dev = xstrdup (dest_dev); > > - prefix = grub_get_prefix (dir ? : DEFAULT_DIRECTORY); > - > if (root_dev) > { > char *tmp = get_device_name (root_dev); > @@ -740,44 +703,35 @@ main (int argc, char *argv[]) > > #ifdef __linux__ > 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; > - > - 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 *raid_prefix; > 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); > > for (i = 0; devicelist[i]; i++) > { > - setup (raid_prefix, > - dir ? : DEFAULT_DIRECTORY, > + setup (dir ? : DEFAULT_DIRECTORY, > boot_file ? : DEFAULT_BOOT_FILE, > core_file ? : DEFAULT_CORE_FILE, > root_dev, grub_util_get_grub_dev (devicelist[i]), 1); > } > - > - free (raid_prefix); > } > else > #endif > /* Do the real work. */ > - setup (prefix, > - dir ? : DEFAULT_DIRECTORY, > + setup (dir ? : DEFAULT_DIRECTORY, > boot_file ? : DEFAULT_BOOT_FILE, > core_file ? : DEFAULT_CORE_FILE, > root_dev, dest_dev, must_embed); > @@ -791,7 +745,6 @@ main (int argc, char *argv[]) > free (dir); > free (dev_map); > free (root_dev); > - free (prefix); > free (dest_dev); > > return 0; > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > http://lists.gnu.org/mailman/listinfo/grub-devel -- Robert Millan <GPLv2> I know my rights; I want my phone call! <DRM> What good is a phone call… if you are unable to speak? (as seen on /.) ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: new patch (boot from LVM / RAID) 2008-06-17 20:42 ` Robert Millan @ 2008-06-18 17:35 ` Robert Millan 2008-06-22 17:56 ` Guntsche Michael 1 sibling, 0 replies; 7+ messages in thread From: Robert Millan @ 2008-06-18 17:35 UTC (permalink / raw) To: grub-devel On Tue, Jun 17, 2008 at 10:42:45PM +0200, Robert Millan wrote: > > No comment on this? I can't assure you it's 100% bug-free, but I know it > fixes existing problems, and I think it's the right way to do it. > > If I don't hear any objection, I'll check it in tomorrow. In it went :-) -- Robert Millan <GPLv2> I know my rights; I want my phone call! <DRM> What good is a phone call… if you are unable to speak? (as seen on /.) ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: new patch (boot from LVM / RAID) 2008-06-17 20:42 ` Robert Millan 2008-06-18 17:35 ` Robert Millan @ 2008-06-22 17:56 ` Guntsche Michael 1 sibling, 0 replies; 7+ messages in thread From: Guntsche Michael @ 2008-06-22 17:56 UTC (permalink / raw) To: The development of GRUB 2 On Jun 17, 2008, at 22:42, Robert Millan wrote: > > No comment on this? I can't assure you it's 100% bug-free, but I > know it > fixes existing problems, and I think it's the right way to do it. > > If I don't hear any objection, I'll check it in tomorrow. Hi Robert, For for replying so late, but I was travelling the whole week and did not read my mail during that time. You probably checked it in by now, I will have a look at it as soon as I can and give you feedback. Kind regards, Michael ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2008-06-22 17:56 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-06-06 16:09 [PATCH] boot from LVM / RAID Robert Millan 2008-06-15 18:22 ` Robert Millan 2008-06-15 21:33 ` new patch (boot from LVM / RAID) Robert Millan 2008-06-15 21:34 ` Robert Millan 2008-06-17 20:42 ` Robert Millan 2008-06-18 17:35 ` Robert Millan 2008-06-22 17:56 ` Guntsche Michael
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.