问题重述
尝试过Ubuntu/Kubuntu/Manjaro/Arch,内核版本5.10、5.15、5.16、5.17,都可以正常使用。但只要一旦睡眠,SSD就掉了。
以为是SSD问题,更换了海康威视C2000eco 1T后,问题还是100%复现。
启动Ubuntu可以正常使用,但是一旦睡眠再唤醒,会出现IO Error,然后立马EXT4 Error。
为了定位问题,
使用live cd启动Ubuntu虚拟环境,然后点击睡眠,唤醒后,live cd正常使用,但是SSD掉了,fdisk -l也看不到/dev/nvme0n1。再次点击睡眠,SSD又可以被侦测到,/dev目录也可以看到/dev/nvme0n1。
tty提示了identifiers changed for nsid 1
,然后就是一长串EXT4错误了,也就是掉盘了。
这个问题很奇怪,导致我的Thinkbook 14p无法正常使用Linux,十分影响使用。
BIOS版本:2022.03月最新的39版本。尝试回退过,也无效。
解决方案
最后,我自己找到了问题和解决方案。 现在改ACPI实现了这个笔记本的S3休眠,NVMe不会掉盘,正常工作。
此问题的最佳解决方案是自己编译下 Linux 内核,没有想象中耗时。
原有发行版的内核编译.config文件可以在/proc/config.gz。(Arch系的是这个,其他的不清楚)
- 将联想BIOS提供的默认DSDT替换为我自定义的DSDT文件。 建议使用 CPIO 补丁或重新编译内核。 大家可以查看 DSDT 的 Arch wiki了解如何替换。这个DSDT从ACPI层面启用了S3休眠以及修复了一个_SB.LID0的ACPI Error问题。
适用于 Thinkbook 14p(BIOS 版本 39)的 DSDT 修补文件
可以自行编译DSDT,然后导入内核。
- 使用我定制的内核源代码重新编译内核,用我定制的内核启动系统。Linux 内核的默认行为是: 如果发现 NVMe 一个id 不相等,会直接删除 NVMe 命名空间,导致NVMe掉盘。
内核地址:kingtous/linux
我自己在 Linux 内核 5.17.1 (目前最新的稳定内核,并且amd cpu在linux 5.17性能大涨)在 Manjaro Linux 中测试通过。大家也可以试一试。