在 Ubuntu 18.04 上掛起,不使用 uswsusp 和 s2ram 儲存狀態

在 Ubuntu 18.04 上掛起,不使用 uswsusp 和 s2ram 儲存狀態

我無法讓「掛起」功能在 Ubuntu 18.04 上正常運作。然而 Hibernate 功能如預期運作。

問題描述:當我從電源選單或「sudo systemctl suspend」使用掛起時,行為是:

  • 機器進入睡眠模式,電源按鈕 LED 緩慢閃爍(呼吸)。
  • 當筆記型電腦重新啟動時,作業系統啟動,我看到通常的登入畫面,但正在運行的應用程式都沒有恢復。

到目前為止我所做的:

$ sudo apt-get install uswsusp
$ sudo update-initramfs -u
$ sudo systemctl edit systemd-suspend.service

我將以下幾行貼到 systemd-suspend.service 中:

[Service]
ExecStart=
ExecStartPre=-/bin/run-parts -v -a pre /usr/lib/systemd/system-sleep
ExecStart=/usr/sbin/s2ram
ExecStartPost=-/bin/run-parts -v --reverse -a post /usr/lib/systemd/system-sleep
  • 保存了文件。它保存在 /etc/systemd/system/ 中
  • 跑步:

    $ sudo systemctl 守護程式重新載入

  • 測試一下:

    $ sudo systemctl 暫停

結果如上所述,筆記型電腦處於睡眠狀態,但重新啟動時不會恢復已儲存的會話。

我確實知道正在呼叫 systemd-suspend.service 腳本。如果我將 ExecStart=/usr/sbin/s2ram 行更改為 ExecStart=/usr/sbin/s2disk,則筆記型電腦將進入休眠狀態並恢復會話。

附加資訊:

為了讓 Hibernate 工作,我更改了 grub:

sudoedit /etc/default/grub

改變了這一行:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
 to:
GRUB_CMDLINE_LINUX_DEFAULT="no_console_suspend initcall_debug resume=UUID=<string of hex> resume_offset=34816"
  • 然後跑:

    $ sudo 更新 grub

內核資訊:

lsb_release -a

Distributor ID: Ubuntu
Description:    Ubuntu 18.04.2 LTS
Release:    18.04
Codename:   bionic

uname -a 
Linux <machinename> 4.18.0-21-generic #22~18.04.1-Ubuntu SMP Thu May 16 15:07:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux


sudo s2ram -K
This kernel has KMS support.

我是否缺少某些步驟或設定項?

答案1

經過長時間尋找答案並把頭撞在桌子上後,我透過將各種來源的零碎資訊拼湊在一起,自己得出了一個解決方案。該解決方案適用於我運行 Ubuntu 18.04 的 Sony Vaio 型號 VPCEB15FM,您的情況可能會有所不同。

讓休眠/掛起正常運作的部分問題是 Ubuntu 載入和指派 /dev/sda2、/dev/sdb2 等的方式,因為磁碟機分配順序有時會在每次啟動時變更。所以第一步是識別交換分割區的UUID。由於 UUID 是恆定的,因此它是一個更可靠的安裝點。

UUID 可以從以下位置取得:

sudo blkid

尋找顯示“交換”的條目

/dev/sda2: UUID="5c555600-2e37-477d-62df-6013d61dc36" TYPE="swap" PARTUUID="2f501554-02"

您的 UUID 將與我的不同。別用我的,用你的。

如果您使用交換檔案而不是交換分割區,請使用主 Linux 分割區的 UUID,並且您還需要知道交換檔案的偏移量。

若要取得交換文件的偏移量:

sudo filefrag -v /swapfile

輸出將類似以下內容:

ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..   32767:      34816..     67583:  32768:            
   1:    32768..   63487:      67584..     98303:  30720:            
   2:    63488..   96255:     100352..    133119:  32768:      98304:

您要找的偏移量是第一個“physical_offset”,在本例中為 34816。

現在您已掌握開始所需的資訊。

修改/etc/default/grub

sudoedit /etc/default/grub

更改行:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

如果使用交換分區來:

GRUB_CMDLINE_LINUX_DEFAULT="no_console_suspend initcall_debug resume=UUID=5c555600-2e37-477d-62df-6013d61dc36"

如果使用交換文件來:

GRUB_CMDLINE_LINUX_DEFAULT="no_console_suspend initcall_debug resume=UUID=5c555600-2e37-477d-62df-6013d61dc36 resume_offset=34816"

安裝 uswsusp。
這將安裝 s2disk、s2ram 和 s2both 方法。

sudo apt-get install uswsusp

設定 systemd-hibernate.service 和 systemd-suspend.service。
這些檔案位於 /etc/systemd/system/ 中,如果它們尚不存在,則會在那裡建立。

sudo systemctl edit systemd-hibernate.service

貼上這些行:

[Service]
ExecStart=
ExecStartPre=-/bin/run-parts -v -a pre /lib/systemd/system-sleep
ExecStart=/usr/sbin/s2disk
ExecStartPost=-/bin/run-parts -v --reverse -a post /lib/systemd/system-sleep

注意:我的系統有一個 /lib/systemd/system-sleep 的路徑,其他系統可能有不同的位置,例如 /usr/lib/systemd/system-sleep。

sudo systemctl edit systemd-suspend.service

貼上這些行:

[Service]
ExecStart=
ExecStartPre=-/bin/run-parts -v -a pre /lib/systemd/system-sleep
ExecStart=/usr/sbin/s2both
ExecStartPost=-/bin/run-parts -v --reverse -a post /lib/systemd/system-sleep

注意在「掛起」配置中使用 s2both 而不是 s2ram。 s2ram 不能在我的系統上工作,但 s2both 總是可以。

Ubuntu 18.04 和 20.04:

編輯/etc/uswsusp.conf。

使用 UUID,如果使用交換文件,則使用偏移量:

sudo nano /etc/uswsusp.conf

修改為使用您的 UUID 等。

# /etc/uswsusp.conf(5) -- Configuration file for s2disk/s2both 
resume device = UUID=5c555600-2e37-477d-62df-6013d61dc36
compress = y
# early writeout = y
# image size = 1741570539
# RSA key file = /etc/uswsusp.key
shutdown method = platform
# only needed if using a swapfile
# resume offset = 34816

注意:uswsusp.conf 有一個手冊頁,完整描述了所有參數。還有很多其他設置,這是最低要求。註解行被保留,以便您可以看到一些其他選項。

烏班圖22.04:

編輯/etc/suspend.conf。

09-16-2022 /etc/uswsusp.conf 檔案已替換為 /etc/suspend.conf

看:https://wiki.archlinux.org/title/Uswsusp

sudo nano /etc/suspend.conf

只有 ”恢復設備" 線路與上面的說明有所不同,其他一切都可以保持不變。

使用這一行代替:

resume device = /dev/disk/by-label/swap

編輯/etc/initramfs-tools/conf.d/resume

sudo nano /etc/initramfs-tools/conf.d/resume

新增此行:RESUME=UUID=5c555600-2e37-477d-62df-6013d61dc3

注意:如果使用交換文件,則需要新增偏移量。在UUID後面加上:resume offset = 34816

好的,這應該處理各種配置項。

更新 grub 和 initramfs:

sudo update-grub
sudo update-initramfs -u  or update-initramfs -u -k all  to do all kernels

重新啟動Ubuntu。
重新啟動後測試休眠和掛起功能。 Hibernate 可能需要幾分鐘的時間才能將復原檔案寫入交換區並關閉電腦。請勿恐慌.暫停速度有點快。

全部測試一下!

sudo systemctl hibernate
sudo systemctl suspend

你應該看到什麼

  • 休眠 - 完全關閉系統,需要幾分鐘。重新啟動電腦並重新登入後,您的應用程式應該會恢復。注意:恢復過程可能需要幾分鐘時間,並且在恢復發生時電腦可能會出現掛起狀態。要有耐心。
  • 掛起 - 系統進入「睡眠」模式,電源指示燈緩慢閃爍(呼吸)。按下主電源按鈕可喚醒機器。您應該會看到登入畫面,並且您的應用程式應該會恢復。

進一步的步驟
您應該能夠從電源選單下拉選單進入睡眠/掛起模式。開啟下拉式選單時,按 Alt 鍵。電源圖示應變更為睡眠圖示。

也可以新增休眠選單選項。已經有一些很好的教程可以透過搜尋“ubuntu add hibernate power menu”找到

相關內容