Como posso verificar se um determinado patch já está instalado no meu sistema?

1

Estou prestes a instalar um patch para drivers sem fio chamado Compat Wireless para resolver um problema com meu canal WiFi (ele bloqueia no canal -1 não existente) no meu Ubuntu Linux v12.04 e Kali Linux v1.0.9 .

Mas primeiro eu gostaria de saber se esse patch já está instalado (por que instalar algo que eu tenho?).

Eu fiz algumas pesquisas sobre, e não consigo encontrar uma maneira de saber se o meu patch já está lá, nem um método genérico para listar os patches instalados. Eu nem sei se é possível ou não obter tais informações de um Linux em execução.

Alguma idéia, por favor?

    
por Sopalajo de Arrierez 19.10.2014 / 01:14

3 respostas

2

O Linux NÃO é o Windows e, portanto, os "patches" são totalmente re-compilados / recarregados a partir do código base após as modificações do código-fonte e distribuídos como um pacote. Assim, é um pouco difícil saber se alguma alteração específica foi incorporada em um binário sem fazer o download da fonte e verificar a alteração específica do código-fonte.

As versões nem sempre ajudam. Por exemplo, o RedHat faz um backports das alterações do código fonte para versões mais antigas mas suportadas de um aplicativo e relança o pacote alterando apenas o número de compilação, mas não a versão. Portanto, no RedHat, você não pode ter certeza se uma alteração feita pelo desenvolvedor que está lançando uma nova subversão não foi retornada para um de seus módulos relançados. Esse tipo de coisa me deixa louca.

Final, lembre-se que existem várias distribuições do Linux com diferentes métodos de gerenciamento de pacotes, controle de versão e suporte.

Resumo, para ter absoluta certeza de que uma alteração no código-fonte foi implementada, você precisa ir até a fonte do pacote específico para a distribuição específica que está usando.

    
por 19.10.2014 / 08:34
3

Algum patch já foi aplicado ao meu kernel Linux?

Se alguém estiver confortável o suficiente com o Linux para aplicar um patch, como parece ser esse questionador, então verificar se o patch já está no kernel padrão é relativamente simples: Basta verificar o código-fonte.

Use a Fonte, Luke! ¹

O seguinte deve funcionar para qualquer distribuição derivada do Debian GNU / Linux, que inclui o que o questionador pediu, Ubuntu:

apt source linux

Isso fará o download do código fonte do Linux e corrigirá-o para ser exatamente o mesmo estado da distribuição usada quando compilado. No diretório linux-x.y.z estão os arquivos mencionados no patch. Basta olhar para os números das linhas e certificar-se de que as linhas com sinais de menos não estão lá e as que estão com sinais de mais. É isso.

Resposta mais detalhada

Patches são arquivos de texto que se parecem com isso:

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);

Normalmente, usa-se o programa patch para aplicar os arquivos de patch ao código-fonte antes de compilá-lo, mas, para essa pergunta, pode não valer a pena. Pode-se rapidamente examinar apenas um patchpile e ver o nome do arquivo e os números de linha na parte superior e depois abrir um editor de texto (neste exemplo, emacs +321 drivers/usb/core/urb.c ). Uma rápida olhada é tudo o que é preciso saber. (Os sinais de subtração marcam as linhas que devem ser excluídas e os sinais de adição, adicionados).

Mas, talvez seja uma boa ideia executar patch

Por outro lado, se alguém planeja recompilar o Linux, não é uma má idéia começar do kernel padrão da distribuição. Nesse caso, não há motivo para não tentar executar patch . O programa é inteligente o suficiente para reconhecer se o patch já foi aplicado e perguntar ao operador se talvez ele queira reverter isso.

Exemplo de execução de patch (anteriormente sem correção)

Aqui está um exemplo do que parece em um patch que não estava no kernel padrão:

$ 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).

Se for bem-sucedido, o padrão da distribuição não foi corrigido e precisa ser recompilado. Felizmente, o código-fonte do Linux agora está convenientemente ali, com o patch aplicado.

Exemplo de execução de patch (corrigido anteriormente)

E aqui está o que seria se o kernel padrão da distribuição já tivesse sido corrigido:

$ 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

"Inversa ou aplicada anteriormente" significa que nada mais precisa ser feito, pois o kernel padrão já foi corrigido.

Nota de rodapé ¹ Desculpe pelo trocadilho, mas não me culpe por isso; esse foi o encorajamento que me foi ensinado há muito tempo atrás pelos gurus do UNIX, sábios nos caminhos da Fonte. Eles disseram que quando a Fonte está com você, você se torna mais poderoso do que qualquer fornecedor proprietário poderia imaginar.

    
por 13.01.2018 / 11:17
0

No seu caso específico, seu link é do ano 2012 e fala sobre as versões do Ubuntu 11.10 e mais antigas.

O compat-wireless-3.0-rc4-1.tar.bz2 mencionado não parece mais estar disponível para download; e eu acho que o conteúdo seria essencialmente os drivers wireless da versão do kernel 3.0-rc4 adaptados para instalação em kernels mais antigos que isso. Seu Ubuntu 12.04 tem a versão do kernel 3.2 ou mais recente; este pacote seria um downgrade para você. O Kali 1.0.9 foi lançado em 2014 e provavelmente tem uma versão mais recente do kernel.

O patch do canal -1 mencionado em seu link modifica apenas 6 linhas em <kernel source root>/net/wireless/chan.c file e não altera nenhuma versão do firmware do módulo do kernel. Como resultado, não existe uma maneira fácil de determinar se o patch está instalado ou não, além de baixar o pacote de código-fonte do kernel para o kernel atualmente instalado e ver o arquivo de código-fonte.

Mas posso ir para o link e navegar pelo código sem baixá-lo. O kernel suportado de longo prazo mais antigo é o 3.2.98 neste momento: olhando para o arquivo .../net/wireless/chan.c , parece que o patch não está lá: embora os números de linha estejam a cerca de 30 linhas do patch, a estrutura do A função cfg80211_set_freq() ainda é essencialmente a mesma, portanto, pode-se, em teoria, aplicar esse patch a uma "baunilha" 3.2. série kernel.

O próximo kernel de longo prazo é a versão 3.16.53 neste momento: quando olho para o arquivo .../net/wireless/chan.c , vejo que ele foi totalmente revisado: a função cfg80211_set_freq() que o patch modifica simplesmente não está mais lá . Não há como instalar o patch -1 do canal nesta versão como está: você teria que entender o novo código, descobrir se o patch ainda é aplicável ou não e aplicar a versão equivalente das alterações listadas no patch para apropriar nova localização (s), se necessário.

E isso foi apenas o kernel padrão "baunilha". O Ubuntu ou o Kali podem ter aplicado mais patches nos kernels padrão por conta própria.

    
por 13.01.2018 / 13:29

Tags