问题描述
我应该如何成功地休眠Ubuntu 16.04?
我已经尝试了几乎所有的网络解决方案,但没有它们实际上是有帮助的。我发现我的问题几乎完全类似于this one
最佳解决方法
您可以使用
sudo pm-hibernate
检查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
然后保存更改并关闭nano并重新启动系统以使Hibernate可用于”Power options”。
参考:Ubuntu 16.04官方文档中的How do I hibernate my computer?。
希望它有效。在尝试所有其他选项后,这对我有用。
次佳解决方法
使用systemctl
进行休眠并使其在困难的情况下工作
对我来说,pm-hibernate
总是失败。经过一些调整后,我能够使用systemd(16.04及更高版本的init系统)的界面进行休眠。我还设法使用交换文件在17.04上运行它。本案例研究可能对有问题的其他人有用。
第一次尝试:
sudo systemctl hibernate
如果失败,则开始排除故障:在休眠状态(HTD或ACPI S4)中,机器状态被写入磁盘,因此不需要电源来保护它。状态被写入交换分区或交换文件。注意:如果使用BTRFS,请勿尝试使用交换文件,因为这可能会导致文件系统损坏
您的交换分区或交换文件可能需要与RAM相同以允许休眠,但根据Arch wiki页面,如果它至少是RAM大小的2/5,则很有可能可以休眠。 ,所以在增加交换大小之前先尝试其他步骤。
如果您的问题是您获得了干净启动而不是预期的恢复,那么您至少需要设置启动参数来查找磁盘映像
找到你的交换分区:
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状态的详细信息可以在in this blog和also this one中找到。
设置一些更多启动参数以捕获更多信息。删除quiet
和splash
并添加initcall_debug
和no_console_suspend
,这将导致init系统调用打印到控制台,以便您可以查看出错的地方。我这样设定:
GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/mmcblk0p3 no_console_suspend initcall_debug"
这让我看到了从休眠状态恢复的问题。
在我的情况下,恢复后我丢失了WiFi,内核显然很不高兴,因为大多数命令(例如从/sys
读取任何内容,重新加载模块或任何systemctl
命令)都不起作用 – 该过程似乎开始并挂起(所有这些重启后会恢复正常)。看着系统非常慢地关闭并读取所有调试消息,我注意到”brcm”存在很多问题,所以我猜测我的Broadcom无线驱动模块应该受到指责。果然我调整了我的休眠程序,先卸载模块:
sudo modprobe -r brcmfmac
sudo systemctl hibernate
在简历上我重新插入模块
sudo modprobe brcmfmac
一切都很完美。我还必须将btsdio
模块列入黑名单,该模块似乎与brcmfmac
不兼容
更新:使用17.04上的交换文件进行休眠。
再一次在Arch wiki页面的帮助和一些额外的修补工作之后,我设法通过交换文件在17.04进行休眠。这需要一个额外的引导参数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
)。
在恢复期间,我看到图像加载成功,但在我的情况下(只是一个例子 – YMMVAPD)然后一些更多的驱动程序(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 script
。这很好用。
长话短说
使用systemd,为swap恢复设置启动参数,识别错误的驱动程序并在启动休眠之前卸载它们。如果系统在没有这些模块的情况下无法长时间工作,或者您需要卸载多个模块,则使用简单的脚本启动休眠可能更容易。
第三种解决方法
我认为,如何在Ubuntu Wiki中描述如何为16.04应答启用hibernate(如果需要,请参见下文)。但我认为需要检查的事情并不彻底。至少,这就是我发现的。
要检查的事情
根据我自己的测试,我至少找到了一个你应该执行的额外检查。我还没有在互联网上的任何地方找到它。
这是一些检查 –
-
检查您是否使用了任何btrfs分区。是。从我的测试中,我发现如果你有btrfs分区,hibernate将无法正常工作。删除或更改分区类型为
ext4
对我没有帮助。我需要删除btrfs-tools
包。sudo apt-get purge btrfs-tools
您可能想要检查未经过良好测试的其他新分区类型。如果不删除软件包,将驱动程序列入黑名单也可能有效,但我还没有测试过。
-
此外,您需要检查是否有足够大的交换分区来容纳RAM的内容。如果您的RAM是4 GB,则交换应至少为4 GB(您应该分配更多的MB以确保安全)。
启用hibernate的步骤
它涉及这些步骤
-
在
/etc/polkit-1/localauthority/50-local.d/enable-hibernate.pkla
中以root身份创建文件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
它应该启用休眠。
第四种方法
安全启动
(我问了一个similar question,要求关注systemd-based的回复,在这里分享我的解决方案给这个问题的人)
这个解决方案来自Fedora主题(他们不久前切换到systemd,所以那里有更多的材料)。
在我的情况下(在总是支持休眠的机器上安装新的16.04.1),调用过时的sudo pm-hibernate
似乎没有做任何事情,并且最新的systemd方法systemctl hibernate
将返回:
Failed to hibernate system via logind: Sleep verb not supported
事实证明,安全启动是罪魁祸首:安装16.04你被问到你想用它做什么(据我 memory 这是一个新事物)并且我保持开启而没有多想。
在安全启动开启的机器上,cat /sys/power/disk
回答:
[disabled]
重新启动并在BIOS设置中禁用安全启动(这些是machine-specific,但通常非常简单)我尝试了cat /sys/power/disk
并得到:
[platform] shutdown reboot suspend
看起来更好。实际上,调用systemctl hibernate
会导致成功的休眠/解冻序列。
此外,之后我可以在图形界面的各个位置看到休眠作为选项,而无需任何polkit
hack。所以似乎systemd
实际上是从/sys/power/disk
猜测系统无法休眠。
第五种方法
扩展我自己对kelvinelove的答案的评论,他建议编辑的文件在我的系统上不存在(新的Ubuntu 16.04)。相反,我这样做了:
-
sudo nano /var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkla
-
查看这些部分(它们是相互正确的):[默认情况下禁用hibernate upower] Identity = unix-user:* Action = org.freedesktop.upower.hibernate ResultActive = no [默认情况下在logind中禁用hibernate] Identity = unix-user: * Action = org.freedesktop.login1.hibernate; org.freedesktop.login1.handle-hibernate-key; ResultActive =无
-
对于这两者,将ResultActive = no更改为ResultActive = yes。
-
按Ctrl + O保存文件。
-
重新启动计算机
-
Hibernate选项现在可在电源菜单中使用。
编辑:Gunnar指出,如果某个软件包更新,该文件会被覆盖,因此根据您的意图,它很可能不是最佳解决方案。
资料来源:http://www.zedt.eu/tech/linux/enable-hibernation-xubuntu-16-04/
第六种方法
首先,我建议您测试您的计算机是否支持休眠,因为默认情况下禁用休眠的原因是因为它有时会在某些计算机上产生令人不快的结果。通过打开终端(Ctrl
+ Alt
+ T
)然后键入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
在此之后,重新启动计算机,登录后,您应该会在右侧设置角的电源菜单上看到添加了休眠选项。
第七种方法
这里有一些非常好的资源可以帮助你解决Ubuntu下一些比较常见的hibernate问题。
在我的例子中,在联想u300s上运行Ubuntu 16.10,为了让hibernate正常工作,我必须执行以下操作:
-
创建一个appropriately-sized交换文件(我通常设置为大约1x,但我听说高达1.6x和2x)
-
编辑
/etc/default/grub
以包含以下行:GRUB_CMDLINE_LINUX_DEFAULT =“splash quiet pci = nomsi RESUME = UUID = 92781adb-f2a6-4f15-88fc-e1ce801291dd”
RESUME引用您的特定交换文件UUID。特别是在我的机器上设置pci=nomsi
是关键。
祝你好运!