unofficial mirror of bug-guix@gnu.org 
 help / color / mirror / code / Atom feed
From: Mark H Weaver <mhw@netris.org>
To: Nolan Wright <nolan.wright.other@gmail.com>
Cc: 37290@debbugs.gnu.org
Subject: bug#37290: Guix System: Hibernation
Date: Mon, 02 Sep 2019 23:24:50 -0400	[thread overview]
Message-ID: <87tv9u83j6.fsf@netris.org> (raw)
In-Reply-To: <CAEAJkaGJoYZTHjzTyLDVir-kV=HJkmh19Z8xRLuAVdyrKMWfUA@mail.gmail.com> (Nolan Wright's message of "Mon, 2 Sep 2019 17:06:31 -0400")

[-- Attachment #1: Type: text/plain, Size: 2022 bytes --]

Hi Nolan,

Nolan Wright <nolan.wright.other@gmail.com> writes:

> I have a desktop computer that sits in the same room where I
> sleep. The fans produce a noise that I would prefer not to hear when
> going to bed. For that reason, I wish to make use of the hibernation
> feature, in which the system state is suspended to disk as described
> here:
>
> https://wiki.archlinux.org/index.php/Power_management/Suspend_and_hibernate
>
> The IRC user nxck, who was very helpful, after some brief
> experimentation concluded that Guix System probably does not support
> the hibernation feature. Indeed the following comment in the source
> code suggests as much:
>
> http://git.savannah.gnu.org/cgit/guix.git/tree/gnu/services/desktop.scm#n598
>
> Additionally I found the following message in this mailing list from
> three years ago which stated that the feature is not supported:
>
> https://lists.gnu.org/archive/html/bug-guix/2016-11/msg00067.html

The message above links to an earlier message with my preliminary patch
to support hibernation:

  https://lists.gnu.org/archive/html/guix-devel/2016-08/msg00962.html

I've been carrying that patch in my local branch of Guix for 3 years.
It needs a bit more work before it's ready to include in Guix, and I'm
sorry to say that I lost motivation to work on it because it seems that
almost no one cares about hibernation today.

Anyway, I've attached below a slightly updated version of the patch that
applies cleanly to current Guix.  Quoting from the message above:

you'll also need to add a line like this to your 'operating-system'
definition.

  (kernel-arguments '("resume=/dev/sda2"))

Where the device named is a swap partition.

WARNING: Since this is preliminary work, I recommend that the first time
you test this, be prepared for the possibility that resume will fail.
So far I've only tested it with simple partitions, without encryption or
RAID.

It may be that we should add a dedicated 'resume-device' field to the
'operating-system'.  Thoughts?

      Mark



[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: [PATCH] PRELIMINARY: Add support for hibernation --]
[-- Type: text/x-patch, Size: 4608 bytes --]

From c0e9d9913b66649783a4fac05a0da4db1b79faec Mon Sep 17 00:00:00 2001
From: Mark H Weaver <mhw@netris.org>
Date: Sun, 14 Aug 2016 04:45:06 -0400
Subject: [PATCH] PRELIMINARY: Add support for hibernation.

* gnu/build/linux-boot.scm (boot-system): Look for a resume=<device-name>
argument on the linux command line, and if present, attempt to resume from
hibernation.
* gnu/services/desktop.scm (<elogind-configuration>): Change the default
value of the 'handle-hibernate-key' key to 'hibernate'.
---
 gnu/build/linux-boot.scm | 50 +++++++++++++++++++++++++++++++++++++---
 gnu/services/desktop.scm |  6 +----
 2 files changed, 48 insertions(+), 8 deletions(-)

diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm
index f273957d78..767a424e72 100644
--- a/gnu/build/linux-boot.scm
+++ b/gnu/build/linux-boot.scm
@@ -477,9 +477,10 @@ upon error."
   (call-with-error-handling
    (lambda ()
      (mount-essential-file-systems)
-     (let* ((args    (linux-command-line))
-            (to-load (find-long-option "--load" args))
-            (root    (find-long-option "--root" args)))
+     (let* ((args          (linux-command-line))
+            (to-load       (find-long-option "--load" args))
+            (root          (find-long-option "--root" args))
+            (resume-device (find-long-option "resume" args)))
 
        (when (member "--repl" args)
          (start-repl))
@@ -512,6 +513,49 @@ upon error."
          (unless (pre-mount)
            (error "pre-mount actions failed")))
 
+       ;;
+       ;; Attempt to resume from hibernation.
+       ;;
+       ;; IMPORTANT: This *must* happen before we mount any filesystems on
+       ;; disk.  Quoting linux-libre/Documentation/swsusp.txt:
+       ;; 
+       ;; * BIG FAT WARNING **************************************************
+       ;; *
+       ;; * If you touch anything on disk between suspend and resume...
+       ;; *				...kiss your data goodbye.
+       ;; *
+       ;; * If you do resume from initrd after your filesystems are mounted...
+       ;; *				...bye bye root partition.
+       ;; *			[this is actually same case as above]
+       ;; *
+       (when (and resume-device
+                  (file-exists? resume-device)
+                  (file-exists? "/sys/power/resume"))
+         (false-if-exception
+          (let* ((device-base-name
+                  ;; The base name of the device file, after resolving
+                  ;; symlinks.
+                  (let loop ((file resume-device))
+                    (match (stat:type (lstat file))
+                      ('symlink
+                       (let ((target (readlink file)))
+                         (if (string-prefix? "/" target)
+                             (loop target)
+                             (loop (string-append (dirname file) "/" target)))))
+                      (_ (basename file)))))
+                 (major+minor
+                  ;; The major:minor string (e.g. "8:2") corresponding
+                  ;; to the resume device.
+                  (call-with-input-file (string-append "/sys/class/block/"
+                                                       device-base-name
+                                                       "/dev")
+                    read-line)))
+            ;; Write the major:minor string to /sys/power/resume
+            ;; to attempt resume from hibernation.
+            (when major+minor
+              (call-with-output-file "/sys/power/resume"
+                (cut display major+minor <>))))))
+
        (setenv "EXT2FS_NO_MTAB_OK" "1")
 
        (if root
diff --git a/gnu/services/desktop.scm b/gnu/services/desktop.scm
index a32756e040..93ad9cbc82 100644
--- a/gnu/services/desktop.scm
+++ b/gnu/services/desktop.scm
@@ -595,11 +595,7 @@ include the @command{udisksctl} command, part of UDisks, and GNOME Disks."
   (handle-suspend-key              elogind-handle-suspend-key
                                    (default 'suspend))
   (handle-hibernate-key            elogind-handle-hibernate-key
-                                   ;; (default 'hibernate)
-                                   ;; XXX Ignore it for now, since we don't
-                                   ;; yet handle resume-from-hibernation in
-                                   ;; our initrd.
-                                   (default 'ignore))
+                                   (default 'hibernate))
   (handle-lid-switch               elogind-handle-lid-switch
                                    (default 'suspend))
   (handle-lid-switch-docked        elogind-handle-lid-switch-docked
-- 
2.23.0


  reply	other threads:[~2019-09-03  3:26 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-09-02 21:06 bug#37290: Guix System: Hibernation Nolan Wright
2019-09-03  3:24 ` Mark H Weaver [this message]
2019-09-03 12:36   ` Nolan Wright

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://guix.gnu.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87tv9u83j6.fsf@netris.org \
    --to=mhw@netris.org \
    --cc=37290@debbugs.gnu.org \
    --cc=nolan.wright.other@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).