使用 uswusp 进行 Hibernate 和交换文件

使用 uswusp 进行 Hibernate 和交换文件

我已经在笔记本中配置了新的 Ubuntu 安装以使用交换文件,而不是使用交换分区。

默认情况下,无法使用交换文件让 Ubuntu 进入休眠状态,因此我尝试本教程,但它具体到grub1Ubuntu 现在使用grub2

有人知道怎么做这个吗?

答案1

以下是我为使其与 Ubuntu 18.04 兼容所做的操作。

  • 确保你的/swapfile内存至少与你的 RAM 大小相同
sudo swapoff /swapfile
sudo dd if=/dev/zero of=/swapfile bs=$(cat /proc/meminfo | awk '/MemTotal/ {print $2}') count=1024 conv=notrunc
sudo mkswap /swapfile
sudo swapon /swapfile
  • 请记下包含以下内容的分区的 UUID /swapfile
$ sudo findmnt -no UUID -T /swapfile
20562a02-cfa6-42e0-bb9f-5e936ea763d0
  • 重新配置包uswsusp以便正确使用交换文件:
sudo dpkg-reconfigure -pmedium uswsusp
# Answer "Yes" to continue without swap space
# Select "/dev/disk/by-uuid/20562a02-cfa6-42e0-bb9f-5e936ea763d0" replace the UUID with the result from the previous findmnt command
# Encrypt: "No"
  • 使用编辑 SystemD 休眠服务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
  • 请注意您的恢复偏移量/swapfile
$ sudo swap-offset /swapfile
resume offset = 34818
  • /etc/default/grub通过编辑和修改以下行来配置 Grub 以从交换文件恢复:
GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=20562a02-cfa6-42e0-bb9f-5e936ea763d0 resume_offset=34818 quiet splash"
  • 更新 Grub:
sudo update-grub
  • 创建以下内容/etc/initramfs-tools/conf.d/resume
RESUME=UUID=20562a02-cfa6-42e0-bb9e-5e936ea763d0 resume_offset=34816
    # Resume from /swapfile
  • 更新 initramfs:
sudo update-initramfs -u -k all

现在您就可以使用 进行休眠了sudo systemctl hibernate

还可以创建这些脚本:

sudo tee /usr/local/bin/gotosleep <<EOF
dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
sleep 2
sudo /usr/sbin/s2both
EOF
sudo chmod +x /usr/local/bin/gotosleep
sudo tee /usr/local/bin/gotohibernation <<EOF
dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
sleep 2
sudo systemctl hibernate
EOF
sudo chmod +x /usr/local/bin/gotohibernation

因此,您可以带着 睡觉gotosleep或冬眠gotohibernation

您必须能够执行sudo s2bothsudo s2ram并且sudo systemctl hibernate无需输入密码才能使前面的脚本起作用。

例如,您可以通过创建一个powerdev组、将当前用户添加到其中并配置以下 sudoers 配置(使用 进行编辑sudo visudo -f /etc/sudoers.d/powerdev)来做到这一点:

%powerdev ALL=NOPASSWD: /usr/sbin/s2both, /usr/sbin/s2ram, /bin/systemctl hibernate

所用文档:

答案2

使用 uswusp 进行 Hibernate 和交换文件

虽然可以通过设置内核参数来切换文件,并且据说可以通过 systemd 休眠来工作。但是,我无法让它恢复,因此改用uswsusp(用户空间软件暂停)。以下是我在 Ubuntu 17.04/17.10 上使用的步骤。

创建交换文件

创建格式化的 4GiB 交换文件、挂载并添加到的命令/etc/fstab

sudo fallocate -l 4g /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab

验证交换文件分区

sudo findmnt -no SOURCE,UUID -T /swapfile
> /dev/sda1 11cc33ee-1234-abcd-1234-ddeeff112233

安装用户空间软件暂停(美国)

sudo apt install uswsusp

配置 uswsusp

创建/etc/uswsusp.conf并重新创建initramfs

sudo dpkg-reconfigure -pmedium uswsusp
  • Yes到 '在没有有效交换空间的情况下继续吗?(向导尚未设置交换文件。)
  • 选择分割交换文件所在的位置,请与findmnt上面的详细信息进行交叉引用。(笔记:不是交换文件本身

注意:任何手动更改都/etc/uswsusp.conf需要initramfs随后使用此命令重新创建:

sudo update-initramfs -u

测试 uswusp hibernate

sudo s2disk

snapshot休眠和恢复时屏幕上应该有消息。

将 s2disk 与 systemd hibernate 结合使用

默认情况下,systemd 将使用它自己的休眠命令,因此通过覆盖以下命令将它们替换为 uswusp 命令systemd-hibernate.service

sudo systemctl edit systemd-hibernate.service

在打开的文本编辑器中输入以下文本(需要空白的 ExecStart)。然后保存并退出:

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

这将创建/etc/systemd/system/systemd-hibernate.service.d/override.conf包含覆盖详细信息的文件。

测试 systemd 休眠:

systemctl hibernate 

注意:要检查 systemdoverride.conf是否已创建、加载且没有错误,请运行:

systemctl status systemd-hibernate.service

参考:

答案3

Ubuntu 22.04

乌斯沃普已弃用。你仍然可以使用它Ubuntu <= 20.04要在 Ubuntu 22.04 上查找交换偏移量:

  • Run sudo filefrag -v /swapfile
  • "physical_offset"列中,复制第一个行号(不带点!)。值示例:1234567

来源:如何在 Ubuntu 上启用休眠模式(使用交换文件时)

对于 Ubuntu 22.04,所有其他步骤保持不变,因此除了安装和使用之外,您可以按照其他答案进行操作乌斯沃普

答案4

由于之前的答案似乎没有一个能完全涵盖所有方面,因此这里列出了所有对我有用的步骤,使一切在 Debian Bullseye 上顺利运行,因此应该适用于 Ubuntu 22,希望更高版本也能使用 grub2,而无需使用不再存在的软件包uswsusp和整个s2*工具。我希望这也适用于较低版本:

  1. 假设我们已经准备好了名为 的交换文件/tmpdisk/system/swap.file。如何准备,请参阅示例这个答案
  2. 通过确定交换文件在分区上的第一个片段的位置来获取有关交换偏移的信息,例如:

# filefrag -v /tmpdisk/system/swap.file

获取结果,其中偏移量是第一个物理偏移量片段号

Filesystem type is: ef53
File size of /tmpdisk/system/swap.file is 68719476736 (16777216 blocks of 4096 bytes)  
ext:     logical_offset:        physical_offset: length:   expected: flags:
  0:        0..   63487:      34816..     98303:  63488:             
  1:    63488..  126975:     100352..    163839:  63488:      98304:
  2:   126976..  190463:     165888..    229375:  63488:     163840:


# filefrag -v /tmpdisk/system/swap.file | awk '$1=="0:" {print substr($4, 1, length($4)-2)}'
可以通过直接获取偏移量值的简单操作来检索相同的信息:
34816

  1. 找到包含交换文件的分区的 UUID(在我的例子中,文件/tmpdisk/system/swap.file放在分区上,挂载在挂载点上/tmpdisk,因此):

# findmnt -no UUID,SOURCE -T /tmpdisk
结果是这样的
6b127402-e917-4ab0-9490-00faa74e88e5 /dev/sdb1

  1. 使用获取的包含交换文件的分区的 UUID 和偏移量/etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=6b127402-e917-4ab0-9490-00faa74e88e5 resume_offset=34816"

  1. 使用获取的包含交换文件的分区的 UUID 和偏移量/etc/initramfs-tools/conf.d/resume

按照以下方式

resume=UUID=6b127402-e917-4ab0-9490-00faa74e88e5
resume_offset=34816
  1. 更新所有使用的内核的 ramdisk:

# update-initramfs -u -k all

  1. 更新 grub:

# update-grub

就是这样...


备注:UUID=6b127402-e917-4ab0-9490-00faa74e88e5 和 resume_offset=34816 的值在每个系统上都是单独的。

相关内容