当 Linux 系统休眠并从休眠中恢复时,我认为内核需要知道它正在恢复,而不是引导。否则,内核将启动通常的引导过程,并且不会加载交换的数据。内核如何知道它正在恢复?
起初,我以为GRUB(或其他引导加载程序)通过内核参数告诉内核。但是只要我查看/proc/cmdline,内核参数就和平时一样了。内核是否有任何机制知道它正在恢复?
当 Linux 系统休眠并从休眠中恢复时,我认为内核需要知道它正在恢复,而不是引导。否则,内核将启动通常的引导过程,并且不会加载交换的数据。内核如何知道它正在恢复?
起初,我以为GRUB(或其他引导加载程序)通过内核参数告诉内核。但是只要我查看/proc/cmdline,内核参数就和平时一样了。内核是否有任何机制知道它正在恢复?
休眠通过使用交换分区¹来换出所有进程的内存、内核状态,最后保存 CPU 和可能的其他设备的一些状态,然后关闭电源。在途中,它在交换分区中指出这是一个休眠映像。
通过告诉内核尝试从交换分区恢复,使用
resume=
内核参数resume=/dev/sda4
(如果 /dev/sda4 是你的交换分区)resume=UUID=deadbeef-cafe-b00b-1337-123456123456
或类似的方式,从休眠中恢复。然后内核在引导期间查看该分区,在交换分区中找到写着“嘿,这是一个休眠映像”的注释,并从中恢复设备、内核和进程。如果没有注释,它会正常启动。
可以查看源码,具体是
software_resume()
功能描述:所以这涉及内核的两个实例,“引导内核”和“图像内核”,官方内核文档中描述了该过程,该文档还解释了为什么这不是通过引导加载程序完成的:
¹ 如今,也可以是许多(大多数?)文件系统上的交换文件,或 LVM 卷……。