systemctl
进行休眠并在复杂情况下使其正常工作pm-hibernate
总是失败。经过一些调整,我能够使用systemd的界面(16.04及以上版本的init系统)进行休眠。我还成功地在17.04上使用交换文件实现了休眠。这个案例研究可能对其他遇到问题的人有用。sudo systemctl hibernate
grep swap /etc/fstab
# swap was on /dev/mmcblk0p3 during installation
/dev/mmcblk0p3
是要指定的分区。sudoedit /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT
开头的行中,添加resume=/dev/YourSwapPartition
到引号内的部分(用之前确定的分区替换)。以我的例子为例:GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=/dev/mmcblk0p3"
sudo update-grub
命令,否则更改将不会生效。sudo systemctl hibernate
要恢复操作,请按下电源按钮,系统将启动。
如果仍然遇到问题,请开始调试。
我在下面附上我的案例作为示例,但有关调试 S 状态的详细信息可以在这篇博客和这篇博客中找到。
设置更多的引导参数以捕获更多信息。删除 quiet
和 splash
,并添加 initcall_debug
和 no_console_suspend
,这将导致 init 系统调用被打印到控制台,以便您可以观察出现了什么问题。我设置如下:
GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/mmcblk0p3 no_console_suspend initcall_debug"
dmesg
。/sys
读取任何内容、重新加载模块或执行任何 systemctl
命令)都无法工作 - 进程似乎会启动但卡住(当然,在重启后一切都会恢复正常)。观察系统非常缓慢地关闭并阅读所有调试消息后,我注意到“brcm”存在很多问题,所以我猜测是我Broadcom无线驱动程序模块的问题。果然,我调整了休眠流程以先卸载该模块。sudo modprobe -r brcmfmac
sudo systemctl hibernate
sudo modprobe brcmfmac
resume_offset=n
,其中n是sudo filefrag -v /swapfile
输出中physical_offset
下的第一个数字。$ sudo filefrag -v /swapfile
Filesystem type is: ef53
File size of /swapfile is 1425873920 (348114 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 32767: 34816.. 67583: 32768:
1: 32768.. 63487: 67584.. 98303: 30720:
....
resume_offset=34816
。您仍然需要设置一个用于从分区恢复的引导参数。这将是根分区(或者您的交换文件所在的分区)。我的参数现在是:GRUB_CMDLINE_LINUX_DEFAULT="no_console_suspend initcall_debug resume=/dev/mmcblk1p2 resume_offset=34816"
我的根分区是/dev/mmcblk1p2
(你的可能更像是/dev/sda2
)。
在恢复过程中,我看到镜像成功加载,但在我的情况下(只是一个例子 - 你的情况可能不同),一些其他驱动程序(如i2c_designware
)报错,并且在恢复时系统完全冻结。如果我卸载这些模块以及brcmfmac
,休眠功能就能正常工作,但是没有这些模块,系统很快就无法使用。因此,我编写了一个脚本,在恢复时卸载有问题的模块,并立即重新加载它们:
# remove buggy modules
modprobe -r brcmfmac i2c_designware_platform i2c_designware_core &&
# hibernate
echo disk > /sys/power/state
# reinsert
modprobe i2c_designware_core i2c_designware_platform brcmfmac
当我想要进入休眠状态时,我运行sudo bash脚本
。这非常有效。
使用systemd,在启动参数中设置从交换分区恢复,识别有问题的驱动程序并在开始休眠之前卸载它们。如果系统在没有这些模块的情况下无法正常工作,或者您需要卸载多个模块,可以使用一个简单的脚本来发起休眠。
resume
选项也必须是UUID格式,例如resume=UUID=your-swap-uuid-here
。 - Oki Erie Rinaldisudo pm-hibernate
要检查休眠功能是否在您的系统上工作(这将使您的计算机进入休眠状态)。
如果不起作用,请检查交换空间大小是否至少与RAM大小相同。
要将该选项添加到设置菜单中,您可以创建一个配置文件。打开终端窗口并运行以下命令:
sudo nano /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla
它打开一个空文件的nano。复制下面的行并粘贴到nano窗口中。
[Re-enable hibernate by default in upower]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes
[Re-enable hibernate by default in logind]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key;org.freedesktop.login1;org.freedesktop.login1.hibernate-multiple-sessions;org.freedesktop.login1.hibernate-ignore-inhibit
ResultActive=yes
根据我的测试,我至少找到了一个额外的检查项目,您应该执行。我在互联网上没有找到相关信息。
以下是一些需要检查的内容 -
检查一下你是否使用了任何 btrfs 分区。是的。根据我的测试,如果你有 btrfs 分区,休眠功能将无法正常工作。删除或将分区类型更改为 ext4
对我没有帮助。我需要移除 btrfs-tools
软件包。
sudo apt-get purge btrfs-tools
你可能还想检查其他未经充分测试的新分区类型。在不移除软件包的情况下,禁用驱动程序也可能起作用,但我没有测试过。
此外,你还需要检查是否有足够大的交换分区来容纳内存内容。如果你的内存是 4 GB,交换分区应至少为 4 GB(为了安全起见,你可以多分配几 MB)。
它涉及以下步骤
以 root 身份在 /etc/polkit-1/localauthority/50-local.d/enable-hibernate.pkla
中创建一个文件
sudo -i nano /etc/polkit-1/localauthority/50-local.d/enable-hibernate.pkla
将以下内容放入该文件中
[Re-enable hibernate by default in upower]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes
[Re-enable hibernate by default in logind]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key;org.freedesktop.login1;org.freedesktop.login1.hibernate-multiple-sessions;org.freedesktop.login1.hibernate-ignore-inhibit
ResultActive=yes
按下 Ctrl-O 保存文件。使用 Ctrl-X 退出
重新启动 polkitd
守护进程
sudo systemctl restart polkitd.service
fstab
时还挂载了哪些其他类型的分区? - Anwarvfat
用于UEFI,还有btrfs
和swap
。我怀疑这是由于硬件问题(AMD笔记本电脑)。我将在另一台使用btrfs的系统上进行测试,并向您反馈结果。 - Oxwivi/etc/fstab
中不要添加任何挂载btrfs的行。由于是新安装,Ubuntu 默认不支持btrfs,所以它无法识别它们。现在检查看看是否可以正常工作。 - Anwarbtrfs
系统上运行良好。而且我还发现,在Ubuntu中,需要禁用UEFI才能进行休眠。恭喜你,你赢得了奖励! - Oxwivibtrfs
的情况下,休眠功能是否与 btrfs
挂载一起正常工作? - Anwarbtrfs-tools
,没有做任何其他更改。 - Oxwivi(我问了一个类似的问题,要求重点关注基于systemd的回答,并在这里分享我的解决方案,以供关注此问题的人参考)
这个解决方案来自Fedora的主题(他们一段时间前就转向了systemd,所以那里有更多的资料)。
在我的情况下(在一台始终支持休眠的机器上进行了新鲜的16.04.1安装),调用已过时的sudo pm-hibernate
似乎没有任何作用,而最新的systemd方法systemctl hibernate
会返回:
Failed to hibernate system via logind: Sleep verb not supported
cat /sys/power/disk
命令得到的回答是: [disabled]
cat /sys/power/disk
命令,并得到以下结果: [platform] shutdown reboot suspend
哪个看起来更好。事实上,调用systemctl hibernate
会导致成功的休眠/唤醒序列。
此外,在那之后,我可以在图形界面的各个地方看到可用的休眠选项,而无需进行任何polkit
的修改。因此,似乎systemd
实际上是从/sys/power/disk
推测出系统无法休眠。
$ sudo systemctl hibernate
Failed to hibernate system via logind: Sleep verb not supported
创建一个与RAM大小相同或更大的交换文件。这里涉及到几个步骤,如下所示。
a. 关闭交换文件:
$ sudo swapoff -a
b. 创建一个大小等于或大于RAM的文件。我的RAM是16GB,所以:
$ sudo dd if=/dev/zero of=/swapfile bs=1G count=16
16+0 records in
16+0 records out
17179869184 bytes (17 GB, 16 GiB) copied, 19.3685 s, 887 MB/s
c. 为文件设置正确的权限:
$ sudo chmod 600 /swapfile
d. 将文件设为交换文件:
$ sudo mkswap /swapfile
Setting up swapspace version 1, size = 16 GiB (17179865088 bytes)
no label, UUID=3b2e6f0c-ce12-4a84-9044-d99bfba059ea
e. 打开交换文件并检查是否正确设置:
$ sudo swapon /swapfile
$ cat /proc/swaps
Filename Type Size Used Priority
/swapfile file 16777212 0 -2
f. 为了在重新启动后加载交换文件,我们必须将其添加到/etc/fstab
中。执行以下命令打开该文件:
$ sudo gedit /etc/fstab
并通过像下面这样添加最后一行来更新它。请注意,我还将原始的交换文件注释掉了,因为我不需要它。
/dev/mapper/vgubuntu-root / ext4 errors=remount-ro 0 1
# /boot was on /dev/nvme0n1p2 during installation
UUID=d265e7c4-1a4f-49c4-af29-fea2543490d7 /boot ext4 defaults 0 2
# /boot/efi was on /dev/nvme0n1p1 during installation
UUID=0004-FB5F /boot/efi vfat umask=0077 0 1
#/dev/mapper/vgubuntu-swap_1 none swap sw 0 0
/swapfile none swap sw 0 0
g. 重新启动并运行以下命令以查看交换文件是否显示:
cat /proc/swaps
Filename Type Size Used Priority
/swapfile file 16777212 0 -2
现在,是时候更新grub了。
a. 执行以下命令打开grub:
$ sudoedit /etc/default/grub
b. 运行以下命令查找根目录的挂载位置:
$ mount | grep " / "
/dev/mapper/vgubuntu-root on / type ext4 (rw,relatime,errors=remount-ro)
c. 因此,我的挂载点是/dev/mapper/vgubuntu-root
。通过运行以下命令找到此位置的UUID:
$ sudo blkid
/dev/mapper/nvme0n1p3_crypt: UUID="AZrE57-dlNc-BiUr-RrTF-SdT2-luVK-vrliNq" TYPE="LVM2_member"
/dev/mapper/vgubuntu-root: UUID="2331fe68-3e7a-4937-9cfa-74fc7a4b79f6" TYPE="ext4"
/dev/nvme0n1p1: UUID="0004-FB5F" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="09813156-6b7a-4fc2-b644-a8c6b7d40abf"
/dev/nvme0n1p2: UUID="d265e7c4-1a4f-49c4-af29-fea2543490d7" TYPE="ext4" PARTUUID="64f5da2f-71d3-4f02-9b1e-3e12d7f6c445"
/dev/nvme0n1p3: UUID="201acba5-ff20-46ee-9000-34efefef3fbe" TYPE="crypto_LUKS" PARTUUID="16858e70-eb08-4de8-b944-50689cad9d9f"
/dev/sda1: LABEL="ST64GB" UUID="624AB7B308FE9F38" TYPE="ntfs" PTTYPE="dos"
/dev/mapper/vgubuntu-swap_1: UUID="af3b29a2-ba6b-44de-89dd-072f4233aaf9" TYPE="swap"
在这种情况下,UUID是2331fe68-3e7a-4937-9cfa-74fc7a4b79f6
。记住这个UUID。
d. 接下来,我们需要找到交换文件的偏移量。运行以下命令:
$ sudo filefrag -v /swapfile
Filesystem type is: ef53
File size of /swapfile is 17179869184 (4194304 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 32767: 835584.. 868351: 32768:
1: 32768.. 49151: 868352.. 884735: 16384:
2: 49152.. 81919: 886784.. 919551: 32768:
...
我们找到第一个块的物理偏移量。在上面的情况下,它将是835584
。也记住这个数字。
e. 现在,我们需要更新grub。运行以下命令:
$ sudoedit /etc/default/grub
使用以下内容进行更新。我们更新GRUB_CMDLINE_LINUX_DEFAULT
并添加GRUB_RECORDFAIL_TIMEOUT=0
。
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
# info -f grub -n 'Simple configuration'
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=2331fe68-3e7a-4937-9cfa-74fc7a4b79f6 resume_offset=835584"
GRUB_CMDLINE_LINUX=""
# Avoiding grub to show up in boot when resuming from hibernation
GRUB_RECORDFAIL_TIMEOUT=0
f. 更新grub文件后,运行此命令:
$ sudo update-grub
$ sudo systemctl hibernate
hibernate
软件包,重新启动然后运行sudo hibernate-disk
是有效的。我相信可以将其添加到菜单中,但对我来说不值得花时间去做。这个指令适用于我的Ubuntu 18.04安装。
sudo apt install hibernate
它会安装hibernate和其他所需的依赖项来进行休眠grep swap /etc/fstab
(找到UUID)sudoedit /etc/default/grub
在GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"行添加swap的UUID。行看起来像这样GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=swap的UUID"sudo update-grub
sudo systemctl hibernate
。如果一切正常,添加菜单项。sudo gedit /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla
现在粘贴以下内容:[Re-enable hibernate by default in upower]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes
[Re-enable hibernate by default in logind]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key;org.freedesktop.login1;org.freedesktop.login1.hibernate-multiple-sessions;org.freedesktop.login1.hibernate-ignore-inhibit
ResultActive=yes
/etc/default/grub
中,考虑使用update-initramfs -u -k all
来更新initramfs,并查找类似于The initramfs will attempt to resume from /dev/dm-0
的消息。这将自动设置恢复设备。 - ukossudo nano /var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkla
查找这些部分(它们彼此紧挨着):
[Disable hibernate by default in upower] Identity=unix-user:* Action=org.freedesktop.upower.hibernate ResultActive=no
[Disable hibernate by default in logind] Identity=unix-user:* Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key; ResultActive=no
将ResultActive=no更改为ResultActive=yes。
编辑:Gunnar 指出,如果某个软件包更新,则该文件将被覆盖,因此根据您的意图,这很可能不是最佳解决方案。
来源:http://www.zedt.eu/tech/linux/enable-hibernation-xubuntu-16-04/
/etc
目录中的文件默认情况下是不存在的。它是一个你自己创建的配置文件。根据你上面的建议,编辑一个属于软件包的文件是个不好的建议,因为在下次软件包更新时会被覆盖掉。 - Gunnar Hjalmarsson编辑/etc/default/grub
文件,添加以下行:
GRUB_CMDLINE_LINUX_DEFAULT="splash quiet pci=nomsi RESUME=UUID=92781adb-f2a6-4f15-88fc-e1ce801291dd"
pci=nomsi
是关键。sudo pm-hibernate
来测试您的机器。sudo gedit /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla
[Re-enable hibernation]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes
com.ubuntu.enable-hibernate.pkla
文件中的内容不完整。请参考NirajW发布的答案。 - Gunnar Hjalmarsson
sudo pm-hibernate
能用吗? - Pilot6systemctl hibernate
,所以也许不是重复问题...或者至少需要更新答案才能使旧问题成为重复问题的有效解答。 - Zannauname -r
(如果你已经知道了,请原谅)。 - WinEunuuchs2Unixfree
命令的输出,这样我们可以确定您是否有足够的交换空间设置来成功进入休眠状态。 - Elder Geek