I installed Linux on a logical drive. Due to known problems installing Windows service packs when GRUB is in the MBR, I refused to put GRUB there and instead put it in the logical drive containing Linux. GRUB was normally loaded by the Windows 7 bootloader.
Now I wanted to boot directly into GRUB, so I can use it to hide and unhide partitions and select between two versions of Windows. Making just the logical drive with Linux active did not work. The result was as if there is no active partition. It is possible to make the extended partition active, but grub-install refuses to install there, probably because grub-probe can't figure out the mapping for it.
I solved this by copying the code from the Linux logical drive boot sector to the first sector of the extended partition. It was simple, via "
sudo dd if=linux_logical_drive_partition bs=446 count=1 of=extended_partition
". The code is 446 bytes long, starting at the beginning of the sector. The rest of the destination sector contains information about partitions, which must not be overwritten. It is extremely important to use the right device names here. (They will typically be something like /dev/sda5, with the logical drive having a higher number than the extended partition.) Mistakes in dd commands writing to raw disk devices can cause unrecoverable data loss.GRUB's first stage code doesn't care from where it's loaded. However, it does contain hard-coded sector locations, and if that needs to change it would have to be copied again in the same way.
1 comment:
Unfortunately, this leads to another problem: Windows refuses to enter hybrid sleep if its partition isn't active. I suspect it would also refuse to hibernate, but I didn't test that. This is to prevent booting into another operating system while Windows is hibernated.
Post a Comment