내 Linux 커널이 패치되었나요?

내 Linux 커널이 패치되었나요?

할 예정이야패치 설치이름이 지정된 파일의 경우무선 호환내 WiFi 채널 문제를 해결하려면(존재하지 않는 -1 채널을 잠급니다)우분투 리눅스 v12.04그리고칼리리눅스 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에서는 개발자가 새 하위 버전을 출시할 때 변경한 내용이 다시 출시한 모듈 중 하나로 백포트되지 않았는지 완전히 확신할 수 없습니다. 이 일이 나를 미치게 만든다.

마지막으로, 패키지 관리, 버전 관리 및 지원에 대한 접근 방식이 서로 다른 여러 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가 표준 커널 자체에 더 많은 패치를 적용했을 수 있습니다.

관련 정보