我应该如何成功休眠Ubuntu 16.04?
我已经尝试了网络上几乎所有的解决方案,但实际上没有一个有用。我发现我的问题几乎完全与此相似
sudo pm-hibernate
工作吗?
systemctl hibernate
所以也许不应该使用重复...或者至少需要更新后的答案才能使旧问题有效以重复
uname -r
终端(道歉,如果你已经知道这一点)。
我应该如何成功休眠Ubuntu 16.04?
我已经尝试了网络上几乎所有的解决方案,但实际上没有一个有用。我发现我的问题几乎完全与此相似
sudo pm-hibernate
工作吗?
systemctl hibernate
所以也许不应该使用重复...或者至少需要更新后的答案才能使旧问题有效以重复
uname -r
终端(道歉,如果你已经知道这一点)。
Answers:
systemctl
并使其在困难的情况下正常工作对我来说,pm-hibernate
总是失败。经过一些调整后,我能够使用systemd界面(在16.04及更高版本中初始化system)进入休眠状态。我还设法通过交换文件使它在17.04上运行。此案例研究可能对其他有问题的人有用。
第一次尝试:
sudo systemctl hibernate
如果失败,则开始进行故障排除:在休眠状态(HTD或ACPI S4)中,将计算机状态写入磁盘,因此无需电源即可保留它。状态被写入交换分区或交换文件。注意:如果使用BTRFS,请勿尝试使用交换文件,因为这可能会导致文件系统损坏
你的交换分区或交换文件可能需要大小为RAM,让冬眠一样,但你将能够冬眠,如果它是至少2/5的RAM大小一个很好的机会,根据该拱门wiki页面,因此请先尝试其他步骤,然后再增加交换大小。
如果您的问题是干净启动而不是预期的恢复,则最有可能需要设置启动参数来查找磁盘映像。
找到您的交换分区:
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
这将导致初始化系统调用将被打印到控制台上,所以你可以看什么错误。我设置这个:
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
在Arch Wiki页面的帮助下,再次进行了一些其他修改,我设法通过一个交换文件使休眠状态在17.04上工作。这需要一个附加的引导参数,resume_offset=n
其中n是以下physical_offset
输出中的第一个数字sudo filefrag -v /swapfile
:
$ 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,为从交换中恢复设置引导参数,识别有问题的驱动程序并在启动休眠模式之前将其卸载。如果没有这些模块,系统无法长期运行,或者您需要卸载其中的几个模块,则使用简单的脚本启动休眠状态可能会更容易。
您可以使用
sudo 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
然后保存更改并关闭nano,然后重新启动系统,以使Hibernate可用出现在“电源选项”上。
参考:如何休眠计算机?在Ubuntu 16.04的官方文档中。
希望它能工作。在尝试了所有其他选择之后,这对我有用。
我认为,如Ubuntu Wiki中所述,如何为16.04答案启用休眠模式是众所周知的(如果需要这些步骤,请参见下文)。但是我认为需要检查的东西并不彻底。至少,这就是我发现的。
通过我自己的测试,我至少发现了您应该执行的另一项检查。我在Internet的任何地方都找不到它。
这是一些检查-
检查您是否没有使用任何btrfs分区。是的。通过测试,我发现如果您具有btrfs分区,则休眠将无法工作。删除或更改分区类型对ext4
我没有帮助。我需要删除btrfs-tools
包装。
sudo apt-get purge btrfs-tools
您可能要检查未经过良好测试的其他新分区类型。在不删除软件包的情况下,将驱动程序列入黑名单也可能有效,但是我尚未对此进行测试。
另外,您还需要检查交换分区的大小足以容纳RAM的内容。如果您的RAM为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
它应该启用休眠模式。
btrfs-tools
根据您的说明进行了清除。仍然无法休眠。
vfat
UEFI和btrfs
和swap
。我实际上怀疑这是由于硬件(AMD笔记本电脑)引起的。我将使用btrfs在另一个系统上对此进行测试,然后再回头给您。
(我问了一个类似的问题,要求关注基于系统的答复,在这里向关注此问题的人分享我的解决方案)
该解决方案来自Fedora主题(他们在不久前切换到systemd,因此在那里有更多资料)。
在我的情况下(将新的16.04.1安装在始终支持休眠的计算机上),调用过时sudo pm-hibernate
似乎没有任何作用,而最新的systemd方法systemctl hibernate
将返回:
Failed to hibernate system via logind: Sleep verb not supported
事实证明,安全启动才是罪魁祸首:安装16.04时,系统会询问您要对其进行什么操作(就我所记得这是新事物),并且我一直在不加思索的情况下将其保持打开状态。
在安全启动为ON的机器上,cat /sys/power/disk
回答:
[disabled]
重新启动并在BIOS设置中禁用安全启动后(这些设置是特定于计算机的,但通常非常简单),我尝试了一下cat /sys/power/disk
并得到:
[platform] shutdown reboot suspend
看起来更好。实际上,调用会systemctl hibernate
导致成功的休眠/解冻序列。
此外,在那之后,我可以看到在图形界面的各个位置都可以使用休眠选项,而无需进行任何改动polkit
。因此,似乎systemd
实际上是在猜测/sys/power/disk
系统无法休眠。
该说明适用于我的Ubuntu 18.04安装。
sudo apt install hibernate
它将安装休眠和休眠所需的其他依赖项 grep swap /etc/fstab
(fing UUID)sudoedit /etc/default/grub
在GRUB_CMDLINE_LINUX_DEFAULT =“ quiet splash”行中,添加交换的UUID。该行如下所示:GRUB_CMDLINE_LINUX_DEFAULT =“ quiet splash resume = UUID of swap”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
考虑使用更新initramfs update-initramfs -u -k all
并查找类似的消息The initramfs will attempt to resume from /dev/dm-0
。这将自动设置恢复设备。
根据我对kelvinelove的回答的评论,他建议编辑的文件在我的系统上不存在(新的Ubuntu 16.04)。相反,我这样做:
sudo nano /var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkla
查找以下部分(它们彼此正确):
[默认情况下禁用上层休眠模式] Identity = unix-user:* Action = org.freedesktop.upower.hibernate ResultActive = no
[默认情况下在登录时禁用休眠] Identity = unix用户:* Action = org.freedesktop.login1.hibernate; org.freedesktop.login1.handle-hibernate-key; ResultActive =否
两者都将ResultActive = no更改为ResultActive = yes。
编辑:Gunnar指出,如果更新某个程序包,此文件将被覆盖,因此根据您的意图,它很可能不是最佳解决方案。
来源:http : //www.zedt.eu/tech/linux/enable-hibernation-xubuntu-16-04/
/etc
默认情况下,不应存在其中的文件。这是您创建的配置文件。如您上面建议的那样,编辑程序包拥有的文件是一个不明智的建议,因为在下次程序包更新时它将被覆盖。
首先,我确实建议您测试计算机是否支持休眠,因为默认情况下禁用休眠的原因是因为有时在某些计算机上会产生不愉快的结果。通过打开终端(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
此后,重新启动计算机,然后登录,您应该在电源菜单的右上角设置菜单中看到一个休眠选项。
at all
com.ubuntu.enable-hibernate.pkla
。请参阅NirajW发布的答案。
这里有一些很好的资源可以帮助您解决Ubuntu下一些较常见的休眠问题。
就我而言,要在Lenovo u300上运行Ubuntu 16.10,为了使休眠正常工作,我必须执行以下操作:
编辑/etc/default/grub
以包括以下行:
GRUB_CMDLINE_LINUX_DEFAULT="splash quiet pci=nomsi RESUME=UUID=92781adb-f2a6-4f15-88fc-e1ce801291dd"
RESUME引用您的特定交换文件UUID。特别是在我的机器上,设置pci=nomsi
是关键。
祝你好运!
您必须付出一点努力才能手动启用它。默认情况下已禁用。
http://ubuntuhandbook.org/index.php/2014/04/enable-hibernate-ubuntu-14-04/
然后,如果它不起作用,则可能是4.4.0内核问题,您可能必须升级内核。