2008-07-26 Robert Millan * include/grub/i386/pc/kernel.h (GRUB_KERNEL_MACHINE_DATA_END): Increase from 0x50 to 0x60. * util/i386/pc/grub-install.in: Detect cross-disk installs, and use UUIDs to identify the root drive for them. If that's not possible, abort. * util/i386/pc/grub-setup.c (setup): Do not special-case, or even check, for cross-disk installs. Index: include/grub/i386/pc/kernel.h =================================================================== --- include/grub/i386/pc/kernel.h (revision 1733) +++ include/grub/i386/pc/kernel.h (working copy) @@ -41,7 +41,7 @@ #define GRUB_KERNEL_MACHINE_PREFIX 0x20 /* End of the data section. */ -#define GRUB_KERNEL_MACHINE_DATA_END 0x50 +#define GRUB_KERNEL_MACHINE_DATA_END 0x60 /* The size of the first region which won't be compressed. */ #if defined(ENABLE_LZO) Index: util/i386/pc/grub-install.in =================================================================== --- util/i386/pc/grub-install.in (revision 1733) +++ util/i386/pc/grub-install.in (working copy) @@ -233,15 +233,34 @@ # Device abstraction module, if any (lvm, raid). devabstraction_module=`$grub_probe --target=abstraction --device ${grub_device}` +# The order in this list is critical. Be careful when modifying it. +modules="$modules $fs_module $partmap_module biosdisk $devabstraction_module" + +prefix_drive= if [ "x${devabstraction_module}" = "x" ] ; then - prefix_drive= + if echo "${install_device}" | grep -qx "(.*)" ; then + install_drive="${install_device}" + else + install_drive="`$grub_probe --target=drive --device ${install_device}`" + fi + grub_drive="`$grub_probe --target=drive --device ${grub_device}`" + + # Strip partition number + install_drive="`echo ${install_drive} | sed -e s/,[0-9]*//g`" + grub_drive="`echo ${grub_drive} | sed -e s/,[0-9]*//g`" + if [ "x${grub_drive}" != "x${install_drive}" ] ; then + uuid="`$grub_probe --target=fs_uuid --device ${grub_device}`" + if [ "x${uuid}" = "x" ] ; then + echo "You attempted a cross-disk install, but the filesystem containing ${grubdir} does not support UUIDs." 1>&2 + exit 1 + fi + prefix_drive="(UUID=${uuid})" + modules="$modules fs_uuid" + fi else prefix_drive=`$grub_probe --target=drive --device ${grub_device}` fi -# The order in this list is critical. Be careful when modifying it. -modules="$modules $fs_module $partmap_module biosdisk $devabstraction_module" - grub_prefix="${prefix_drive}`make_system_path_relative_to_its_root ${grubdir}`" || exit 1 $grub_mkimage --output=${grubdir}/core.img --prefix=${grub_prefix}/ $modules || exit 1 Index: util/i386/pc/grub-setup.c =================================================================== --- util/i386/pc/grub-setup.c (revision 1733) +++ util/i386/pc/grub-setup.c (working copy) @@ -339,18 +339,12 @@ if (grub_disk_write (dest_dev->disk, embed_region.start, 0, core_size, core_img)) grub_util_error ("%s", grub_errmsg); - /* The boot image and the core image are on the same drive, - so there is no need to specify the boot drive explicitly. */ - *boot_drive = 0xff; + /* FIXME: can this be skipped? */ + *boot_drive = 0xFF; + *root_drive = 0xFF; + *kernel_sector = grub_cpu_to_le64 (embed_region.start); - /* If the root device is different from the destination device, - it is necessary to embed the root drive explicitly. */ - if (root_dev->disk->id != dest_dev->disk->id) - *root_drive = (grub_uint8_t) root_dev->disk->id; - else - *root_drive = 0xFF; - /* Write the boot image onto the disk. */ if (grub_disk_write (dest_dev->disk, 0, 0, GRUB_DISK_SECTOR_SIZE, boot_img)) @@ -480,15 +474,8 @@ *kernel_sector = grub_cpu_to_le64 (first_sector); - /* If the destination device is different from the root device, - it is necessary to embed the boot drive explicitly. */ - if (root_dev->disk->id != dest_dev->disk->id) - *boot_drive = (grub_uint8_t) root_dev->disk->id; - else - *boot_drive = 0xFF; - - /* When the core image is not embedded, the root device always follows - the boot device. */ + /* FIXME: can this be skipped? */ + *boot_drive = 0xFF; *root_drive = 0xFF; *install_dos_part = grub_cpu_to_le32 (dos_part);