web-dev-qa-db-ja.com

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

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

理論的には、Linuxは別のカーネルをRAMにロードし、initrdもロードし、shutdownのようにすべてを正常にシャットダウンして、新しいカーネルに制御を渡すことができるはずです。

それを行う実用的な方法はありますか?

7
dirkt

あなたが探しているようです kexec

ドキュメントの例:

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

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

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

kexec -e
10
GracefulRestart

「シャットダウン時」について:

これはシャットダウン時とほぼ同じです。もちろん、カーネルも消去されて再ロードされるため、pid 1を含むすべてのプロセスが消去されます。しかし、kexecは完全なリブートではないため、一部のファームウェア(EFI変数)が滞ることがあります。

カーネルを1つずつ(コンパイルして)テストしていない場合、kexecの使用は制限されます。それは「実験的」です。

しかし、試してみるのはクールです。それは、再起動とランレベルの変更の「中間」です(systemdの時代、つまり実際にはLinuxでの意味)。何度か成功した後、クラッシュしました。 (しかし、何も起こりませんでした。)

私は最新のコメントを読んだ:

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

しかし、それはctrl-alt-delの場合と同じ問題であり、特にsystemdがない場合は同じです。懐疑的で申し訳ありませんが、sysvinitを使用したシャットダウンプロセスは、(systemdを使用する場合も)すでに少しトリッキーです。 「制御されたシャットダウン」とkexec(またはctrl-alt-del)は、私には少し逆説に思えます。

私はいつも「等」をします。私のシステムで「プラグを引く」前に:ファイルを閉じる/保存し、firefoxを閉じ、tmpfsマウントを確認し、パーティションをアンマウントします。次にrebootpoweroffhaltshutdowninit 6,init 0、ctrl-alt-del、またはON/OFFボタンを5秒間... kexecを潜在的な問題の別の原因にしたくない。


数日後に追加:

実際、systemdはkexec(man systemctl)を統合しています。私はアイデアを「少し逆説」と呼んだことを後悔していますが、私のポイントを維持しています。通常の再起動後、ブートローダーのコマンドラインで数秒後にそのカーネルコマンドラインを選択(または手動で入力)しないのはなぜですか?

1
rastafile

efibootmgrを使用して、ブートエントリの番号であるBootNext(通常は4桁の数字)を確認し、次のコマンドを実行します。

# efibootmgr --bootnext BootNext

EFIBOOTMGR(8)から:

•BootNext-次回の起動時に実行されるようにスケジュールされている起動エントリ。これは、1回のブートでのみBootOrderに優先し、最初の使用後にブートマネージャーによって削除されます。これにより、BootOrderを変更せずに次の起動動作を変更できます。

1
user13910