Linux 시스템이 최대 절전 모드에 들어갔다가 다시 시작될 때 커널은 부팅이 아닌 다시 시작 중임을 알아야 한다고 생각합니다. 그렇지 않으면 커널이 일반적인 부팅 프로세스를 시작하고 스왑된 데이터가 로드되지 않습니다. 커널은 복구 중이라는 것을 어떻게 알 수 있나요?
처음에는 생각했어요애벌레(또는 다른 부트로더)은 커널 매개변수를 통해 커널에 알립니다. 하지만 /proc/cmdline을 확인하자마자 커널 매개변수가 평소와 동일합니다. 커널이 복구 중임을 알리는 메커니즘이 있습니까?
답변1
최대 절전 모드는 스왑 파티션을 사용하여 모든 프로세스의 메모리와 커널 상태를 교환하고 마지막으로 전원을 끄기 전에 CPU 및 기타 장치의 일부 상태를 저장하는 방식으로 작동합니다. 도중에 스왑 파티션에서 이것이 최대 절전 모드 이미지임을 지적했습니다.
커널에 지시하여 최대 절전 모드에서 다시 시작합니다.노력하다resume=
resume=/dev/sda4
스왑 파티션 (/dev/sda4가 스왑 파티션인 경우) resume=UUID=deadbeef-cafe-b00b-1337-123456123456
또는 이와 유사한 것에서 복원하려면 커널 매개변수를 사용하십시오 .
그런 다음 커널은 부팅 중에 해당 파티션을 살펴보고 스왑 파티션에서 "Hey, this is a hibernation image" 주석을 찾은 다음 여기에서 장치, 커널 및 프로세스를 복원합니다. 주석이 없으면 정상적으로 시작됩니다.
당신은 확인할 수 있습니다소스 코드, 특정 기능 설명 software_resume()
:
* software_resume - Resume from a saved hibernation image.
*
* This routine is called as a late initcall, when all devices have been
* discovered and initialized already.
*
* The image reading code is called to see if there is a hibernation image
* available for reading. If that is the case, devices are quiesced and the
* contents of memory is restored from the saved image.
따라서 여기에는 "부팅 커널"과 "이미지 커널"이라는 두 개의 커널 인스턴스가 포함되며 프로세스는 다음과 같습니다.공식 커널 문서이는 부트로더를 통해 수행되지 않는 이유도 설명합니다.
원칙적으로 이미지를 메모리에 로드하고 부트로더에 의해 최대 절전 모드 이전 메모리 내용을 복원하는 것이 가능하지만 실제로는 부트로더가 충분히 똑똑하지 않고 필요한 정보를 전달하기 위해 설정된 프로토콜이 없기 때문에 불가능합니다. . 따라서 부트로더는 새 커널 인스턴스("복구 커널"이라고 함)를 메모리에 로드하고 일반적인 방법으로 제어권을 전달합니다. 그런 다음 복구 커널은 시스템 이미지를 읽고, 최대 절전 모드 전에 메모리 내용을 복원하고, 제어권을 이미지 커널에 넘깁니다. 따라서 최대 절전 모드에서 다시 시작하려면 두 개의 서로 다른 커널 인스턴스가 필요합니다.
요즘에는 많은(대부분의?) 파일 시스템이나 LVM 볼륨의 스왑 파일일 수도 있습니다…