From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1K7zsP-0002XL-WF for mharc-grub-devel@gnu.org; Sun, 15 Jun 2008 17:35:06 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1K7zsN-0002XG-Li for grub-devel@gnu.org; Sun, 15 Jun 2008 17:35:03 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1K7zsM-0002Wy-5G for grub-devel@gnu.org; Sun, 15 Jun 2008 17:35:02 -0400 Received: from [199.232.76.173] (port=39837 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1K7zsM-0002Wv-1o for grub-devel@gnu.org; Sun, 15 Jun 2008 17:35:02 -0400 Received: from aybabtu.com ([69.60.117.155]:60703) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1K7zsL-0001PT-LM for grub-devel@gnu.org; Sun, 15 Jun 2008 17:35:01 -0400 Received: from [192.168.10.10] (helo=thorin) by aybabtu.com with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.63) (envelope-from ) id 1K7zqE-0007SJ-90 for grub-devel@gnu.org; Sun, 15 Jun 2008 23:32:51 +0200 Received: from rmh by thorin with local (Exim 4.63) (envelope-from ) id 1K7zrw-0002VH-0x for grub-devel@gnu.org; Sun, 15 Jun 2008 23:34:36 +0200 Date: Sun, 15 Jun 2008 23:34:36 +0200 From: Robert Millan To: grub-devel@gnu.org Message-ID: <20080615213435.GA9592@thorin> References: <20080606160946.GA13716@thorin> <20080615182219.GA12911@thorin> <20080615213332.GA9442@thorin> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="J2SCkAp4GZ/dPZZf" Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20080615213332.GA9442@thorin> Organization: free as in freedom X-Message-Flag: Worried about Outlook viruses? Switch to Thunderbird! www.mozilla.com/thunderbird X-Debbugs-No-Ack: true User-Agent: Mutt/1.5.13 (2006-08-11) X-detected-kernel: by monty-python.gnu.org: Genre and OS details not recognized. Subject: Re: new patch (boot from LVM / RAID) X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 15 Jun 2008 21:35:03 -0000 --J2SCkAp4GZ/dPZZf Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit 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 I know my rights; I want my phone call! What good is a phone call… if you are unable to speak? (as seen on /.) --J2SCkAp4GZ/dPZZf Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="root_on_lvm.diff" 2008-06-15 Robert Millan * 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; --J2SCkAp4GZ/dPZZf--