web-dev-qa-db-ja.com

特定のコミットでカーネルにパッチを適用する方法

私が取り組んでいるプロジェクトでは、カーネルにこのコミットが必要です:

https://git.kernel.org/cgit/linux/kernel/git/bluetooth/bluetooth-next.git/commit/?id=a6ad2a6b9cc1d9d791aee5462cfb8528f366f1d4

基本的にはほんの数行のコードです。過去には、プロジェクトに使用するのに適した環境が常に提供されていましたが、今回はこのパッチを必要とするプロジェクトの重大なバグであり、カーネルにあるため、これを処理する方法がわかりません。

このパッチを含む新しいカーネルをコンパイルする必要がありますか? Linuxカーネルのどこかでこれらのコード行を置き換えることはできますか、またはこれらのコード行だけを追加するパッチャーはありませんか?

現在のカーネルが壊れるのではないかと心配しているため、自分で何もしていません。誰もが最善の行動を提案できますか? Ubuntu IRCチャンネルで、launchpad.netにバグレポートとして投稿するように言われました。問題は、これに1週間以上かかる場合、期限を変更する必要があり、これは望ましくないことです。

現在、Wiley Werewolfの最新ビルドを実行しています。

2
Zimano

ほとんどの場合、そしておそらくあなたの場合、カスタムカーネルを構築する必要があります。一部のモジュールは個別にビルドできますが、この場合はそうではありません。

しかし、カーネルの構築はそれほど難しくありません。 UbuntuコミュニティヘルプとWikiには、パッチアプリケーションを除くすべてを網羅した役立つ記事があります。

どこかで行き詰まっている場合は、この方法でこれを実行し、上記のリソースを参照できます(より詳細になる傾向があります)。

  1. 必要なパッケージをインストールします。

    Sudo apt-get install git build-essential fakeroot kernel-package libncurses5-dev libssl-dev
    Sudo apt-get build-dep linux-image-$(uname -r)
    

    他のパッケージが必要になる場合があります。完全なリストを覚えていません。

  2. Ubuntuカーネルソースコードリポジトリのクローンを作成します。

    git clone git://kernel.ubuntu.com/ubuntu/ubuntu-wily.git
    

    wilyをUbuntuリリース名に置き換えます。

  3. ターミナルでソースディレクトリに移動します。

    cd ubuntu-wily
    
  4. 変更する必要があるファイルを見つけて、何らかのエディションを実行するか、パッチを適用します。

    • この場合のように、パッチが一連のGitコミットとして利用可能な場合、ソースリポジトリを取得した後、IDでパッチを「チェリーピック」できます。

      git fetch git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git
      git cherry-pick a6ad2a6b9cc1d9d791aee5462cfb8528f366f1d4
      
    • それ以外の場合は、パッチファイルをダウンロードしてGitに適用するように指示します(wgetの代わりにWebブラウザーでダウンロードできます):

      wget -O bluetooth-unpairing-fix.patch 'https://git.kernel.org/cgit/linux/kernel/git/bluetooth/bluetooth-next.git/patch/?id=a6ad2a6b9cc1d9d791aee5462cfb8528f366f1d4'
      git am bluetooth-unpairing-fix.patch
      
    • パッチファイルが「メールボックス」形式でない場合(つまり、カーネルメーリングリストに(正しく)送信されなかった場合)

      git apply bluetooth-unpairing-fix.patch
      

      git amの代わりに。

    競合する変更のためにパッチを適用できない場合、そのパッチは現在のカーネルバージョンと互換性がありません。 Gitのツールとのマイナーな競合を「マージ」することもできますが、一般的には、カーネルバージョンで動作するはずのパッチのバージョンを見つける必要があります。

  5. fakeroot debian/rules cleanを実行します

  6. debian/changelogファイルを編集します。バージョンに何かを追加するだけで、公式カーネルとの違いを確認できます。

    例:

    linux (4.2.0-17.21) wily; urgency=low
    

    への変更:

    linux (4.2.0-17.21btpatch) wily; urgency=low
    

    このバージョン番号は、debsおよびGrubにも表示されます。

  7. カーネルを構築する

    fakeroot debian/rules DEB_BUILD_OPTIONS=parallel=5  binary-headers binary-generic
    

    parellel=5は、4コアCPUまたは4スレッドCPU用です。番号は異なる場合があります。コアまたはスレッドの数+ 1です。

    カーネルの構築には長い時間がかかる場合があります–システムのパフォーマンスに応じて15分から数時間の範囲です!

  8. インストール可能なカーネルのdebパッケージを取得します。気に入らない場合は削除できます。

2
Pilot6

パッチは、カーネルコードの2つのバージョン間の差分ファイルです。 +記号がある緑の線は追加するもので、-記号がある赤の線は削除するものです。

これらを.patchファイルに入れ、patchコマンドを使用してパスすることができます。これは、パッチコマンドの使用に役立つはずです。 http://www.thegeekstuff.com/2014/12/patch-command-examples/

カーネルソースに追加してからカーネルを再コンパイルする必要があります。 http://www.cyberciti.biz/tips/compiling-linux-kernel-26.html

カーネルの破損を恐れている場合は、initrdおよびvmlinuzファイルのバックアップを作成してください。破損した場合、grubを使用してそのカーネルバージョンを起動できます。ビルドPCでカーネルを実行することになっておらず、ターゲットPC向けである場合は、「make install」を実行しないでください。

0
CS13