问题:
休眠后重启无法从休眠文件中恢复。
dmesg输出的日志:
[ 8.912917] NVRM: GPU 0000:01:00.0: PreserveVideoMemoryAllocations module parameter is set. System Power Management attempted without driver procfs suspend interface. Please refer to the 'Configuring Power Management Support' section in the driver README.
[ 8.912921] nvidia 0000:01:00.0: PM: pci_pm_freeze(): nv_pmops_freeze [nvidia] returns -5
[ 8.915120] nvidia 0000:01:00.0: PM: dpm_run_callback(): pci_pm_freeze returns -5
[ 8.915125] nvidia 0000:01:00.0: PM: failed to quiesce async: error -5
[ 9.092593] nvme nvme1: 8/0/0 default/read/poll queues
[ 9.125764] PM: hibernation: Failed to load image, recovering.
解决方案
0x01 关闭nvidia驱动的早加载
nvidia驱动早加载(early loading)时,驱动无法读取到缓存gpu内存路径相关变量,会导致系统从休眠中恢复失败。详情可以查看NVIDIA/early loding-ArchWiki和NVIDIA/Tips-ArchWiki部分。
所以将nvidia相关驱动从内核early loading加载目录移除即可。
对于使用mkinitcpio的内核来说,只要/etc/mkinitcpio.conf的MODULES字段没有nvidia相关驱动(常见的驱动名称:nvidia nvidia_modeset nvidia_uvm nvidia_drm)
0x02 启用显存保存
这里我们设置相关内核变量为显存保存提供支持。启用显存保存后可能有助于休眠恢复后显示画面的快速恢复,否则可能会有短暂的花屏等。
对于595版本之前的驱动,需要添加内核参数NVreg_PreserveVideoMemoryAllocations=1来启用显存。同时需要保证nvidia-suspend.service, nvidia-hibernate.service, 和nvidia-resume.service这些服务是启用的。595版本之前可能需要手动启用这些服务。
对于595之后的驱动,需要添加内核参数NVreg_UseKernelSuspendNotifiers=1来启用显存。nvidia-suspend.service, nvidia-hibernate.service, 和nvidia-resume.service这些服务则会由archlinux默认启用。
然后最好设置NVreg_TemporaryFilePath变量,指定显存缓存的文件的位置。默认会设置到/var/tmp目录。