如何在 Linux Mint 20 Cinnamon (Ubuntu 20) 上启用休眠并防止意外唤醒?
答案1
以下内容最初是作为问题的一部分发布的,所以我(特登)我在这里复制它。
更新:我在第 4 节中遇到了一些与我的脚本不一致的情况,该脚本本应在每次唤醒时执行。事实证明,/proc/acpi/wakeup
设置只能重置有时。不是每次关机/重新启动/休眠/挂起时。因此,我的脚本有时会启用唤醒。我已经更新了脚本。现在它检查是否显示已启用任何地方然后/proc/acpi/wakeup
才输出到它。
从某种意义上来说,这也是给自己以后的一个备忘录。我不明白为什么 Linux 上的休眠不是一个可以正常工作的简单功能,为什么启用它必须如此复杂。我希望它也能帮助那些对冬眠有疑问的人。
- 首先,您需要确保您有一个足够大的交换文件。交换区是休眠时 RAM 保存在磁盘上的位置。
- 通过以下方式检查交换的大小系统监视器 -> 资源或者通过运行
sudo swapon --show
.你可能还不够。您的交换大小应该比 RAM 大小稍大。网上有一些指南。我在 4GB RAM 机器上选择 5GB 交换空间。 - 如何增大交换空间取决于您的设置方式。也许您需要创建一个更大的交换文件,也许您需要打开格帕特并简单地调整分区的大小。我有一个带有
/dev/vgmint/root
和卷的加密 LVM/dev/vgmint/swap
。挂载后无法调整 LVM 的大小,因此您可以使用 Linux Mint 从 USB 记忆棒启动。在那里你可以使用磁盘应用程序解锁您的加密 LVM 并使用这个美丽的指南要安全地减小/dev/vgmint/root
卷的大小:- 强制检查文件系统
sudo e2fsck -f /dev/vgmint/root
- 缩小文件系统
sudo resize2fs /dev/vgmint/root 180G
。将 180G 替换为您想要的最终卷大小的大约 90%。 - 将卷减小到其最终大小
sudo lvreduce -L 200G /dev/vgmint/root
,其中 200G 是卷的最终大小。 - 扩大文件系统以占用卷的剩余可用空间
sudo resize2fs /dev/vgmint/root
- 强制检查文件系统
- 然后,您可以运行
sudo lvextend -l 100%FREE /dev/vgmint/swap_1
以使用刚刚创建的可用空间来扩展交换卷。 - 现在,我们需要更新交换。我们已经完成了 USB 记忆棒实时系统,启动到您的常规系统。如果您再次检查交换的大小,您会发现它的大小没有改变,即使我们只是给了它更多的空间。我们需要创建一个新的交换。运行
sudo swapoff -a
以禁用所有交换并运行sudo mkswap /dev/vgmint/swap_1
以创建新的交换。
- 现在,测试一下您的硬件支持休眠和重新添加休眠按钮通过阅读这篇可爱的文章:
- 打开终端,运行
sudo pm-hibernate
.您的计算机应该休眠。再次启动并确保它恢复一切。如果是这样,那么您的硬件支持休眠。 - 现在,我们将启用休眠图标。创建文件:
sudo -i cd /var/lib/polkit-1/localauthority/50-local.d/ nano 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 ResultActive=yes
- 保存,重启。现在,当您按下电源按钮时,您应该有“休眠”选项。
- 打开终端,运行
- 能源管理。这可能是 Linux Mint with Cinnamon 特有的。我希望我的笔记本电脑在闲置一段时间后休眠,但无法使用以下命令进行设置能源管理应用程序。要编辑内部 Cinnamon 设置,我使用 dconf 编辑器 (
sudo apt install dconf-editor
)。打开它,转到/org/cinnamon/settings-daemon/plugins/power/或者只是搜索力量。sleep-inactive-battery-type
这就是我所追求的 - 将其设置为“休眠”。在这里,我喜欢关闭use-time-for-policy
并使用电池百分比而不是剩余时间来确定“电池电量低”、“电池电量严重不足”和“电池操作”状态。电池百分比是实际值,而剩余时间是估计值,可能会有很大差异。您还可以使用percentage-low
、percentage-critical
和 来设置百分比阈值percentage-action
。环顾四周,这个选项卡中有一些有趣的设置。不过要小心。 - 现在,最后一块拼图防止挂起/休眠状态下不必要的唤醒。写
sudo cat /proc/acpi/wakeup
。您将看到哪些设备已启用并且可能导致从休眠状态中意外唤醒。给您带来麻烦的设备需要在启动时和从挂起/休眠状态返回时禁用。
- 以下是禁用设备的方法:
echo DEVICE_NAME | sudo tee /proc/acpi/wakeup
。 (谢谢这个线程.) - 找出哪些设备给您带来问题(我已禁用所有设备)并编写一个 bash 脚本来禁用它们。 (文件可能需要由 root 拥有,因为 root 将执行它。)它看起来像:
#!/bin/bash
filename='/proc/acpi/wakeup'
n=0
fix=false
while read line; do
if [[ "$line" == *"enabled"* ]]; then
fix=true
#break
fi
n=$((n))
done < $filename
if [[ "$fix" == "true" ]]; then
echo RP01 | tee /proc/acpi/wakeup
echo RP02 | tee /proc/acpi/wakeup
echo RP03 | tee /proc/acpi/wakeup
echo RP05 | tee /proc/acpi/wakeup
echo RP06 | tee /proc/acpi/wakeup
echo XHC1 | tee /proc/acpi/wakeup
echo LID0 | tee /proc/acpi/wakeup
fi
不要忘记让您的脚本对 root 可执行。sudo su
进而chmod +x /your-script.sh
- 现在,我们需要创建一个将调用脚本的 systemctl 服务。 (谢谢本文以及本网站上的许多其他帖子以获取灵感)。我打电话给服务人员唤醒。使用创建文件
sudo nano /etc/systemd/system/wakeups.service
。文件内容:
[Unit]
Description=Fix unwanted wakeups from suspend
[Service]
Type=oneshot
TimeoutSec=0
StandardOutput=syslog
User=root
ExecStart=/path-to-your-script/script.sh
[Install]
WantedBy=multi-user.target suspend.target hibernate.target
- 通过运行启用该服务
systemctl enable wakeups.service
- 好了,这就是休眠功能正常运行所需的全部内容!测试并确保定期启动和从休眠/挂起返回时一切正常。