Compilando o Kernel Linux sem o Git! - Tópico em desenvolvimento

Iniciado por galactus, 05 de Setembro de 2011, 01:01

tópico anterior - próximo tópico

galactus

Bom, resolvi começar este tópico já que as regras de compilação mudaram bastante desde a versão 2.6.34 do tópico do HqxRiven!

Conto com a colaboração de todos os colegas interessados e que já realizam suas compilações!

Este tópico não serve para iniciantes que não sabem nada de linha de comando e compilação de kernel Linux!!! Aqui vamos colocar as dicas e fazer as devidas alterações até que tudo funcione! Contudo nada impende o iniciante de aprender, então por favor, antes estude um pouco!

Temos muita coisa a acrescentar, pretendo fazer nesse tópico todas as alterações que os colegas julgarem necessárias, quando estiver tudo direitinho eu bloqueio este tópico e crio outro "final" com todos os créditos e méritos de quem ajudou!

Por favor testem nas diferentes versões do Ubuntu e do Linux Mint e reportem erros e acertos! Assim coloco em que versões esse tuto funcionou!


Introdução!

Felizmente para uns e infelizmente para outros as regras para compilação do kernel Linux foram bastante alteradas para facilitar a vida dos desenvolvedores! Agora você deve usar o Git para compilar o kernel. Para quem não sabe o Git se encaixa na categoria de ferramentas de gestão de código fonte distribuído, ou seja, com ele  você consegue controlar todas as revisões do kernel sem depender da rede ou de um servidor central! Infelizmente isso implica em baixar de 400MB a mais de 700MB em códigos fontes do kernel Linux só para poder compilar uma única versão do kernel! E se eu não quiser utilizar esse método? Se quiser apenas baixar uma versão do kernel linux para customizá-lo para a minha máquina? Este tópico vai tentar cobrir essa lacuna, a de quando você quer compilar o kernel Linux mas sem usar o Git, contudo, utilizando das novas regras criadas pelos desenvolvedores com o Git!

Vou usar como base este Blog: http://duopetalflower.blogspot.com/2010/10/ubuntu-maverick-64bit-kernel.html




Assim teríamos:


1) Instalando as dependências para compilar o kernel:

$ sudo apt-get install fakeroot build-essential crash kexec-tools makedumpfile kernel-wedge libncurses5 binutils-dev libelf-dev libdw-dev libnewt-dev libncurses5-dev

Depois instale os seguintes pacotes sem as recomendações, que são muitas:

$ sudo apt-get  --no-install-recommends install asciidoc xmlto


2) Baixando o código fonte do Kernel Linux:

Aqui você tem duas opções, você pode baixar um arquivo fonte do www.kernel.org e assim customizar a sua versão pretendida do kernel oficial ou baixar o fonte do kernel do Ubuntu, se pretende customizar a versão do kernel em uso do seu Ubuntu!

a) Visite o site www.kernel.org e baixe a versão "Full Source" com extensão *.tar.bz2 que você pretende compilar! Depois de baixada a versão pretendida, dentro do seu diretório /home, crie uma pasta para realizar todo o processo como usuário comum. Não precisa ser mais root ou usar o diretório /usr/src para compilar o kernel!

Neste exemplo vamos criar o diretório "Builds", mas você pode dar o nome que quiser!

$ mkdir Builds


Copie o arquivo fonte do kernel com extensão *.tar.bz2 para esta pasta e depois descompacte o mesmo. Você pode fazer isso em modo gráfico ou em modo texto se preferir!


b) Se você vai usar uma versão do kernel do Ubuntu, crie a pasta "Builds", entre nela e depois execute:

$ mkdir Builds
$ cd Builds
$ apt-get source linux-image-$(uname -r)


Assim você vai baixar o fonte do kernel do Ubuntu em uso! Note que está tudo sendo executado como usuário comum!


3) Crie uma cópia do arquivo fonte em outra pasta por segurança

Se houver qualquer erro você simplesmente deleta a pasta cópia e começa tudo novamente.

$ cp *nome_do_kernel* linux -r

4) Criando um novo .config!

OBs.: Aqui temos o primeiro problema do tutorial que usei como base. O autor diz que devemos copiar o .config do debian.master! Mas ele não existe se não estamos usando o Git! Encontrei outra dica que acho que serve melhor para quem vai usar o kernel do Ubuntu!  Ele copia o .config do Ubuntu e depois altera o seu nome!

Exemplos:

Dica original do Blog:

cp debian.master/config/amd64/config.flavour.generic debian.master/config/amd64/config.flavour.i7

Dica do outro Blog ( http://blog.avirtualhome.com/2008/10/28/how-to-compile-a-custom-kernel-for-ubuntu-intrepid/) :

cp /boot/config-$(uname -r) .
make menuconfig


Por falta de tempo ainda não testei o segundo método. Alguém confirma?

E quando você quiser utilizar outro .config que não o do Ubuntu?

No aguardo de soluções e dicas para prosseguir!
BigLinux no Notebook  / Várias Distros Virtualizadas no PC.

Stivekx

.config é bom usar localmodconfig (ao menos eu gostei)
Pode usar uma .config como a do liquorix também....

vampire_thunder

Já tentei usar a .config de outros kerneis (como por exemplo o Zen e o Omnislash) e sempre deu m***. Isso acontece porque eles geralmente acrescentam muitas entradas que não estão nas configs originais do Ubuntu, e na hora de compilar dá erro.
Talvez as configs do Debian podem vir a funcionar.

Hqxriven

Mais um que vai se divertir com esse tutorial!  :D

Obrigado Galactus!
Sem distro Linux fixa - Kernel Omnislash
Meu objetivo nesse fórum é ajudar. Sou um mero humano mas desejo sempre aprender e melhorar em tudo o que faço em minha vida. Então, por favor, quando eu postar me notifique depois

cesargcomp

Tentei compilar o 3.04 com .config do liquorix e deu o erro abaixo:
make[1]: Saindo do diretório `/home/cesar/Builds/linux-3.0.4'
/usr/bin/make -j2 EXTRAVERSION=-1cesargcomp  ARCH=i386 \
     -C Documentation/lguest
make: *** Documentation/lguest: Arquivo ou diretório não encontrado.  Pare.
make: ** [debian/stamp/build/kernel] Erro 2


O que faço?
Use Ubuntu. Segurança, facilidade e gratuidade em suas mãos.

galactus

Stivekx e Vampire, então vamos ter que dividir essa parte do Tuto entre o .config que vai ser usado em um kernel Vanilla e outro .config a ser usado com o kernel do Ubuntu!

Vocês dois já testaram os dois métodos? Eu só testei o método do .config com o kernel vanilla!
BigLinux no Notebook  / Várias Distros Virtualizadas no PC.

galactus

Citação de: Hqxriven online 05 de Setembro de 2011, 14:12
Mais um que vai se divertir com esse tutorial!  :D

Obrigado Galactus!

Putz Hq!  Se divertir? Só?

Ajuda aí ne!  ;D

Você já testou esse novo método?

De nada!
BigLinux no Notebook  / Várias Distros Virtualizadas no PC.

galactus

Citação de: cesargcomp online 05 de Setembro de 2011, 15:03
Tentei compilar o 3.04 com .config do liquorix e deu o erro abaixo:
make[1]: Saindo do diretório `/home/cesar/Builds/linux-3.0.4'
/usr/bin/make -j2 EXTRAVERSION=-1cesargcomp  ARCH=i386 \
     -C Documentation/lguest
make: *** Documentation/lguest: Arquivo ou diretório não encontrado.  Pare.
make: ** [debian/stamp/build/kernel] Erro 2


O que faço?

César meu fio!  O tópico ainda não está pronto, vamos por partes, primeiro vamos escrever o tópico, depois tentaremos resolver os problemas, posta essa dúvida no tópico do Hqx por enquanto!

Tens alguma dica?
BigLinux no Notebook  / Várias Distros Virtualizadas no PC.

cesargcomp

#8
Consegui!!!!!!!!!!! Nem acredito...

Vou postar os procedimentos que fiz aqui no meu Athlon 64 3200+ 1GB RAM HD 120GB. Segui o link fonte e adaptei ao meu processador.
Fonte: http://duopetalflower.blogspot.com/2011/08/custom-kernel-301-ubuntu-64-bit-kernel.html


# Instalando as dependências para compilar o kernel:
sudo apt-get install fakeroot build-essential crash kexec-tools makedumpfile kernel-wedge libncurses5 binutils-dev libelf-dev libdw-dev libnewt-dev libncurses5-dev
sudo apt-get  --no-install-recommends install asciidoc xmlto
# Baixando o kernel
wget http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.0.4.tar.bz2
# Baixando patches do Ubuntu Oneiric
wget -c http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.0.4-oneiric/0001-base-packaging.patch
wget -c http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.0.4-oneiric/0002-debian-changelog.patch
wget -c http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.0.4-oneiric/0003-default-configs.patch
# Criar pasta para realizar o processo
mkdir /home/cesar/Builds
# Copiar código fonte e patches para /home/cesar/Builds
cp *.bz2 *.patch /home/cesar/Builds
# Extrair fonte
cd /home/cesar/Builds
tar -xvjf linux-3.0.4.tar.bz2
# Crie uma cópia do arquivo fonte em outra pasta por segurança
cp linux-3.0.4 linux -r
cd linux
# Instalando patches do Ubuntu Oneiric
patch -p1 < ../0001-base-packaging.patch
patch -p1 < ../0002-debian-changelog.patch
patch -p1 < ../0003-default-configs.patch
# Criando um novo .config
cp debian.master/config/i386/config.flavour.generic debian.master/config/i386/config.flavour.k8
# Fazer debian/rules executável
chmod -Rv +x debian/rules
# Fazer pasta debian/scripts executável
chmod -Rv +x debian/scripts/
# "Faxina"
fakeroot debian/rules clean
fakeroot debian/rules updateconfigs
# Dê y somente no flavor do seu processador (meu caso k8 - config.flavour.k8) - vai abrir o menuconfig
fakeroot debian/rules editconfigs
# Copiar entradas abi para o flavor de seu processador e adicionar entradas de seu processador em vars e i386.mk
# (aqui será necessário adaptar. Se o processador for 64 bits, no link fonte tem o exemplo de um core i7)
cp debian.master/abi/3.0.0-9.13/i386/generic debian.master/abi/3.0.0-9.13/i386/k8
cp debian.master/abi/3.0.0-9.13/i386/generic.modules debian.master/abi/3.0.0-9.13/i386/k8.modules
sed -i s/getall\ i386\ generic\ generic-pae\ virtual/getall\ i386\ generic\ generic-pae\ virtual\ k8/g debian.master/etc/getabis
sed -i s/\=\ generic\ generic-pae\ virtual/\=\ generic\ generic-pae\ virtual\ k8/g debian.master/rules.d/i386.mk
cp debian.master/control.d/vars.generic debian.master/control.d/vars.k8
sed -i s/\"Generic\"/\"athlon\ 64\"/g debian.master/control.d/vars.k8
# Editar arch/x86/Makefile e arch/x86/Makefile_32.cpu mudando de -march=xx para -march=native e -mtune=xx para -mtune=k8
gedit arch/x86/Makefile
cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8)
# para
cflags-$(CONFIG_MK8) += $(call cc-option,-march=native)
gedit arch/x86/Makefile_32.cpu
cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8,-march=athlon)
# para
cflags-$(CONFIG_MK8) += $(call cc-option,-march=native,-march=native)
# "Faxina"
fakeroot debian/rules clean
# Criar arquivos .deb do headers e do source - independente da arquitetura ou flavor
time skipabi=true skipmodule=true fakeroot debian/rules binary-indep
Tempo: 2m 18s
# criou os seguintes arquivos:
# linux-doc_3.0.4-030004.201108301138_all.deb
# linux-headers-3.0.4-030004_3.0.4-030004.201108301138_all.deb
# linux-source-3.0.4_3.0.4-030004.201108301138_all.deb
# linux-tools-common_3.0.4-030004.201108301138_all.deb

# Criar o kernel atual
time skipabi=true skipmodule=true fakeroot debian/rules binary-k8
# criou os seguintes arquivos:
Tempo: 3h 17m 41s
real 197m40.755s
user 134m21.851s
sys 15m52.579s
# criou os seguintes arquivos:
# linux-headers-3.0.4-030004-k8_3.0.4-030004.201108301138_i386.deb
# linux-image-3.0.4-030004-k8_3.0.4-030004.201108301138_i386.deb

abra um outro terminal e execute após 2 minutos de compilação: ps ax | grep gcc | grep march

# Remover o diretório do kernel e link "linux"
cd /home/cesar/Builds
rm -rf /home/cesar/Builds/linux
rm -rf /home/cesar/Builds/linux-3.0.4
# Instalar kernel
dpkg -i linux*.deb

Ficou muito bom! Rápido e com um consumo inicial por volta de 160MB de RAM e fluindo muito bem!
Espero ter colaborado.
Use Ubuntu. Segurança, facilidade e gratuidade em suas mãos.

galactus

Excelente César!

Muito obrigado, vou testar essa receita de bolo!
BigLinux no Notebook  / Várias Distros Virtualizadas no PC.

Gunss

pode usar o .config do www.kernel-seeds.org
ele é MUITO básico, então você teria que adicionar todo o seu hardware + opções que o Ubuntu pede, depois passo quais configs o Ubuntu pede por padrão.

Alguém já testou a nova opção do RCU que ta uma prio RT ao sistema como um todo, não deixando um thread ficar mais que X milesegundos ocupando tempo de processamento?? Em sistemas com os novos SB deve ser muito útil, mas pode ser muito prejudicial. Qualquer programa que você vá usar e que realmente precisa de uma prio maior e de muito tempo de acesso no processador (como jogos) podem sair prejudicados.

Ah, não consigo compilar o kernel 3.0.4 no 11.10, só aplico os patchs do ureadahead e BFS.

Qual a vantagem de usar o kernel do ubuntu? Eles não adicionam quase nada =/

galactus

Citação de: Gunss online 06 de Setembro de 2011, 08:25
pode usar o .config do www.kernel-seeds.org
ele é MUITO básico, então você teria que adicionar todo o seu hardware + opções que o Ubuntu pede, depois passo quais configs o Ubuntu pede por padrão.

Alguém já testou a nova opção do RCU que ta uma prio RT ao sistema como um todo, não deixando um thread ficar mais que X milesegundos ocupando tempo de processamento?? Em sistemas com os novos SB deve ser muito útil, mas pode ser muito prejudicial. Qualquer programa que você vá usar e que realmente precisa de uma prio maior e de muito tempo de acesso no processador (como jogos) podem sair prejudicados.

Ah, não consigo compilar o kernel 3.0.4 no 11.10, só aplico os patchs do ureadahead e BFS.

Qual a vantagem de usar o kernel do ubuntu? Eles não adicionam quase nada =/


É uma opção usar o .config do kernel seeds, mas eu acho radical demais! Se o pessoal não prestar atenção o kernel nem vai dar boot! Claro que quem quiser vai poder usá-lo.

Não, não testei essa nova opção do RCU. Ainda estou tentando ter certeza que o tutorial funcione!

O objetivo de colocar o kernel do Ubuntu é pra quem quer uma versão customizada e mais segura, assim você sabe que as chances são muito altas dele funcionar sem problemas no seu Ubuntu/Mint.

Pretendo dividir o tuto em customizar o kernel do Ubuntu e usar o vanilla com outros patchs que a pessoa quiser!  Agora, os paus que isso vai dar depois é por conta de quem colocar os patchs não testados né!
Vejam que não vamos criar um "omnislash" da vida, vamos dar as ferramentas para o interessado compilar o kernel desejado!

BigLinux no Notebook  / Várias Distros Virtualizadas no PC.

Gunss

Muito bem galactus, vou testar hoje a noite esse tutorial apenas aplicando patchs do ubuntu e mais nada.

Agora sobre patchs, da uma olhada nesse:
https://patchwork.kernel.org/patch/999102/

patch para o kernel para trabalhar melhor com os futuros BDZ e seus módulos. Bem legal.

Mandrak73

#13
Muito bom galactus!!! Sou novo aqui mais já vinha acompanhando o forum a mais de dois anos..
Minhas dicas para continuar são:


make

make modules_install

make install

E para finalizar crie o initramfs com o seguinte comando:

update-initramfs -k versão_do_kernel -u

obs: Onde está escrito versão do kernel coloque a numeração dele exemplo 3.0.0
Sei que é desnecessário essa explicação mais sei lá pode ter gente que não sabe ress..


Depois atualize o grub:

update-grub

A e onde está o seguinte código:

cp /boot/config-$(uname -r) .
make menuconfig


Creio que esteja errado não seria assim:

cp /boot/config-$(uname -r) .config
make menuconfig

galactus

Obrigado Gunss!

Obrigado Mandrake73, mas este não seria o método antigo? Estamos querendo o método novo! Ou estaria errado?  Esse método serviria para o Ubuntu 10.04, e a criação do initramfs só era necessária até o Ubuntu 10.04 também, do 10.10 em diante ele cria automaticamente o initramfs!  Não estou certo? Claro que posso estar errado! Você confirma?

Infelizmente pra mim o tutorial que deu certo para o cesargcomp não deu certo pra mim!

Brochante!

Deu o mesmo erro de quando segui o tuto gigante do Git do vampire!


Citargalactus@galactus-home ~/Builds/linux $ skipabi=true skipmodule=true fakeroot debian/rules binary-i7
make: *** Sem regra para processar o alvo `binary-i7'.  Pare.

O mais impressionante é que sigo tudo igual ao tuto, não dá erro nenhum e mesmo assim não funfa bem na hora H!

Mais alguém teve esse erro?

Eu estive olhando os arquivos do debian/rules e realmente não existe um binary-i7, existem o build-indep e o binary-perarch, mas não o bendito binary-i7!

Agora porque raios isso acontece?
BigLinux no Notebook  / Várias Distros Virtualizadas no PC.