use*_*126 27 boot-loader power-management hibernate linux-kernel
当Linux系统休眠并从休眠状态恢复时,我认为内核需要知道它正在恢复,而不是引导。否则,内核将启动通常的引导过程,并且不会加载交换的数据。内核如何知道它正在恢复?
起初,我认为GRUB(或其他引导加载程序)通过内核参数告诉内核。但只要我检查/proc/cmdline,内核参数就和平常一样了。是否有任何机制让内核知道它正在恢复?
Mar*_*ler 41
休眠的工作原理是使用交换分区\xc2\xb9来交换所有进程的内存、内核状态,最后保存CPU和可能的其他设备的一些状态,然后关闭电源。途中,它在交换分区中指出这是一个休眠映像。
\n从休眠状态恢复的方法是告诉内核尝试使用resume=
内核参数从交换分区恢复resume=/dev/sda4
(如果 /dev/sda4 是您的交换分区),resume=UUID=deadbeef-cafe-b00b-1337-123456123456
或类似参数从交换分区恢复。
然后,内核在启动期间查看该分区,在交换分区中找到“嘿,这是休眠映像”的注释,并从中恢复设备、内核和进程。如果注释不存在,则它会正常启动。
\n你可以查看源码,具体的说明software_resume()
:
* software_resume - Resume from a saved hibernation image.\n*\n* This routine is called as a late initcall, when all devices have been\n* discovered and initialized already.\n*\n* The image reading code is called to see if there is a hibernation image\n* available for reading. If that is the case, devices are quiesced and the\n* contents of memory is restored from the saved image.\n
Run Code Online (Sandbox Code Playgroud)\n所以这涉及到内核的两个实例,“启动内核”和“映像内核”,官方内核文档中描述了该过程中描述了该过程,该文档还解释了为什么不通过引导加载程序完成此操作:
\n\n\n虽然原则上映像可能会被加载到内存中,并且\n休眠前的内存内容会由引导加载程序恢复,但实际上,这\xe2\x80\x99 无法完成,因为引导加载程序\xe2\x80\x99 不够智能\并且没有已建立的协议来传递必要的信息。\n 因此,引导加载程序会将一个新的内核实例(称为 \xe2\x80\x9c 恢复内核\xe2\x80\x9d)加载到内存中,并以通常的方式将控制权传递给\nit。然后,恢复内核读取系统映像,恢复休眠前的内存内容,并将控制权传递给映像内核。因此,从休眠状态恢复涉及两个不同的内核实例。
\n
\xc2\xb9 如今,也可以是许多(大多数?)文件系统上的交换文件,或 LVM 卷\xe2\x80\xa6。
\n