私のLinuxカーネルはパッチされていますか?

私のLinuxカーネルはパッチされていますか?

する予定です。パッチのインストール名前付きファイルの場合ワイヤレス互換私のWiFiチャンネルの問題を解決するには(存在しない-1チャンネルをロックします)Ubuntu Linux v12.04そしてカリLinux v1.0.9

しかし、まず、今回のパッチが正しいかどうかを知りたいです。すでにインストールされている(すでに持っているものをなぜ設置するのですか?)

私はいくつかの調査をしましたが、私のパッチがすでにあるかどうかを知る方法やインストールされたパッチを一覧表示する一般的な方法が見つかりませんでした。もしあるかもしれません。可能あるいは、Linuxを実行してそのような情報を取得しないでください。

どんなアイデアがありますか?

答え1

私のLinuxカーネルはパッチされていますか?

パッチを適用するのに十分なLinuxに慣れている場合(質問の言葉のように)、パッチがすでにデフォルトのカーネルにあることを確認するのは比較的簡単です。ソースコードだけを確認してください。

ソースを使用して、ルーク!

以下は、質問者が要求したUbuntuを含むDebian GNU / Linuxから派生したすべてのディストリビューションに適用する必要があります。

apt source linux

これにより、Linuxソースコードがダウンロードされ、コンパイルされたディストリビューションとまったく同じ状態にパッチされます。 linux-xyzディレクトリには、パッチに記載されているファイルが含まれています。行番号を見て、マイナス記号のある行がなく、プラス記号のある行があることを確認してください。それはすべてです。

より詳細な答え

パッチは次のテキストファイルです。

Signed-off-by: Alexey Brodkin <[email protected]>
---
 drivers/usb/core/urb.c | 5 -----
 1 file changed, 5 deletions(-)

--- a/drivers/usb/core/urb.c
+++ b/drivers/usb/core/urb.c
@@ -321,9 +321,6 @@ EXPORT_SYMBOL_GPL(usb_unanchor_urb);
  */
 int usb_submit_urb(struct urb *urb, gfp_t mem_flags)
 {
-   static int          pipetypes[4] = {
-       PIPE_CONTROL, PIPE_ISOCHRONOUS, PIPE_BULK, PIPE_INTERRUPT
-   };
    int             xfertype, max;
    struct usb_device       *dev;
    struct usb_host_endpoint    *ep;
@@ -441,11 +438,6 @@ int usb_submit_urb(struct urb *urb, gfp_
     * cause problems in HCDs if they get it wrong.
     */

-   /* Check that the pipe's type matches the endpoint's type */
-   if (usb_pipetype(urb->pipe) != pipetypes[xfertype])
-       dev_WARN(&dev->dev, "BOGUS urb xfer, pipe %x != type %x\n",
-           usb_pipetype(urb->pipe), pipetypes[xfertype]);
-
    /* Check against a simple/standard policy */
    allowed = (URB_NO_TRANSFER_DMA_MAP | URB_NO_INTERRUPT | URB_DIR_MASK |
            URB_FREE_BUFFER);

一般に、人々はpatchこのプログラムを使用してコンパイルする前にソースコードにパッチファイルを適用しますが、この問題の場合は問題を引き起こす価値はありません。パッチファイルをすばやく参照し、上部でファイル名と行番号を確認してから、テキストエディタ(この場合emacs +321 drivers/usb/core/urb.c)を開くことができます。一目でわかります。 (マイナス記号は削除する行を示し、プラス記号は追加する行を示します。)

しかし、たぶん走るのは良い考えかもしれません。patch

一方、Linuxを再コンパイルする予定であれば、ディストリビューションのデフォルトカーネルで始まるのは悪くありません。この場合、実行を試みない理由はありませんpatch。プログラムはパッチが適用されたかどうかを認識し、オペレータにパッチをキャンセルするかどうかを尋ねるのに十分スマートです。

パッチの実行例(以前はパッチされていません)

以下は、デフォルトのカーネルにないパッチの例です。

$ patch -p1 < foo.patch
patching file drivers/usb/core/urb.c
Hunk #1 succeeded at 323 (offset 2 lines).
Hunk #2 succeeded at 440 (offset 2 lines).

成功すると、ディストリビューションのデフォルト設定はパッチされず、再コンパイルする必要があります。幸いなことに、現在パッチが適用されているLinuxソースコードが記載されています。

パッチの実行例(以前にパッチが適用された)

ディストリビューションのデフォルトカーネルがパッチされている場合、状況は次のとおりです。

$ patch -p1 < foo.patch
patching file drivers/usb/core/urb.c
Reversed (or previously applied) patch detected!  Assume -R? [n] 
Apply anyway? [n] 
Skipping patch.
2 out of 2 hunks ignored -- saving rejects to file drivers/usb/core/urb.c.rej

「反転または以前に適用」とは、デフォルトのカーネルがすでにパッチされているため、他の操作を実行する必要がないことを意味します。


脚注1悪い悪戯をしてすみません。しかし、私を非難しないでください。これは私がずっと前にUNIXの専門家から賢く学んだ励ましです。彼らはソースがあなたと一緒にいるとき、あなたはどんな独占プロバイダが想像していたよりも強力になると言います。

答え2

LinuxはWindowsではないため、「パッチ」は実際にソースコードを変更して、基本コードから完全に再コンパイル/再ロードしてパッケージにデプロイすることです。したがって、ソースコードをダウンロードして特定のソースコードの変更を確認しないと、一部の特定の変更がバイナリファイルにマージされたかどうかを知ることは困難です。

バージョンが常に役に立つわけではありません。たとえば、RedHatはソースコードの変更を以前はサポートしているアプリケーションバージョンにバックポートし、パッケージを再公開し、バージョンは変更せずにビルド番号のみを変更します。したがって、RedHatは、開発者が新しいサブバージョンをリリースしたときに変更が再リリースされたモジュールの1つにバックポートされていないことを完全には確信できません。これが私を狂わせます。

最後に、パッケージ管理、バージョン管理、およびサポートへのアプローチが異なる複数のLinuxディストリビューションがあることに注意してください。

要約すると、ソースコードの変更が実装されているかどうかを確認するには、使用している特定のディストリビューションの特定のパッケージのソースコードに移動する必要があります。

答え3

あなたの具体的なケースではあなたのリンク2012 年の内容で、Ubuntu バージョン 11.10 以前のバージョンについて説明します。

ここで言及されているコンテンツcompat-wireless-3.0-rc4-1.tar.bz2はもうダウンロードできないようです。このコンテンツは、本質的にこのバージョンより古いカーネルにインストールするのに適したカーネルバージョン3.0-rc4用のワイヤレスドライバのようです。 Ubuntu 12.04には3.2以上のカーネルバージョンがあります。ダウングレードあなたのため。 Kali 1.0.9は2014年にリリースされ、最新のカーネルバージョンがある可能性があります。

これチャンネル-1パッチリンクに記載されている内容は<kernel source root>/net/wireless/chan.cファイルの6行だけを変更し、カーネルモジュールのファームウェアバージョンは変更されません。したがって、現在インストールされているカーネルのカーネルソースパッケージをダウンロードしてそのソースファイルを確認する以外に、パッチがインストールされているかどうかを簡単に確認する方法はありません。

しかし、私は行くことができますhttps://www.kernel.orgダウンロードせずにそこでコードを見つけてください。現在、最も古い長期サポートカーネルは3.2.98です。その.../net/wireless/chan.cファイルを見るとパッチが存在しないようです。行番号はパッチの内容と約30行ほど異なりますが、機能構造はcfg80211_set_freq()依然として本質的に同じです。同じので、理論的には、このパッチは「バニラ」3.2に適用されます。シリーズカーネル。

当時、次の長期カーネルはバージョン3.16.53でした。そのファイルを見ると、.../net/wireless/chan.c完全に修正されたことがわかりました。パッチ修正機能はcfg80211_set_freq()単に存在しませんでした。このバージョンにはチャンネル1パッチをそのままインストールすることはできません。新しいコードを理解し、パッチがまだ適用されていることを確認し、パッチに記載されている変更の同等のバージョンを適切な新しい場所に適用する必要があります。必要ならば。

これは単に「バニラ」標準カーネルです。 UbuntuまたはKaliが標準のカーネル自体にさらに多くのパッチを適用した可能性があります。

関連情報