Skip to content

Instantly share code, notes, and snippets.

@sidneiweber
Created January 21, 2018 17:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sidneiweber/2db9deeb5fa872ec9e212d08d7daf407 to your computer and use it in GitHub Desktop.
Save sidneiweber/2db9deeb5fa872ec9e212d08d7daf407 to your computer and use it in GitHub Desktop.
┌───────────────────────────┐
│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! ;)
──────────────────────────────────────────────────────────────────────────────────────
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment