mirror of
https://github.com/systemd/systemd.git
synced 2024-12-22 17:35:35 +03:00
units: introduce systemd-hibernate-clear.service that clears
stale HibernateLocation EFI variable Currently, if the HibernateLocation EFI variable exists, but we failed to resume from it, the boot carries on without clearing the stale variable. Therefore, the subsequent boots would still be waiting for the device timeout, unless the variable is purged manually. There's no point to keep trying to resume after a successful switch-root, because the hibernation image state would have been invalidated by then. OTOH, we don't want to clear the variable prematurely either, i.e. in initrd, since if the resume device is the same as root one, the boot won't succeed and the user might be able to try resuming again. So, let's introduce a unit that only runs after switch-root and clears the var. Fixes #32021
This commit is contained in:
parent
8f8e481f03
commit
dfad86b838
@ -944,7 +944,7 @@ manpages = [
|
|||||||
['systemd-hibernate-resume-generator', '8', [], 'ENABLE_HIBERNATE'],
|
['systemd-hibernate-resume-generator', '8', [], 'ENABLE_HIBERNATE'],
|
||||||
['systemd-hibernate-resume.service',
|
['systemd-hibernate-resume.service',
|
||||||
'8',
|
'8',
|
||||||
['systemd-hibernate-resume'],
|
['systemd-hibernate-resume', 'systemd-hibernate-clear.service'],
|
||||||
'ENABLE_HIBERNATE'],
|
'ENABLE_HIBERNATE'],
|
||||||
['systemd-homed.service', '8', ['systemd-homed'], 'ENABLE_HOMED'],
|
['systemd-homed.service', '8', ['systemd-homed'], 'ENABLE_HOMED'],
|
||||||
['systemd-hostnamed.service', '8', ['systemd-hostnamed'], 'ENABLE_HOSTNAMED'],
|
['systemd-hostnamed.service', '8', ['systemd-hostnamed'], 'ENABLE_HOSTNAMED'],
|
||||||
|
@ -17,12 +17,14 @@
|
|||||||
|
|
||||||
<refnamediv>
|
<refnamediv>
|
||||||
<refname>systemd-hibernate-resume.service</refname>
|
<refname>systemd-hibernate-resume.service</refname>
|
||||||
|
<refname>systemd-hibernate-clear.service</refname>
|
||||||
<refname>systemd-hibernate-resume</refname>
|
<refname>systemd-hibernate-resume</refname>
|
||||||
<refpurpose>Resume from hibernation</refpurpose>
|
<refpurpose>Resume from hibernation</refpurpose>
|
||||||
</refnamediv>
|
</refnamediv>
|
||||||
|
|
||||||
<refsynopsisdiv>
|
<refsynopsisdiv>
|
||||||
<para><filename>systemd-hibernate-resume.service</filename></para>
|
<para><filename>systemd-hibernate-resume.service</filename></para>
|
||||||
|
<para><filename>systemd-hibernate-clear.service</filename></para>
|
||||||
<para><filename>/usr/lib/systemd/systemd-hibernate-resume</filename></para>
|
<para><filename>/usr/lib/systemd/systemd-hibernate-resume</filename></para>
|
||||||
</refsynopsisdiv>
|
</refsynopsisdiv>
|
||||||
|
|
||||||
@ -37,6 +39,12 @@
|
|||||||
<filename>/sys/power/resume</filename>, along with the offset in memory pages
|
<filename>/sys/power/resume</filename>, along with the offset in memory pages
|
||||||
(<filename>/sys/power/resume_offset</filename>) if supported.</para>
|
(<filename>/sys/power/resume_offset</filename>) if supported.</para>
|
||||||
|
|
||||||
|
<para>The resume device node is either passed directly through arguments, or automatically acquired
|
||||||
|
from kernel command line options and/or <varname>HibernateLocation</varname> EFI variable. The latter
|
||||||
|
will normally be cleared by <filename>systemd-hibernate-resume.service</filename> on resumption.
|
||||||
|
If a stale variable is detected, it would be cleared by
|
||||||
|
<filename>systemd-hibernate-clear.service</filename>.</para>
|
||||||
|
|
||||||
<para>Failing to initiate a resume is not an error condition. It may mean that there was
|
<para>Failing to initiate a resume is not an error condition. It may mean that there was
|
||||||
no resume image (e. g. if the system has been simply powered off and not hibernated).
|
no resume image (e. g. if the system has been simply powered off and not hibernated).
|
||||||
In such cases, the boot is ordinarily continued.</para>
|
In such cases, the boot is ordinarily continued.</para>
|
||||||
|
@ -312,6 +312,11 @@ units = [
|
|||||||
{ 'file' : 'systemd-growfs-root.service.in' },
|
{ 'file' : 'systemd-growfs-root.service.in' },
|
||||||
{ 'file' : 'systemd-growfs@.service.in' },
|
{ 'file' : 'systemd-growfs@.service.in' },
|
||||||
{ 'file' : 'systemd-halt.service' },
|
{ 'file' : 'systemd-halt.service' },
|
||||||
|
{
|
||||||
|
'file' : 'systemd-hibernate-clear.service.in',
|
||||||
|
'conditions' : ['ENABLE_HIBERNATE', 'ENABLE_EFI'],
|
||||||
|
'symlinks' : ['sysinit.target.wants/'],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
'file' : 'systemd-hibernate-resume.service.in',
|
'file' : 'systemd-hibernate-resume.service.in',
|
||||||
'conditions' : ['ENABLE_HIBERNATE'],
|
'conditions' : ['ENABLE_HIBERNATE'],
|
||||||
|
24
units/systemd-hibernate-clear.service.in
Normal file
24
units/systemd-hibernate-clear.service.in
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# SPDX-License-Identifier: LGPL-2.1-or-later
|
||||||
|
#
|
||||||
|
# This file is part of systemd.
|
||||||
|
#
|
||||||
|
# systemd is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU Lesser General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
|
||||||
|
[Unit]
|
||||||
|
Description=Clear Stale Hibernate Storage Info
|
||||||
|
Documentation=man:systemd-hibernate-clear.service(8)
|
||||||
|
|
||||||
|
ConditionPathExists=/sys/firmware/efi/efivars/HibernateLocation-8cf2644b-4b0b-428f-9387-6d876050dc67
|
||||||
|
ConditionPathExists=!/etc/initrd-release
|
||||||
|
|
||||||
|
DefaultDependencies=no
|
||||||
|
Before=sysinit.target shutdown.target
|
||||||
|
Conflicts=shutdown.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=yes
|
||||||
|
ExecStart={{LIBEXECDIR}}/systemd-hibernate-resume --clear
|
Loading…
Reference in New Issue
Block a user