ブートローダなしで実行されているLinuxから別のカーネルから直接起動する

ブートローダなしで実行されているLinuxから別のカーネルから直接起動する

マシンをリセットしてブートローダを介さずにLinux実行からディスク上の他のカーネルに直接起動する方法はありますか?

理論的には、Linuxは他のカーネルをRAMにロードし、initrdもロードし、すべてを正常に終了してから、shutdownコントロールを新しいカーネルに渡すことができるはずです。

これを行うための実用的な方法はありますか?

答え1

探しているようですね。プログラムの実行

文書の例:

たとえば、再起動するカーネルイメージが/boot/vmlinux、/proc/cmdlineの内容がroot=/dev/hda1、initrdのパスが/boot/initrdの場合、次のコマンドを使用できます。カーネルをロードするには:

kexec -l /boot/vmlinux --append=root=/dev/hda1 --initrd=/boot/initrd

カーネルがロードされたら、次のコマンドを使用していつでも起動できます。

kexec -e

答え2

「閉鎖」について:

これは終了時とほぼ同じです。pid 1もちろん、カーネルも消去され、再ロードされるため、含まれているすべてのプロセスは消去されます。ただし、kexecが完全に再起動しないため、一部のファームウェアエントリ(EFI変数)がクラッシュする可能性があります。

kexecは、カーネルの後にカーネルをテスト(コンパイルおよびテスト)しない場合に限られています。これは「実験的」です。

しかし、試してみるのは素晴らしいことです。再起動とランレベルの変更の間にあります(systemd時代に何が意味していたのか、実際にはLinuxでは常にそうでした)。数回の成功した試みの終わりに衝突が発生し、そのまま残しました。 (しかし何も起こりませんでした。)

最近のコメントを読みました。

アイデアは、少なくとも既存のファイルシステムなどをアンマウントすることです。

しかし、これは特にsystemdがなければctrl-alt-delと同じ問題です。懐疑的で申し訳ありませんが、sysvinitを使用したシャットダウンプロセスは少し面倒です(systemdでも同様です)。 kexec(またはctrl-alt-del)と一緒に「制御されたシャットダウン」は少し矛盾しているようです。

私はいつも「ちょっと待ってください」。 「システムrebootの接続をpoweroff解除」する前に:ファイルを閉じる/保存する、Firefoxを閉じる、tmpfsマウントを確認し、パーティションをマウント解除haltshutdownますinit 6, init 0。 .. .私はkexecが潜在的な問題のもう一つの原因になりたくありません。


数日後に追加されました:

実際、systemdはkexec(man systemctl)を統合します。このアイデアを「ちょっと矛盾した表現」と呼んでしまって申し訳ありませんが、私の言葉に従ってください。通常の再起動後数秒後に、ブートローダのコマンドラインから適切なカーネルコマンドラインを選択(または手動で入力)するのはどうですか?

答え3

efibootmgr起動エントリの番号BootNext(通常は4桁の数字を含む)を確認したら、次のコマンドを実行できます。

# efibootmgr --bootnext BootNext

EFIBOOTMGR(8)から:

•BootNext - 次回起動時に実行するようにスケジュールされた開始エントリ。これは BootOrder を 1 回だけ置き換え、最初の使用後にブートマネージャによって削除されます。これにより、起動順序を変更せずに次の起動動作を変更できます。

関連情報