ここでLinuxに焦点を当てます:
ユーザースペース(および一部のハードウェア部品)の「再起動」
これらのサービス、デーモン、およびプログラムの起動方法に関して、ブートシーケンスに何かが欠けています。
init
Linuxで入力してください。の目的は/sbin/init
、system V init、upstart、またはsystemdであり、これらの他のすべてのプロセスを正確に起動することです。これらのinitユーティリティはすべて、その下で実行されるサービスを管理する機能を備えています。
現在、Linuxシステムにはランレベルの概念もあります。
0 = shutdown
1 = single user recovery mode, no networking
2 = ?
3 = multi user networking no X
4 = ?
5 = multi user networking X
?厳密には定義されていません。init 3
とにかく、 Linuxを使用していると仮定して、今すぐrootに入力して入力すると、Xおよびすべてのxクライアントが終了します。もちろん、特定のランレベルで何かが許可されている場合、それは強制終了されませんが、特定のプロセスのみを再起動したい場合は、これで非常にうまくいきます。システムデーモンを再起動するユースケースは更新に対応しており、最近のほとんどのパッケージマネージャーは、選択したinitscriptツールを介して実際にこれを実行します。
したがって、GUI全体を再起動でき、任意のデーモンを再起動できます。他のプロセスも強制終了できます。ハードウェアドライバをリロードしますか?私はすでにその場でそれを行うことができるmodprobe
ので、グラフィックスドライバーの更新が必要な場合はinit 3
、古いドライバーを削除し、新しいドライバーを挿入して続行することができます。
パッケージマネージャーはシステムデーモンを再起動する方法を知っており、いつでもそのアドバイスに従ってログアウトして再度ログインできます。したがって、Linuxは、更新時の再起動を回避するという点で、すでにかなり効率的です。
カーネルの「再起動」
つまり、基本的に、Linuxのほとんどは実際に再起動しなくても「再起動」できると思います。だから今何が残っていますか?
- カーネルをリロードできません。
- ルートファイルシステムを簡単にアンマウントできません。新しくロードされたユーザースペースについては、これに依存しています。免責事項:カーネルの「リロード」中にinitramfsをリロードすることができるため、ここでは1に依存しています。
さて、問題はどのようにカーネルをリロードするかです。カーネルは実際には特別な魔法ではありません。メモリにコピーされた別のコンピュータプログラムなので、カーネルを上書きして実行を渡すプログラムをどこかに書くことができます...
これは存在し、信じられないかもしれませんが、と呼ばれkexec
ます。ウィキペディアのページを離れて、問題を要約します。
実行可能ではありますが、kexecなどのメカニズムを実装すると、次の2つの大きな課題が発生します。
- 新しいカーネルは、実行中に現在実行中のカーネルのメモリを上書きします
- 新しいカーネルは通常、すべての物理デバイスが明確に定義された状態にあることを期待します(システムの再起動後、BIOS(またはファームウェア)がデバイスを「正常な」状態にリセットしたとき)。実際の再起動をバイパスすると、デバイスが不明な状態になる可能性があり、新しいカーネルはそれから回復する必要があります。
kexecは、システムシャットダウンとは異なり、ファイルシステムまたはプロセスを自動的に停止しません。あなたがその責任を負います。
だからあなたはそれを持っています。リロードする必要のある部分に応じて、Linuxではほとんどが可能です。