web-dev-qa-db-ja.com

Linuxカーネルはどのようにしてそれ自体を更新しますか?

カーネルは、プロセス中に何も壊すことなく、実行中にどのように更新されますか?

31
Atul

カーネルを更新すると、実際にはカーネルpackageが更新されます。ほとんどのLinuxディストリビューションでは、これはパッケージマネージャーにパッケージを登録し、/lib/modulesの下に新しいモジュールを追加し、/bootの下にinitramfsとカーネルを追加するだけです。その他の雑多な活動。通常、実際にメモリに読み込まれたカーネルを置き換えるわけではありません。

起動時に、カーネル自体がメモリに読み込まれます。つまり、ロード元のファイル(例:/boot/vmlinuz)がなくなっても、カーネルを最初にロードした後は必要ありません。

was何か(たとえば、デバッグ情報)に必要で置き換えられたとしても、バッキングデータが使用されないため、すでにファイルハンドルが開いているユーザーは引き続きファイルを使用できます。問題のiノードの参照カウントが0になるまで削除します(ユーザー空間の実行可能ファイルから実行中のプロセスとは異なり、カーネル自体はすでにメモリにロードされているため、そのような参照は必要ありません)。それらのブロックは、そのファイルでユーザースペースプログラムを実行していない限り、通常はディスクから完全に解放できます。 Linuxカーネルは自身のメモリをページングせず、起動時にその場で解凍します。ブートされた/ boot/vmlinuzにアクセスするための/proc/.../exeまたは/proc/.../fd方法はありません—カーネルは、ネットブートまたはUSBブートの状況で、ブート元のデバイスをマウントしない場合もあります。

したがって、一般的に、カーネルはそれ自体を更新しません。これは通常、再起動時またはkexec時に行われます。あなたが説明しているものの種類doesは、限定的なユースケースで kpatchkgraft 、および ksplice として存在します。しかし、一般的にこれらは小さなターゲットパッチにのみ使用でき、新しいアップストリームカーネルリリースには使用できません。

73
Chris Down