Linux Archive

Linux Archive (http://www.linux-archive.org/)
-   Debian Kernel (http://www.linux-archive.org/debian-kernel/)
-   -   Bug#565225: Resume device should be detected when creating initramfs, or not at all (http://www.linux-archive.org/debian-kernel/458705-bug-565225-resume-device-should-detected-when-creating-initramfs-not-all.html)

Sebastian Leske 11-28-2010 11:38 PM

Bug#565225: Resume device should be detected when creating initramfs, or not at all
 
Hi,

I got bitten by this bug as well, similarly to Michael Conner above:
I installed uswsusp to be able to hibernate/resume.
s2disk worked flawlessly, but on booting the system simply did not
bother to resume, booting normally instead.

My analysis:

After digging through the initramfs scripts, I discovered that this is
because on booting resume is only triggered if $resume is set.

As far as I understand, the initramfs takes $resume from the kernel
command line (if set), and from /etc/initramfs-tools/conf.d/resume
otherwise.

In my case /etc/initramfs-tools/conf.d/resume did not exist.
It should have been created by the preinst of initramfs-tools; however
the preinst ( /var/lib/dpkg/info/initramfs-tools.preinst ) uses vol_id:
---snip----
# First time install. Can we autodetect the RESUME partition?
if [ -r /proc/swaps ]; then
RESUME=$(tail -n $(($(wc -l /proc/swaps | awk ' { print $1 } ') - 1)) /proc/swaps | sort -rk3 | head -n 1 | awk ' { print $1 } ')
if command -v vol_id >/dev/null 2>&1; then
UUID=$(vol_id -u "$RESUME" || true)
elif [ -x /lib/udev/vol_id ]; then
UUID=$(/lib/udev/vol_id -u "$RESUME" || true)
fi
if [ -n "$UUID" ]; then
RESUME="UUID=$UUID"
fi
fi
---snap---

This will always fail, because vol_id is no longer part of Debian (it was
removed from udev for version 146-1, see /usr/share/doc/udev/changelog.Debian.gz ).

In summary:

* Resume from hibernation will only work if /etc/initramfs-tools/conf.d/resume
sets RESUME
* However, there is no (working) code to write
/etc/initramfs-tools/conf.d/resume, and no documentation explaining that it
needs to be set manually to make resume work

Thus, resume will probably fail to work in most cases.

I believe there are actually several bugs here:

1) The code in the preinst of initramfs-tools to detect the swap partition does
not work, because it uses vol_id.
2) Even if 1) were fixed, there may be cases where the swap partition is
incorrectly detected at installation time, or later changes. So fixing
preinst is not enough.
I agree with bug submitter jidanni that the swap partition should be detected
when building the initramfs, not during preinst.
3) Additionally, I don't quite understand why uswsusp refuses to resume if
$resume is not set (in /usr/share/initramfs-tools/scripts/local-premount/uswsusp ).
The script does not actually use the value of $resume, it just aborts if it is not set :-(.
I guess this could be considered a bug in uswsusp; I can report it against
uswsusp if discussion of this bug indicates that this makes sense.


To fix this, I would propose the following:

* Drop the code in initramfs-tools.preinst which tries to write RESUME to
/etc/initramfs-tools/conf.d/resume , which does not work anyway.
* Document (e.g. in /usr/share/doc/initramfs-tools/README.Debian ) that
/etc/initramfs-tools/conf.d/resume can be used to set the resume device.
* When building the initramfs, use the value from /etc/initramfs-tools/conf.d/resume
if it exists; otherwise try to find it yourself:
- if /etc/uswsusp.conf exists, it probably makes sense to read it ("resume device =")
- otherwise grab the current swap device (the "config" script from uswsusp
already has code for that)
This is still problematic if there is >1 swap device. Even better probably
would be to use debconf to prompt for the resume device, if this is practical...

I am willing to help implement / test this, but first I'll wait for some
feedback if I'm even on the right track :-).

Greetings,

S.Leske



--
To UNSUBSCRIBE, email to debian-kernel-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
Archive: 20101129003821.GB15473@localhost">http://lists.debian.org/20101129003821.GB15473@localhost

Michael Prokop 11-23-2011 11:51 AM

Bug#565225: Resume device should be detected when creating initramfs, or not at all
 
* Sebastian Leske [Mon Nov 29, 2010 at 01:38:21 +0100]:

> I got bitten by this bug as well, similarly to Michael Conner above:
> I installed uswsusp to be able to hibernate/resume.
> s2disk worked flawlessly, but on booting the system simply did not
> bother to resume, booting normally instead.

> My analysis:

> After digging through the initramfs scripts, I discovered that this is
> because on booting resume is only triggered if $resume is set.

> As far as I understand, the initramfs takes $resume from the kernel
> command line (if set), and from /etc/initramfs-tools/conf.d/resume
> otherwise.

> In my case /etc/initramfs-tools/conf.d/resume did not exist.
> It should have been created by the preinst of initramfs-tools; however
> the preinst ( /var/lib/dpkg/info/initramfs-tools.preinst ) uses vol_id:
[...]
> This will always fail, because vol_id is no longer part of Debian (it was
> removed from udev for version 146-1, see /usr/share/doc/udev/changelog.Debian.gz ).

This is no longer true for current versions of initramfs-tools,
JFYI.

> In summary:

> * Resume from hibernation will only work if /etc/initramfs-tools/conf.d/resume
> sets RESUME
> * However, there is no (working) code to write
> /etc/initramfs-tools/conf.d/resume, and no documentation explaining that it
> needs to be set manually to make resume work

> Thus, resume will probably fail to work in most cases.

> I believe there are actually several bugs here:

> 1) The code in the preinst of initramfs-tools to detect the swap partition does
> not work, because it uses vol_id.

Fixed nowadays.

> 2) Even if 1) were fixed, there may be cases where the swap partition is
> incorrectly detected at installation time, or later changes. So fixing
> preinst is not enough.
> I agree with bug submitter jidanni that the swap partition should be detected
> when building the initramfs, not during preinst.
> 3) Additionally, I don't quite understand why uswsusp refuses to resume if
> $resume is not set (in /usr/share/initramfs-tools/scripts/local-premount/uswsusp ).
> The script does not actually use the value of $resume, it just aborts if it is not set :-(.
> I guess this could be considered a bug in uswsusp; I can report it against
> uswsusp if discussion of this bug indicates that this makes sense.


> To fix this, I would propose the following:

> * Drop the code in initramfs-tools.preinst which tries to write RESUME to
> /etc/initramfs-tools/conf.d/resume , which does not work anyway.

Sounds reasonable too me.
maximilian, what do you think of it?

> * Document (e.g. in /usr/share/doc/initramfs-tools/README.Debian ) that
> /etc/initramfs-tools/conf.d/resume can be used to set the resume device.
> * When building the initramfs, use the value from /etc/initramfs-tools/conf.d/resume
> if it exists; otherwise try to find it yourself:
> - if /etc/uswsusp.conf exists, it probably makes sense to read it ("resume device =")
> - otherwise grab the current swap device (the "config" script from uswsusp
> already has code for that)
> This is still problematic if there is >1 swap device. Even better probably
> would be to use debconf to prompt for the resume device, if this is practical...

> I am willing to help implement / test this, but first I'll wait for some
> feedback if I'm even on the right track :-).

Sorry that no one seemed to care about it for so long.

What could be a proper way to resolve that nowadays, taking uswsusp,
hibernate,... into account? dracut has some code in
modules.d/95resume/. IMHO we should find a way which avoids
duplicated code.

Related bug reports:

http://bugs.debian.org/574653
https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/50437

regards,
-mika-


All times are GMT. The time now is 07:26 AM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.