This is in regard to the issue that, when Linux is hibernated, upon reboot the thaw starts immediately and the grub menu is not presented.
I am now absolutely convinced this is not a BIOS issue, it is a kernel or boot loader issue.
I worked around it by adding a level of indirection to the boot process. To do this requires that you have at least one Linux partition that is not / or /boot.
The basic idea is that Linux is booted with a chainloader, same as Windows. So the main grub menu gives you a choice of Linux or Windows, and both are implemented with "chainloader +1" stanzas. It works, but I don't recommend trying this unless you are fairly familiar with how the boot loader works, and are comfortable reinstalling the boot loader from a rescue CD/DVD if something goes wrong.
The high-level instructions go like this:
1) In your extra Linux partition, create "boot" and "boot/grub" directories. 2) Copy the contents of /boot/grub to this new grub directory. 3) Edit the boot/grub/grub.conf file in this new directory so that Windows and Linux are presented as "chainloader +1" stanzas. 4) Install grub in the master boot record, pointing to this partition 5) Install grub in the first sector of your root partition, with the usual kernel choices.
When this is done, at boot time you get a choice of Linux or Windows. If you select Linux, the second boot loader comes up with the usual choice of kernels. If Linux is hibernated, you can then boot and run Windows just fine (my Windows install doesn't have a hibernate option so I wasn't able to test hibernating Windows in this scenario). If you boot again and select Linux, instead of getting the choice of kernels, it immediately resumes the hibernated image. This is how I *want* it to work, so I have left it this way.
Suppose you have this:
/dev/sda1 Windows /dev/sda2 Linux root /dev/sda3 Linux /local
Then /boot/grub gets copied to /local/boot/grub, then edit /local/boot/grub/grub.conf so that you have something like this:
title Linux root (hd0,1) chainloader +1 title Windows root (hd0,0) chainloader +1
Then run:
# grub [...] grub> root (hd0,2) grub> setup (hd0)
This loads the master boot record that points to /dev/sda2, the chainloader configuration.
Now edit /boot/grub/grub.conf and remove the Windows stanza (you don't need it here any more). Then run:
# grub [...] grub> root (hd0,1) grub> setup (hd0,1)
This loads grub into the first sector of the Linux root partition, pointing at that partition and presenting the usual choice of kernels.
This has worked great for me. I can now hibernate Linux, boot into Windows, and later resume from the hibernated Linux image.
--Greg
On 08/31/2010 06:38 AM, Greg Woods wrote:
This is in regard to the issue that, when Linux is hibernated, upon reboot the thaw starts immediately and the grub menu is not presented.
I am now absolutely convinced this is not a BIOS issue, it is a kernel or boot loader issue.
I worked around it by adding a level of indirection to the boot process. To do this requires that you have at least one Linux partition that is not / or /boot.
The basic idea is that Linux is booted with a chainloader, same as Windows. So the main grub menu gives you a choice of Linux or Windows, and both are implemented with "chainloader +1" stanzas. It works, but I don't recommend trying this unless you are fairly familiar with how the boot loader works, and are comfortable reinstalling the boot loader from a rescue CD/DVD if something goes wrong.
The high-level instructions go like this:
- In your extra Linux partition, create "boot" and "boot/grub"
directories. 2) Copy the contents of /boot/grub to this new grub directory. 3) Edit the boot/grub/grub.conf file in this new directory so that Windows and Linux are presented as "chainloader +1" stanzas. 4) Install grub in the master boot record, pointing to this partition 5) Install grub in the first sector of your root partition, with the usual kernel choices.
When this is done, at boot time you get a choice of Linux or Windows. If you select Linux, the second boot loader comes up with the usual choice of kernels. If Linux is hibernated, you can then boot and run Windows just fine (my Windows install doesn't have a hibernate option so I wasn't able to test hibernating Windows in this scenario). If you boot again and select Linux, instead of getting the choice of kernels, it immediately resumes the hibernated image. This is how I *want* it to work, so I have left it this way.
Suppose you have this:
/dev/sda1 Windows /dev/sda2 Linux root /dev/sda3 Linux /local
Then /boot/grub gets copied to /local/boot/grub, then edit /local/boot/grub/grub.conf so that you have something like this:
title Linux root (hd0,1) chainloader +1 title Windows root (hd0,0) chainloader +1
Then run:
# grub [...] grub> root (hd0,2) grub> setup (hd0)
This loads the master boot record that points to /dev/sda2, the chainloader configuration.
Now edit /boot/grub/grub.conf and remove the Windows stanza (you don't need it here any more). Then run:
# grub [...] grub> root (hd0,1) grub> setup (hd0,1)
Why is this last step (grub) necessary? It is already as it should be because it is the original boot/grub and needs no re-installation.
This loads grub into the first sector of the Linux root partition, pointing at that partition and presenting the usual choice of kernels.
This has worked great for me. I can now hibernate Linux, boot into Windows, and later resume from the hibernated Linux image.
--Greg
On Tue, 2010-08-31 at 07:38 -0600, Greg Woods wrote:
This is in regard to the issue that, when Linux is hibernated, upon reboot the thaw starts immediately and the grub menu is not presented.
I am now absolutely convinced this is not a BIOS issue, it is a kernel or boot loader issue.
I worked around it by adding a level of indirection to the boot process. To do this requires that you have at least one Linux partition that is not / or /boot.
The basic idea is that Linux is booted with a chainloader, same as Windows. So the main grub menu gives you a choice of Linux or Windows, and both are implemented with "chainloader +1" stanzas. It works, but I don't recommend trying this unless you are fairly familiar with how the boot loader works, and are comfortable reinstalling the boot loader from a rescue CD/DVD if something goes wrong.
The high-level instructions go like this:
- In your extra Linux partition, create "boot" and "boot/grub"
directories. 2) Copy the contents of /boot/grub to this new grub directory. 3) Edit the boot/grub/grub.conf file in this new directory so that Windows and Linux are presented as "chainloader +1" stanzas. 4) Install grub in the master boot record, pointing to this partition 5) Install grub in the first sector of your root partition, with the usual kernel choices.
When this is done, at boot time you get a choice of Linux or Windows. If you select Linux, the second boot loader comes up with the usual choice of kernels. If Linux is hibernated, you can then boot and run Windows just fine (my Windows install doesn't have a hibernate option so I wasn't able to test hibernating Windows in this scenario). If you boot again and select Linux, instead of getting the choice of kernels, it immediately resumes the hibernated image. This is how I *want* it to work, so I have left it this way.
Suppose you have this:
/dev/sda1 Windows /dev/sda2 Linux root /dev/sda3 Linux /local
Then /boot/grub gets copied to /local/boot/grub, then edit /local/boot/grub/grub.conf so that you have something like this:
title Linux root (hd0,1) chainloader +1 title Windows root (hd0,0) chainloader +1
Then run:
# grub [...] grub> root (hd0,2) grub> setup (hd0)
This loads the master boot record that points to /dev/sda2, the chainloader configuration.
Now edit /boot/grub/grub.conf and remove the Windows stanza (you don't need it here any more). Then run:
# grub [...] grub> root (hd0,1) grub> setup (hd0,1)
This loads grub into the first sector of the Linux root partition, pointing at that partition and presenting the usual choice of kernels.
This has worked great for me. I can now hibernate Linux, boot into Windows, and later resume from the hibernated Linux image.
--Greg
A more elegant solution would be to hack the script responsible for modifying grub.conf at hibernate time, and put an reasonable timeout there (let's say 5-10 secs) to let you choose the windows entry.
Of course, you will have to redo this hack everytime pm-utils will update.
HTH,
On Tue, Aug 31, 2010 at 3:38 PM, Greg Woods woods@ucar.edu wrote:
This is in regard to the issue that, when Linux is hibernated, upon reboot the thaw starts immediately and the grub menu is not presented.
As far as I know, this is intentional and serves the purpose of preventing selection of the wrong kernel (not sure what would happen in that case, the best being it would do a regular, full boot)
IIRC you can force GRUB to stop at the menu by keeping pressed a key, usually "shift" is good enough. Of course then you need to know what you're doing...
Gianluca Sforna wrote:
On Tue, Aug 31, 2010 at 3:38 PM, Greg Woods woods@ucar.edu wrote:
This is in regard to the issue that, when Linux is hibernated, upon reboot the thaw starts immediately and the grub menu is not presented.
As far as I know, this is intentional and serves the purpose of preventing selection of the wrong kernel (not sure what would happen in that case, the best being it would do a regular, full boot)
It is assumed that when you unhibernate (thaw) the system, you want to be back on the same OS you left. It is unusual to want to hibernate Linux and then boot up Windows, but this has proven to be the case here. Nice solution, BTW.
James McKenzie