Linuxカーネルライブパッチ - 何を、どのように? [閉鎖]

Linuxカーネルライブパッチ - 何を、どのように? [閉鎖]

私は、Linux 4.0がメインラインに入りながら最近学んだ新しい概念である「ライブパッチ」を理解しようとしています。

これはLinuxカーネルの新機能強化と呼ばれています。もともと約1年前、Red HatとOpen SU​​SEが独立して開発しました。

すべての機能開発/バグ修正は通常、パッチを介してLinuxカーネルに実装されることがわかります。つまり、関連するLinuxカーネルバージョンのパッチを適用し、カーネルソースコードを再コンパイルしてから、一般的な方法でインストールします$make;sudo make install

いわゆる「ライブパッチ」メカニズムの興味深い部分は、新しいカーネルバージョンを再コンパイルしてインストールする必要がないことです。私は、GRUBには最新のカーネルバージョンのエントリが表示されないということです。そうですか?インストールしなかったからです。

今これは私が消化する必要がある深刻な概念です。どうすればいいですか? 、どのように実装しますか?

Red HatとOpen SU​​SEはそれぞれKpatchとkGraftを使用してそれらを実装します。

単純なカーネルモジュールを試してみて、KpatchまたはkGraftのいずれかを使用して実装したいと思います。しかし、Ubuntu 14.04システムがありますが、Ubuntuに代わるものはありますか?

この新しい概念について私が理解する最も近いのは、ftraceなどの新しいフレームワークでパッチを作成してコンパイルする必要があることです。したがって、「バグ付き」カーネルモジュールのユーザースペースで、このパッチ(ビルドされたパッチを「のみ」インストールする方法)を使用してインストールしたばかりの最新のAPI / ABI実装で、API / ABIを特別なフレームワークからリダイレクトします。 )。私はここにいますか?

Linuxカーネルの専門家がこれについて知っている場合は、この「ライブパッチ」が正確に何であるか、ライブパッチがどのように作成されるのか、システムユーザーがこのパッチをインストールして機能を確認する方法についてご意見をお寄せください。 (テストしてみてください)?

この概念を理解しながら、このような「ライブパッチ」をどのように書くのか疑問に思います。これを行うには他にどのような環境が必要ですか?

ベストアンサー1

カーネルが完全に書き換えられていない場合(関数名の変更、関数に渡される引数の順序の変更)、元のカーネルとパッチされたカーネルのバイナリを分析して、どの関数が変更されたかを確認できます。

次に、変更されたルーチンの先頭を上書きして、メモリにロードされたルーチンの変更されたバージョンに移動します。これは、他のプロセスが実行されていない場合に行われます。

Wikipediaに関する記事ケスステッチもっと理解しやすく説明されています。

確実にパッチを作成しようとし、より小さなパッチを思い出すことができます(完全な機能ではなく、機械語コードの数行を変更)。これらの小さなパッチは、パッチされた関数呼び出しから単に戻るのではなく、元のルーチンに慎重にジャンプする必要があります。

新しいバージョン番号を取得するためにgrubメニューをパッチするのは、カーネルバイナリを分析してパッチするよりも簡単です。メニューはテキストとしてのみ提供されます。しかし、何があっても最初のブート後にはグラップメニューが決して表示されないという考えです。

これはRed HatとOpen SuSEの新機能ですが、1年前に発明されたわけではありません。たとえば、kspliceは2008年にカーネル実行パッチを開始しました。メモリ内プログラム(必ずしもLinuxカーネルである必要はありません)にパッチを適用するという概念ははるかに古いです。私自身もすでに1984年から手動分析に基づいたインメモリプログラムパッチ(6502マシンコードパッチ)を使用していましたが、その当時は確かにするつもりはありませんでした。

おすすめ記事