カーネルは、プロセス中に何も壊すことなく、実行中にどのように更新されますか?
カーネルを更新すると、実際にはカーネルpackageが更新されます。ほとんどのLinuxディストリビューションでは、これはパッケージマネージャーにパッケージを登録し、/lib/modules
の下に新しいモジュールを追加し、/boot
の下にinitramfsとカーネルを追加するだけです。その他の雑多な活動。通常、実際にメモリに読み込まれたカーネルを置き換えるわけではありません。
起動時に、カーネル自体がメモリに読み込まれます。つまり、ロード元のファイル(例:/boot/vmlinuz
)がなくなっても、カーネルを最初にロードした後は必要ありません。
was何か(たとえば、デバッグ情報)に必要で置き換えられたとしても、バッキングデータが使用されないため、すでにファイルハンドルが開いているユーザーは引き続きファイルを使用できます。問題のiノードの参照カウントが0になるまで削除します(ユーザー空間の実行可能ファイルから実行中のプロセスとは異なり、カーネル自体はすでにメモリにロードされているため、そのような参照は必要ありません)。それらのブロックは、そのファイルでユーザースペースプログラムを実行していない限り、通常はディスクから完全に解放できます。 Linuxカーネルは自身のメモリをページングせず、起動時にその場で解凍します。ブートされた/ boot/vmlinuzにアクセスするための/proc/.../exe
または/proc/.../fd
方法はありません—カーネルは、ネットブートまたはUSBブートの状況で、ブート元のデバイスをマウントしない場合もあります。
したがって、一般的に、カーネルはそれ自体を更新しません。これは通常、再起動時またはkexec
時に行われます。あなたが説明しているものの種類doesは、限定的なユースケースで kpatch 、 kgraft 、および ksplice として存在します。しかし、一般的にこれらは小さなターゲットパッチにのみ使用でき、新しいアップストリームカーネルリリースには使用できません。