カーネルが休止状態で再開され、起動しないことをどのように知ることができますか?

カーネルが休止状態で再開され、起動しないことをどのように知ることができますか?

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.

したがって、これには「ブートカーネル」と「イメージカーネル」という2つのカーネルインスタンスが含まれ、プロセスは次のようになります。公式カーネル文書これは、ブートローダを介して行われない理由も説明します。

原則として、イメージをメモリにロードし、ブートローダによって休止状態以前のメモリの内容を復元することは可能ですが、実際にはブートローダが十分にスマートではなく、必要な情報を渡すために設定されたプロトコルがないため不可能です。 。したがって、ブートローダは新しいカーネルインスタンス(「回復カーネル」と呼ばれる)をメモリにロードし、通常の方法で制御を渡します。その後、回復カーネルはシステムイメージを読み取り、休止状態の前にメモリ内容を復元し、制御をイメージカーネルに渡します。したがって、休止状態から再開するには、2 つの異なるカーネルインスタンスが必要です。


最近では、多くの(ほとんどの?)ファイルシステムやLVMボリュームのスワップファイルでもあります。

おすすめ記事