再起動せずにカーネルの異なるバージョンを切り替える


11

システムにインストールされているカーネルの異なるバージョンを再起動せずに切り替えたい。

つまり、3.0.0-16-generic現在実行中のカーネル3.0.0-14-genericがあり、古いカーネルもある場合は、3.0.0-14-generic再起動せずに(他のカーネル)に切り替えることができます。

(ライブカーネルのデバッグと変更を行う必要があるため、再起動できません)

回答:


8

2つの完全なカーネルを交換する方法はありません。Linuxのようなモノリシックカーネルの重要性と、それが単純な置き換えを不可能にする理由を理解できると確信しています。

最も近いのは、Kspliceを使用したライブパッチングプロセスです。カーネルの更新を、実行中のカーネルの穴を塞ぐことができる魔法のシムに変換します。これにより、再起動することなくコンピューターを無期限に維持できます。目的に合わせて、変更をロールバックすることもできます。

Ubuntu Desktopエディションでは無料なので、いろいろ試してみることができますが、サーバーのサブスクリプションを支払う必要があります(この種のものが最も必要な場合)。


あなたの編集を見たところです。「サービス」は特別な更新を提供するものであり、自分で生成できるものではないため、Kspliceは、デバッグ用に独自のカーネルを手動でハッキングして構築している場合、おそらく役に立ちません。

公式のカーネルに対して構築するだけの場合、それでも動作する可能性があります。


もう1つのアイデア:仮想化。新しいカーネルを構築し、VM内で物事を交換して再起動することができます。リブートに必要な時間はまだかかりますが、VMを開発マシンよりもはるかに軽くすることができます(Ubuntuサーバーをベースにし、必要でない場合はXサーバーをドロップします)。


1
しかし、/ bootディレクトリの2つの異なるカーネルを切り替えたい
コーダー

1
ええ、2つのカーネルを勝手に切り替えることはできません。私はあなたのために働くかもしれない別のアイデアで別の編集を追加しました。
オリ

2

オリが述べたように、あなたの最高のショットは、おそらく仮想化です。

とはいえ、ハードウェアをいじくり回している場合、仮想化はそれをカットしないかもしれません。その場合、kexec完全な再起動なしで実行中のカーネルを交換するために使用できます。

ArchWiki kexecページから取得

kexec -l /boot/new-kernel --initrd=/boot/new-initrd --reuse-cmdline
kexec -e

上記は、initシステム、ディスプレイサーバー、ネットワークなどを含むすべてのサービスを再起動します。ただし、などの十分に高速なinitシステムを使用する場合はsystemd、2〜3秒で新しいカーネルを起動できます。 BIOS / UEFIとブートローダーをバイパスしています。


同様の説明は、RapidReboot Ubuntu Wikiページにあります


0

これらの答えを更新する必要があると思います。

現在kpatchがあります。これはkspliceなどよりもネイティブです。

ただし、明らかな理由により、カーネル内のデータ構造を変更することはできません。そのため、セキュリティホットパッチに最も役立ちます。

一般的な問題は常に次のとおりです。実行中のプロセスは依然としてカーネルデータ構造を保持し、カーネル関数がそれらを期待して返すことを期待します。そして、それらのプロセスがそれのために作られていなければ、そうであるかどうかを知ることは本当に不可能です。したがって、それらを使用するすべてのプロセスが再起動されるまで、それらを変更することはできません。これらのプログラムもすべてライブパッチする必要があります。
また、ハードウェアが特別な状態にある場合、ドライバーの変更については言及しませんでした。(kexecと同じ問題。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.