LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

你无法唤醒的 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 的文章

给统一的标准答案,将 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,再尝试睡眠唤醒。

好吧,真不能再乱甩锅了……

从只言片语里头汲取琐碎

翻了一遍又一遍的论坛,查找有关有用信息:

里头有人说他们的 WiFi 或者 HDMI 音频冲突会导致该问题的产生。

我开始了新尝试:禁止 WiFi 的驱动,无果;从 BIOS 禁止网卡,无果。拔掉 HDMI 线不让声音输出口有它,无果。

好吧,难道真的没办法了嘛……

莫非是硬件问题?

莫非是硬件问题?可是开机硬件自检没问题,也没有鸣叫啊。

难道是电路或者电源的玄学问题?电子元件用久了产生缺陷?拆了机器后也不知道后续要怎么来断问题。

好吧,这下真是无奈了……

换个发行版试下吧

为了保险起见,我下了 Manjaro 和 Ubuntu 的桌面镜像,以 Live 形式运行睡眠唤醒,如果没问题的话,那应该是最近 Gentoo 出的问题了。结果都是一致的睡不醒。

好吧,放弃抵抗了……

奇迹还是发生了

想着电脑没有了睡眠唤醒功能,基本对于大功耗的它是不宜工作的,毕竟工作区没法保存。现在它只能当一台游戏机处置了,这时我运行了容器里的 Dota 2,打开最高特效看华丽效果,想知道它的性能到哪里。发现怎么有点小卡,看了资源怎么才只有原来机器一半内存?

虽然休眠是保持在内存中,跟内存关系极大,但按道理要是内存松动,肯定整个系统都不稳定,又或者内存自检不过和主板鸣叫,又或者根本就没有用到这内存,然而偏偏这些都正常。

还是试下吧。插上内存后,居然可以睡眠唤醒了!拔掉内存后,居然也可以睡眠唤醒!实在解释不通,网上也没有此等说法,真是诡异极了。

好吧,终是意料之外的圆满……