Como compilar um ISO com um patch do kernel para outro computador?

2

Recentemente, comprei um HP Stream, que é um laptop arrumado e barato no qual pretendia instalar o Xubuntu. Infelizmente, tenho tido problemas devido à sua unidade eMMC.

Achei que parece impossível instalar qualquer versão do Linux (tentei as famílias Ubunbtu, Debian e Arch) sem aplicar esse patch do kernel.

Embora eu esteja familiarizado com o Linux como sistema operacional, nunca tive que aplicar um patch do kernel e não tenho certeza de como fazer isso para atender aos meus propósitos. Os tutoriais que encontrei até agora são para usuários avançados que desejam atualizar o sistema operacional atual.

Pela minha leitura, é possível compilar o kernel em uma máquina diferente, desde que a mesma arquitetura. (Ambos os computadores são x64) e possuem os drivers necessários.

Minhas perguntas são:

Como posso aplicar esse patch do kernel?

Como posso instalá-lo na minha máquina (ISO?)

Entendo que essa é uma pergunta longa e detalhada, mas fiquei sem ideias.

Alexander Lozada
fonte

Respostas:

2

Eu acho que não é super fácil, se houvesse alguma opção de inicialização do kernel que possa ajudar a inicializar a HP com um kernel padrão (como noapic, nomodeset, etc), eu tentaria primeiro.

Algumas instruções são muito longas e variadas para serem postadas aqui [ https://help.ubuntu.com/community/Kernel/Compile ], mas uma página parece quase razoável, se você estiver compilando para a mesma arquitetura e versão do Ubuntu.

Essas etapas são para compilar um kernel na sua máquina atual, se for do mesmo "tipo" x64 e executar a mesma versão do Ubuntu, poderá funcionar. [Em https://wiki.ubuntu.com/Kernel/BuildYourOwnKernel ]:

Obtendo a fonte para uma versão do Ubuntu

Ou

  • Ou apt-get source linux-image-$(uname -r)
  • Ou git clone git://kernel.ubuntu.com/ubuntu/ubuntu-<release codename>.git
    Por exemplo, para obter a árvore precisa:
    git clone git://kernel.ubuntu.com/ubuntu/ubuntu-precise.git

Ambiente de compilação

Se você não criou um kernel no seu sistema antes, existem alguns pacotes necessários para que você possa compilar com êxito. Você pode instalá-los com:

sudo apt-get build-dep linux-image-$(uname -r)

Modificando a configuração

[Aqui está a parte em que você aplicaria seu patch. Esse link parece que o patch acabou de ser modificado drivers/mmc/card/block.c, para que o arquivo esteja nos arquivos de origem baixados. Parece que apenas adiciona um pouco a uma linha; portanto, se você quiser editar manualmente a linha com copiar e colar que deve funcionar, ela remove as -linhas " " iniciais e adiciona as +linhas " " iniciais. Ou usando o patchprograma com patch --verbose -p1 <the_patch_file(talvez sem o -p1se não funcionar, controla como ele encontra o arquivo a ser corrigido, veja man patchinformações). Se você não estiver fazendo outras alterações, pularia o restante, conforme as instruções sugerem. ]

Esta etapa pode ser ignorada se nenhuma alteração na configuração for desejada. O processo de compilação usará uma configuração que é criada a partir de vários arquivos de subconfiguração. A maneira mais simples de modificar qualquer coisa aqui é executar:

chmod a+x debian/scripts/*
chmod a+x debian/scripts/misc/*
fakeroot debian/rules clean
fakeroot debian/rules editconfigs

Isso pega a configuração atual de cada arquitetura / sabor suportada e chama o menuconfig para editar seu arquivo de configuração. O chmod é necessário porque, como o pacote de origem é criado, ele perde os bits executáveis ​​nos scripts.

O apt-get tentará "atualizar" o kernel para a versão / build do kernel do Ubuntu se você criar um kernel personalizado sem anexar uma string extra ao final da sua versão do kernel. Para impedir o apt-get de listar o kernel do Ubuntu como atualizável quando você digita o apt-get upgrade, você deve (na documentação do kernel) anexar uma string extra ao final da sua versão do kernel. Isso será exibido quando você digitar uname, por exemplo.

Para evitar isso, no Menu de Configuração do Kernel, navegue e modifique:

  1. Configuração geral --->
  2. () Versão local - anexa à versão do kernel

Construindo o kernel

Construir o kernel é bastante fácil. Altere seu diretório de trabalho para a raiz da árvore de origem do kernel e digite os seguintes comandos:

fakeroot debian/rules clean
fakeroot debian/rules binary-headers binary-generic

Se a compilação for bem-sucedida, um conjunto de três arquivos de pacote binário .deb será produzido no diretório acima do diretório raiz da compilação. Por exemplo, após a construção de um kernel com a versão "2.6.38-7.37" em um sistema amd64, esses três (ou quatro) pacotes .deb seriam produzidos:

cd ..
ls *.deb
    linux-headers-2.6.38-7_2.6.38-7.37_all.deb
    linux-headers-2.6.38-7-generic_2.6.38-7.37_amd64.deb
    linux-image-2.6.38-7-generic_2.6.38-7.37_amd64.deb

em versões posteriores, você também encontrará um pacote linux-extra que você também deve instalar se presente.

Testando o novo kernel

Instale o conjunto de três pacotes (em seu sistema de construção ou em um sistema de destino diferente) com dpkg -i e, em seguida, reinicie:

sudo dpkg -i linux*2.6.38-7.37*.deb
sudo reboot

Sobre a parte da instalação, eu não me incomodaria em criar um ISO (com algo como remastersys) que provavelmente seja apenas outra dor de cabeça ;-)

Se você pudesse copiar os arquivos para o disco rígido que pode funcionar. Normalmente, eu sugiro um live CD / USB do linux, mas se o Ubuntu não inicializar ... talvez uma distro diferente com um kernel diferente, ou use o Windows para copiar os arquivos, ou uma imagem de partição e uma ddferramenta equivalente ao Windows ?

Xen2050
fonte
Obrigado por tomar o tempo para escrever isso. Que tal aplicar o patch?
Alexander Lozada
Adicionado um pouco sobre como usá-lo na seção "Modificando ...", em []'s. Para sua informação, se você não estiver familiarizado com eles, o patch é a parte da página vinculada de diff --git ...baixo para baixo, realmente apenas modificando essa -linha na +linha (os caracteres -& +são apenas para patchreferência, não parte da fonte)
Xen2050