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
Reply to: