你无法唤醒的 Linux
带着几个月老家新房装修的身心劳累,终,回到深圳,倍感陌生,十月炎热,心也躁动。
大概是从 2012 年左右,对于电脑,我都惯于 sleep 而非直接 shutdown 掉。然而,对于 2021 年睡眠技术更加成熟的今天,却出现了我的 Ryzen ITX + Nvidia 组合无法休眠的情况!只要 suspend 后,resume 必定黑屏。
如遇问题,先省软件
首先定位问题,如经验所断,就该先断是软件问题。因为之前出现过两次休眠无法唤醒的情况:
- Nvidia 驱动问题(降级驱动)
- KDE 的 kscreenlocker 跟 Nvidia 的 Bug(降级驱动或者等 kscreenlocker 维护者修复)
凑巧的是,我最近正好 emerge -uDv @world
进行系统升级……
日志是最好的朋友
于是从日志找找线索吧:
dmesg | egrep -i --color 'error|failed'
journalctl -p 3 -xb
egrep --color EE /var/log/Xorg.0.log
好吧,都没有错误信息……
谷歌是最好的朋友
那就先 google 一下吧,在 Gentoo 和 ArchLinux 论坛最近都没有类似情况。而 Manjaro 和 Nvidia 的论坛最近刚好有类似问题,而且基本大部分都指向了 Nvidia 驱动,凑巧的是像这贴,情况和驱动版本基本一致。
那么打开 Gentoo 的 nvidia-drivers 的 package 页面,在里头看看有没有 bug 讨论,没有的话直接点击 Git log 来到对应的 nvidia-drivers 的 portage git 页面。根据之前的使用的版本找到稳定的 git log 链接,进入 tree 文件目录,下载 ebuild 和 files 里头的附件到本地 portage 里头,然后再 portage mask 限定下版本,执行 emerge 降级到该版本。
好吧,居然还是没效果……
XX Wiki 是最好的朋友
到 Gentoo,Archlinux,Debian 的 Wiki 里头查看所有 ACPI,suspend 和 Nvidia 的文章
- https://wiki.gentoo.org/wiki/Suspend_and_hibernate
- https://wiki.gentoo.org/wiki/ACPI
- https://wiki.gentoo.org/wiki/NVIDIA/nvidia-drivers
- https://wiki.archlinux.org/title/NVIDIA/Troubleshooting
- ……
给统一的标准答案,将 strings /sys/firmware/acpi/tables/DSDT | grep -i 'windows ' | sort | tail -1
的返回值给内核参数 acpi_osi=! "acpi_osi=${windows_version}"
。
我其实很纳闷以前怎么不用……结果使用后报出 clocksource 的问题,会变成 tsc unstable,当然可以在内核里头强行指定 tsc=reliable
或者是 cat /sys/devices/system/clocksource/clocksource0/available_clocksource
里头的其他值给 clocksource,但这些都是不建议的,这些折腾导致出各种内核的 bug 出来。如同我硬件一致因为 tsc unstable 导致和我现在一样问题的 bug:
这问题接踵而来,让我措手不及。还好理智下来,我现在要做的就是使用之前能用的内核就可以。所以像降级 Nvidia 驱动一样降级回之前的内核。
好吧,一番尝试终是错付了……
到底是安装什么导致的?
这会我想的最多的,就是,之前好好的,现在有问题,肯定是升级导致的。查了 /var/log/emerge.log
日志看看最近都更新了什么,合理的话,会影响睡眠的大概率是系统类和显卡驱动,虽然应用类像之前的 kscreenlocker 可能会影响,但是这种是小概率,这次也没啥桌面底层的升级。这次几个会导致的包,我个人猜想是:
- x11-drivers/nvidia-drivers(已经排除)
- sys-kernel/gentoo-sources(已经排除)
- sys-apps/systemd
- sys-apps/util-linux
一个个都尝试下制作成自己的 local portage 包去降级。
好吧,这是无果的行动……
是 KMS 的锅吗?
因为 Nvidia 的需要加载的动态库有三个,其中有一个是 DRM,让我觉得会不会新驱动在睡眠唤醒后 KMS 失效了,识别不了显示器和分辨率导致的?所以我使用 nvidia-settings 生成一份 Xorg.conf。然后在内核参数里头追加 nomodeset 参数。
好吧,不能乱甩锅……
是服务的锅吗?
我突然记起之前 LXD 服务导致整个系统关机要延迟 2min,Docker 服务直接导致整机崩溃的事情,所以尝试 disable 掉 LXD 和 Docker,再尝试睡眠唤醒。
好吧,真不能再乱甩锅了……
从只言片语里头汲取琐碎
翻了一遍又一遍的论坛,查找有关有用信息:
- https://forums.developer.nvidia.com/t/465-24-02-page-fault/175782/6
- https://forums.developer.nvidia.com/t/occassional-failure-to-resume-pci-pm-suspend-nv-pmops-suspend-0x0-0x20-nvidia-returns-5/187091/4
- https://forums.developer.nvidia.com/t/resuming-from-suspend-issue-driver-450-57-fedora-32-modesetting-enabled-gtx-750-ti/146265/8
- https://forums.developer.nvidia.com/t/not-wakig-up-after-suspend/187677
- https://forums.developer.nvidia.com/t/bug-nvidia-uvm-needs-to-be-removed-and-re-inserted-in-order-to-work-after-wakeup-from-suspend/188453
- https://forums.developer.nvidia.com/t/kernel-freeze-for-460-80-and-465-31/179341
- https://forums.developer.nvidia.com/t/after-resume-on-sleep-or-hibernate-system-freezes-with-black-screen-no-interaction-possible/38800/7
里头有人说他们的 WiFi 或者 HDMI 音频冲突会导致该问题的产生。
我开始了新尝试:禁止 WiFi 的驱动,无果;从 BIOS 禁止网卡,无果。拔掉 HDMI 线不让声音输出口有它,无果。
好吧,难道真的没办法了嘛……
莫非是硬件问题?
莫非是硬件问题?可是开机硬件自检没问题,也没有鸣叫啊。
难道是电路或者电源的玄学问题?电子元件用久了产生缺陷?拆了机器后也不知道后续要怎么来断问题。
好吧,这下真是无奈了……
换个发行版试下吧
为了保险起见,我下了 Manjaro 和 Ubuntu 的桌面镜像,以 Live 形式运行睡眠唤醒,如果没问题的话,那应该是最近 Gentoo 出的问题了。结果都是一致的睡不醒。
好吧,放弃抵抗了……
奇迹还是发生了
想着电脑没有了睡眠唤醒功能,基本对于大功耗的它是不宜工作的,毕竟工作区没法保存。现在它只能当一台游戏机处置了,这时我运行了容器里的 Dota 2,打开最高特效看华丽效果,想知道它的性能到哪里。发现怎么有点小卡,看了资源怎么才只有原来机器一半内存?
虽然休眠是保持在内存中,跟内存关系极大,但按道理要是内存松动,肯定整个系统都不稳定,又或者内存自检不过和主板鸣叫,又或者根本就没有用到这内存,然而偏偏这些都正常。
还是试下吧。插上内存后,居然可以睡眠唤醒了!拔掉内存后,居然也可以睡眠唤醒!实在解释不通,网上也没有此等说法,真是诡异极了。
好吧,终是意料之外的圆满……