sidneiweber
1/21/2018 - 5:16 PM

Compilação kernel debian.txt

┌───────────────────────────┐
│Compilação do Kernel Linux │
│Para máquinas locais Debian│
└───────────────────────────┘

Autor:  Jefferson Rocha <lrcjefferson@gmail.com.br>
Seção:  Manual
Versão: 1.0
Atualização: 10/01/2018
Homepage: http://www.jeffersonrocha.com.br
Licença: MIT
──────────────────────────────────────────────────────────────────────────────────────

	
────────┐
ÍNDICE: │
────────┘

   0.1.......Compensa compilar o kernel?
   0.2.......Dependências necessárias

   1.........Inicio
   1.1.......Verificando Assinatura (.sign)
   1.2.......Ajustes

   1.3.......config
   1.3.1.....Configuração Local
   1.3.2.....localmodconfig
   1.3.3.....localyesconfig
   1.3.4.....Informações do Sistema

   2.........config
   2.1.......Garimpando o .config

   3.........Compilação
   3.1.......Processo Final


──────────────────────────────────────────────────────────────────────────────────────

─────────────────────────────────┐
0.1 COMPENSA COMPILAR O KERNEL?? │
─────────────────────────────────┘

  Em pleno século que estamos está pergunta ainda é recorrente nos fóruns e também 
  matuta muita a cabeça da galera. A   pergunta é sempre a mesma! compensa compilar
  o kernel?
  será que perder horas ira me compensar de alguma forma?
  "Ahhh será só alguns segundos a mais no meu boot, não vou compilar."
  Mas você está enganado pequeno gafanhoto, compilar o kernel compensa de algumas 
  formas sim e não apenas no seu boot.
 
  Pense comigo! imagine uma casa de médio porte com várias janelas ao redor dela, para
  exemplificar vamos usar 200 janelas ao total. Penso? você acha que não é muito mais
  suscetível a roubos que uma casa do mesmo porte com 10 janelas?
  Mas Jefferson o que janelas tem a ver com o kernel? tem muito a ver, quanto mais
  módulos e drivers carregados mais a possibilidade de falhas e vulnerabilidades...
  por isso é de extrema importância você ter um kernel personalizado para sua máquina.
  Todas distribuições assim como a Emmi, utilizam kernel genérico o objetivo é atingir
  e ter suporte a praticamente todos hardwares/drivers etc...
  Então se você usa por exemplo um processador/componentes 'AMD' por que precisaria
  ter drivers 'INTEL' no seu computador?
  Porque precisaria ter por exemplo suporte a wifi se seu computador é cabeado.
  Você precisaria ter suporte a antena de Rádio  se você nem sabe o que é isso? 
  Não se preocupe, vamos abordar o assunto mais aprofundado e você vai conseguir
  criar seu kernel personalizado de uma vez por todas facilmente!
  Após ler esse documento você vai ver que não é nada difícil!
  

──────────────────────────────────────────────────────────────────────────────────────

─────────────────┐
0.2 DEPENDÊNCIAS │
─────────────────┘

     build-essential ncurses-dev xz-utils wget


──────────────────────────────────────────────────────────────────────────────────────


─────────┐
1. INICIO│
─────────┘

  Muitas perguntas veem em nosso fórum e email, pedindo um bom tutorial
  para compilar o kernel Linux. Bom como sabemos a Emmi é baseada no Debian, 
  o que torna este processo muito mais fácil, com alguns comandinhos você já 
  pode compilar o Kernel Linux sem dor de cabeça.
  Porem você precisa realmente saber o que está fazendo! compilar é fácil, 
  o que complica um pouquinho é que você deve saber exatamente e conhecer bem
  o seu hardware que estão presentes em seu computador, para um maior desempenho!
  Mas não se preocupe, para aprender precisamos praticar, então faça sem medo.
  Vamos lá?
  Vamos rodar instalar todos pacotes de uma vez, logue-se como root ou utilize
  o sudo para realizar este procedimento.
  
  # apt install build-essential ncurses-dev xz-utils wget


  Feito este processo vamos baixar o código fonte do Kernel linux, podemos baixar
  via site (https://www.kernel.org/) ou com o comando wget, neste caso vamos usar
  o comando wget para melhor ensinamento.
  Note que a versao que estamos utilizando para esta documentação é a versão 4.14.12
  Então não apenas copie e cole e revise para uma melhor didática.
  
  $ wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.12.tar.xz

  Aproveite e baixe a assinatura também para verificação de integridade.

  $ wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.12.tar.sign


──────────────────────────────────────────────────────────────────────────────────────

──────────────────────────┐
1.1 VERIFICANDO ASSINATURA│
──────────────────────────┘

  Ótimo!! agora vamos verificar a integridade da assinatura, descompacte o 
  arquivo Kernel linux e em seguida utilize o GnuPG para verificação:

  $ unxz linux-4.14.12.tar.xz

  e agora vamos verificar a assinatura.

  $ gpg --verify linux-4.14.12.tar.sign
  Sáida:
  gpg: assumindo dados assinados em `linux-4.14.12.tar'
  gpg: Signature made Sex 05 Jan 2018 12:49:11 -02 using RSA key ID 6092693E
  gpg: Impossível verificar assinatura: chave pública não encontrada

  Pegue a "RSA key ID 6092693E" adicione em suas chaves:

  $ gpg --keyserver hkp://keys.gnupg.net --recv-keys 6092693E

  Sáida:
  gpg: requesting key 6092693E from hkp server keys.gnupg.net
  gpg: key 6092693E: public key "Greg Kroah-Hartman (Linux kernel stable release signing key) <greg@kroah.com>" imported
  gpg: key 6092693E: public key "Greg Kroah-Hartman <gregkh@linuxfoundation.org>" imported
  gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
  gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
  gpg: Número total processado: 2
  gpg:               importados: 2  (RSA: 2)


  Agora vamos verificar novamente a assinatura:
  $ gpg --verify linux-4.14.12.tar.sign

  Sáida
  gpg: assumindo dados assinados em `linux-4.14.12.tar'
  gpg: Signature made Sex 05 Jan 2018 12:49:11 -02 using RSA key ID 6092693E
  gpg: Good signature from "Greg Kroah-Hartman <gregkh@linuxfoundation.org>"
  gpg:                 aka "Greg Kroah-Hartman <gregkh@kernel.org>"
  gpg:                 aka "Greg Kroah-Hartman (Linux kernel stable release signing key) <greg@kroah.com>"
  gpg: AVISO: Esta chave não está certificada com uma assinatura confiável!
  gpg:        Não há indicação de que a assinatura pertence ao dono.
  Impressão da chave primária: 647F 2865 4894 E3BD 4571  99BE 38DB BDC8 6092 693E

  Feito! a assinatura bateu, perceba que tem o (Good signature) se caso der (Bad signature) algo está errado! :)


──────────────────────────────────────────────────────────────────────────────────────

───────────┐
1.2 AJUSTES│
───────────┘

  Vamos agora começar a brincadeira de verdade! em meu caso como baixei 
  via wget o kernel, o fonte está no meu home.
  Então vamos primeiramente extrair o kernel e depois mover para /usr/src,
  está será a pasta a qual vamos trabalhar.

  $ unxz linux-4.14.12.tar.xz && tar -xvf linux-4.14.12.tar
  ou
  $ tar -xvJf linux-4.14.12.tar.xz

  *Nota: É mais fácil usar o parâmetro J que chama o xz, não se confuda com 'j'
  pois é para bzip2.
  Para maiores informações use o 'man' ou 'tar --help'

  Agora vamos mover o fonte descompactado para /usr/src em seguida entrar
  neste diretório.
  A partir de agora precisamos do Root.

  # mv linux-4.14.12 /usr/src/ && cd /usr/src

  Para não precisar todo o diretorio da fonte 'linux-4.14.12' vamos criar um
  link simbólico chamado 'linux' para facilitar sua manipulação.

  # ln -sf linux-4.14.12 linux

  O parâmetro 's' cria um link simbólico o parâmetro 'f' remove os arquivos
  de destino.

  Entre agora em 'linux'.

  # cd linux
 
*** NOTA ***
   Nos cápitulos seguintes será mostrado uma série de configurações!
   Caso você não deseja fazer a opção, siga em frente até achar uma que se
   adapte a sua necessidade.


──────────────────────────────────────────────────────────────────────────────────────

──────────────────────────┐
1.3 .config	 	  │
──────────────────────────┘

   Para a nossa necessidade vamos pegar o .config genérico do computador em execução.
   Ou seja, lá está armazenado alguns módulos já necessários (carregados) para o seu
   sistema.
   Para isso vamos copiar essa configuração para dentro da nossa pasta aonde está sendo
   compilado o nosso kernel.
  
   # ls /boot/config*
   # cp -v /boot/config-huge-4.4.14 /usr/linux/.config

   ***NOTA***
     Note que config-huge-4.4.14 pode ter váriações então se adapte a sua realidade!
   
   No próximo tópico vamos aprender algumas técnicas para peneirar seu .config antes
   de começar a realmente o processo!

   
──────────────────────────────────────────────────────────────────────────────────────

────────────────────────┐
1.3.1 Configuração Local│
────────────────────────┘

  Usar uma configuração local é um bom meio de peneirar seu novo Kernel e existem 
  alguns métodos para isto!
  Mas vale resaltar que estes métodos podem resultar em falhas na questão de não
  peneirar todos os drivers desnecessários.
  Então mesmo assim é interessante você fazer uma configuração a mais para conseguir
  retirar o máximos de módulos e opções desnecessárias do seu novo Kernel.


──────────────────────────────────────────────────────────────────────────────────────


────────────────────┐
1.3.2 localmodconfig│
────────────────────┘
  
  localmodconfig - Atualize os módulos desativados de configuração atuais
  não carregados, está opção compila em módulo.
  


──────────────────────────────────────────────────────────────────────────────────────

────────────────────┐
1.3.3 localyesconfig│
────────────────────┘

  localyesconfig - É similar ao 'localmodconfig' pórem compila de forma embutida
  no kernel ou seja sem módulos.


──────────────────────────────────────────────────────────────────────────────────────

────────────────────────────┐
1.3.4 Informações do Sistema│
────────────────────────────┘

  Quando vamos compilar o kernel precisamos saber informações da nossa
  máquina, para ter um sucesso mais satisfátorio e assim fazer um kernel no estilo
  luva, que caberá certinho para sua máquina.
  Existe alguns metodos para obter informações do seu sistema, irei te passar 4
  formas de se fazer isto, que se usadas em conjuntos ficam bem completas!
  Então não tenha preguiça!

  1- lspci
  2- lsusb
  3- cpuinfo
  4- lsmod

  É interessante você redirecionar as saídas para algum arquivo em texto ou algo
  do genero, para você estudar mais com calma todos os seus componentes necessários.

  $ lspci -v

  $ lsusb -v

  $ lsmod

  $ cat /proc/cpuinfo

  ***NOTA***
   Você pode usar dois 'v' para ficar mais verboso ainda, ex: lspci -vv
   Se caso queira redirecionar a saída para um arquivo use '>/diretorio' exemplo:
   lspci -v > /home/slackjeff/lspci.txt


──────────────────────────────────────────────────────────────────────────────────────

──────────────────────────┐
2.1 Garimpando o .config  │
──────────────────────────┘

  Após um breve entendimento sobre como dar uma peneirada no .config vamos começar a
  nossa brincadeira! Ainda nas pasta /usr/linux siga.
  Na documentação do Kernel a um pedido para antes de tudo limpar a "Sujeira"
  do fonte... Para isto rode:

  # make mrproper

  Vamos começar a configurar o kernel agora, para isto rode o comando 
  'make menuconfig'.

  # make menuconfig

  Saída:
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/mconf.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/zconf.lex.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTCC  scripts/kconfig/lxdialog/checklist.o
  HOSTCC  scripts/kconfig/lxdialog/util.o
  HOSTCC  scripts/kconfig/lxdialog/inputbox.o
  HOSTCC  scripts/kconfig/lxdialog/textbox.o
  HOSTCC  scripts/kconfig/lxdialog/yesno.o
  HOSTCC  scripts/kconfig/lxdialog/menubox.o
  HOSTLD  scripts/kconfig/mconf
  scripts/kconfig/mconf  Kconfig
  #
  # using defaults found in /boot/config-4.10.14emmi
  #

  Perceba que acima nesta caixa de dialog está especificando como utilizar
  o mesmo! Você pode usar o direcional para navegar entre os menus, caso 
  queira alternar para os menus principais (Select, Exit, Help, Save, Load)
  você pode usar o TAB.
  Para fazer um selecionamento rápido perceba que os menus Tem uma cor diferente
  na primeira letra, por exemplo se eu quisesse usar o 'Help' poderia simplesmente
  aperta a letra 'H' do meu teclado ou 'Save' a letra 'S'.

  Vamos agora carregar nosso .config, para isso selecione o 'Load' no menu.
  Irá abrir uma caixa parecida com esta abaixo, dê um < Ok > para prosseguir.

     ┌─────────────────────────────────────────────────────┐
     │  Enter the name of the configuration file you wish  │  
     │  to load.  Accept the name shown to restore the     │  
     │  configuration you last retrieved.  Leave blank to  │  
     │  abort.                                             │  
     │ ┌─────────────────────────────────────────────────┐ │  
     │ │.config                                          │ │  
     │ └─────────────────────────────────────────────────┘ │  
     ├─────────────────────────────────────────────────────┤  
     │               <  Ok  >      < Help >                │  
     └─────────────────────────────────────────────────────┘



  Após ter feita toda configuração Aperta [Save] e um [Exit] para sair do dialog.

  Pronto agora o seu .config está pronto para receber um dos 2 comandos ditos nos
  tópicos anteriores (localmodconfig, localyesconfig).
  Escolha o que mais se adapta a sua situação em nosso caso vamos usar o
  'localmodconfig'.
  Nesta primeira jornada vamos rodar o 'localmodconfig' note que caso seu kernel
  compilado seja maior (VERSÃO) que o .config do kernel generico irá aparecer algumas
  perguntas leia atenciosamente ou simplesmente tecle [ENTER] para deixar as opções
  padrões!
  
  # localmodconfig

  Após concluir este passo rode o 'make menuconfig' para abrir o menu de opções do
  kernel.
  É de extrema inportância que você faça com calma e vá abrindo opção por opção para
  enxugar bem o seu kernel sem tirar algo necessário para o bom funcionamento do seu
  hardware.
  Caso você está sem muito tempo, pare a configuração, dê um [SAVE] e [QUIT] e 
  retorne outra hora para terminar a configuração.

  # make menuconfig

  Após feito o processo de escolhas dê um [SAVE] e [QUIT] e saia, após concluir este
  processo vá para o próximo tópico, agora vamos começar a compilar.

──────────────────────────────────────────────────────────────────────────────────────

─────────────┐
2. COMPILAÇÃO│
─────────────┘

  Vamos começar a compilação, este procedimento é um pouco demorado! em minha
  máquina (2gb ram, 1 core) demora em torno   de 3 horas e 15 minutos quando estou
  usando o computador, quando o mesmo está somente fazendo está tarefa o processo
  diminui em até 20 minutos.
  Aconselho você a ir tomar um café, dar uma volta com o cachorro! 
  Rode o comando:

  #  make deb-pkg LOCALVERSION=-custom-kernel KDEB_PKGVERSION=-1

  Parâmetros utilizados:
  LOCALVERSION, é nome que voce vai dar ao seu kernel personalizado, por exemplo
  utilizamos custom-kernel.

  KDEB_PKGVERSION Usamos como rebuild, no caso quantas vezes esse fonte foi
  modificado, como é nosso primeiro build utilizamos 1.

  ***NOTA
   É interessante usar sempre o traço "-" antes do nome do kernel e do build.


──────────────────────────────────────────────────────────────────────────────────────

──────────────────┐
2.1 PROCESSO FINAL│
──────────────────┘

  Feito! após aguardar um bom tempo chegou a hora de instalar, os pacotes estão
  no diretório acima.

  # cd ..

  Rode o comando 'ls' para verificar os arquivos .deb.

  # ls *.deb

  Saída:
  linux-headers-4.14.12_1.CUSTOMIZADO_amd64.deb linux-image-4.14.12_1.CUSTOMIZADO_amd64.deb

  Vamos instalar.

  # dpkg -i linux-headers-4.14.12_1.CUSTOMIZADO_amd64.deb
  # dpkg -i linux-image-4.14.12_1.CUSTOMIZADO_amd64.deb

  Reinicie a Máquina

  # shutdown -r now

  Após a máquina rebootar verifique o seu novo kernel!

  $ uname -r


  Parabéns, você acaba de compilar o seu próprio Kernel! ;)

──────────────────────────────────────────────────────────────────────────────────────