Compilação tradicional do kernel estável 3.18.7 no Debian


Tendo um tempinho de sobra resolvi compilar da maneira tradicional o último kernel estável, o 3.18.7 no Debian, isto é, sem gerar os .debs com o kernel-package.

Era uma vez?, ops!

Baixe o último kernel estável:

$ wget -c http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.18.7.tar.xz

Mas, se quiser a última versão (no momento o kernel 3.19), execute:

$ wget --no-check-certificate https://www.kernel.org/$(wget -qO- --no-check-certificate https://www.kernel.org | grep tar | head -n1 | cut -d" -f2)

Descompacte-o em /usr/src e torne-se root:

$ sudo tar xf linux-3.18.7.tar.xz -C /usr/src/
$ su -

Entre no diretório de trabalho:

# cd /usr/src/linux-3.18.7

Execute um dos comandos abaixo:

# cp -av /boot/config-3[tecle TAB para autocompletar] /usr/src/linux-3.18.7/.config

ou:

# make oldconfig             ### use esta!!!

ou ainda:

# make localmodconfig ### usei esta! que carrega apenas os módulos específicos para a máquina corrente, e é uma compilação rápida.

kernel-001

kernel-002

E se desejar alterar alguma coisa (habilitar|desabilitar), como no exemplo abaixo, onde eu acrescentei um patch que dá suporte ao sistema de arquivos reiserfs4:

# gzip -dc ../reiser4-for-3.18.6.patch.gz | patch -p1
# make menuconfig

kernel-003

Daí habilito o suporte ao sistema de arquivos na aba filesystems e salvo a nova config.

kernel-004

kernel-005

Prossiga então com a criação da imagem do kernel com:

# make -j2 bzImage

kernel-006

* onde se vê -j2, usa-se o nº de cores do processador+1, logo, um amd64 singlecore = -j2

E a seguir prosseguimos com a compilação e instalação dos módulos:

# make -j2 modules
# make -j2 modules_install

kernel-007

kernel-008

Kernel instalado, passemos para criação da initrd (RAMDISK) com:

# mkinitramfs -o /boot/initrd.img-3.18.7 /lib/modules/3.18.7

Seguida da cópia da imagem do kernel para /boot:

# cp -av arch/x86/boot/bzImage /boot/vmlinuz-3.18.7

Daí, veja se o Grub reconhecerá o novo kernel com (provavelmente vai):

# update-grub

kernel-009

kernel-010

* por via das dúvidas, antes de rodar o comando acima, certifique-se que o pacote os-prober esteja instalado.

Se não reconhecer, você pode copiar a configuração do kernel atual presente em /boot/grub/grub.cfg e acrescentá-la ao final do arquivo /etc/grub.d/40_custom, algo como isto:

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
menuentry 'Debian GNU/Linux, with Linux 3.18.7' --class debian --class gnu-linux --class gnu --class os {
	load_video
	set gfxpayload=keep
	insmod gzio
	insmod part_msdos
	insmod ext2
	set root='(hd1,msdos3)'
	search --no-floppy --fs-uuid --set=root 52d9b106-3ee5-4bcb-b433-ee597926272a
	echo	'Loading Linux 3.18.7 ...'
	linux	/boot/vmlinuz-3.18.7 root=UUID=52d9b106-3ee5-4bcb-b433-ee597926272a ro quiet
	echo	'Loading initial ramdisk ...'
	initrd	/boot/initrd.img-3.18.7
}
menuentry 'Debian GNU/Linux, with Linux 3.18.7 (recovery mode)' --class debian --class gnu-linux --class gnu --class os {
	load_video
	set gfxpayload=keep
	insmod gzio
	insmod part_msdos
	insmod ext2
	set root='(hd1,msdos3)'
	search --no-floppy --fs-uuid --set=root 52d9b106-3ee5-4bcb-b433-ee597926272a
	echo	'Loading Linux 3.18.7 ...'
	linux	/boot/vmlinuz-3.18.7 root=UUID=52d9b106-3ee5-4bcb-b433-ee597926272a ro single 
	echo	'Loading initial ramdisk ...'
	initrd	/boot/initrd.img-3.18.7
}

* no modelo acima (que já está pronto pro meu caso) devem ser modificados a versão do kernel e a UUID da partição.

Após salvar o arquivo, execute novamente:

# update-grub

Mas se ainda assim não reconhecer (vc tá com uma zaca das brabas!), então, só lhe resta copiar a configuração do kernel atual presente em /boot/grub/grub.cfg e adicioná-la neste mesmo arquivo antes da linha ### END /etc/grub.d/40_custom ### e NÃO EXECUTE update-grub, pois se o fizer estas alterações serão perdidas.

E por fim reinicie o sistema:

# reboot

Drivers

Se usas drivers da Nvidia e o VirtualBox, de nada adiantará tentar criar os módulos para o novo kernel usando um outro, inicie o mesmo na opção recovery-mode do Grub, insira a senha do root e prossiga assim pro caso da Nvidia:

# dpkg-reconfigure nvidia-kernel-dkms

* ou remova e reinstale como eu fiz aqui:

# apt-get --purge remove nvidia*
# apt-get install nvidia-driver nvidia-settings nvidia-xconfig  ### caso das placas mais atuais

E pro caso do VirtualBox (realizado já dentro do ambiente gráfico, ou seja, após o passo anterior), dependendo de qual versão você usa, se a disponível nos repos Debian ou os da Oracle:

# dpkg-reconfigure virtualbox-dkms
ou
# /etc/init.d/vboxdrv setup

Este slideshow necessita de JavaScript.

Observação

Provavelmente o kernel 3.19 irá funcionar compilando deste modo ou via kernel-package, inclusive, eu já o tinha compilado mas devido a esse erro em não criar os módulos da Nvidia no ambiente gráfico usando o kernel atual, pensei que fosse algum bug e o removi, talvez se tivesse seguido os passos que propus acima (o de reiniciar pelo recovery-mode) tivesse funcionado.

Usuários de outras distros poderão seguir este how-to até a parte de instalação dos módulos, a partir da podem seguir o how-to abaixo, principalmente se usarem o LILO como bootloader:

KERNEL 3.8.4 NO SLACKWARE CURRENT

IntÉ!

Compilação tradicional do kernel estável 3.18.7 no Debian

12 comentários sobre “Compilação tradicional do kernel estável 3.18.7 no Debian

  1. não sei se faço certo, mais sempre usei esse método.

    sudo apt-get install gcc libncurses5-dev dpkg-dev
    make menuconfig
    make -j (numero de nucleos + 1) KDEB_PKGVERSION=1.minhaversao deb-pkg
    sudo dpkg -i *.deb

    mais é sempre bom aprender um novo método, assim que tiver um pouco mais de coragem, vou tentar fazer isso, mais meu debian tá tao bonito e funcional, que acho que vou esperar a versão 8…

    grande abraço.

    Curtir

    1. edps disse:

      Desse jeito eu nunca usei:


      # make -j (numero de nucleos + 1) KDEB_PKGVERSION=1.minhaversao deb-pkg

      Geralmente faço uso do kernel-package:


      # INSTALL_MOD_STRIP=1 CONCURRENCY_LEVEL=5 fakeroot make-kpkg --initrd --append-to-version=-edps --revision=+1.0 kernel_image kernel_headers

      Como visto nesses meu antigo artigo:

      http://www.vivaolinux.com.br/dica/Debian-Squeeze-com-kernel-304/

      * onde CONCURRENCY_LEVEL=5 é a mesma coisa das jobs do comando make (nº de cores do processador + 1), na época usava um QuadCore, que já foi pro saco a muito tempo! rs

      Curtir

  2. Guilherme Xavier disse:

    Boa tarde Edps, Excelente artigo e melhoras para seu nobre pc.
    Estou seguindo seus passos, porém possuo uma placa ATI 6870, gostaria de saber se a parte que cabe aos drivers da placa deve ser seguida removendo assim os drivers da ati instaldos?

    Curtir

    1. edps disse:

      É difícil falar sobre coisas que não nos afetam, no caso, não tenho placas da ATI, então, na pior das hipóteses o ambiente gráfico não iniciará, daí vc dá um Ctrl+Alt+F1 loga-se como root e tenta resolver, se usa driver dos repos Debian:


      # fglrx-modules-dkms

      Ou tenta reinstalar:


      # apt-get install --reinstall fglrx-driver fglrx-modules-dkms fglrx-atieventsd fglrx-control glx-alternative-fglrx libfglrx libfglrx-amdxvba1 libgl1-fglrx-glx

      Ou remove e reinstala:


      # apt-get --purge remove fglrx*
      # apt-get install fglrx-driver fglrx-modules-dkms fglrx-atieventsd fglrx-control glx-alternative-fglrx libfglrx libfglrx-amdxvba1 libgl1-fglrx-glx

      Isso é apenas uma suposição de uns testes que fiz aqui, o fglrx-driver é o pacote para as placas mais novas da ATI, tem também o fglrx-legacy-driver

      Ou siga o meio que conheça.

      Pro meu caso, mesmo que o driver Nvidia tivesse dado piti no começo, bastaria remover todos os traços dos pacotes Nvidia e reiniciar com o Nouveau.

      Boa sorte!

      Curtir

  3. Marcos Butch disse:

    Este é o melhor artigo sobre compilação que já li. Sinceramente muito bom. Como sou iniciante gostaria caso possível que me explicasse algumas coisas.
    Em uma compilação preciso criar a imagem do kernel bzimage, o initrd.img que seria uma compilação dos módulos necessários para boot e tb compilar e instalar os módulos seriam estes os passos básicos?

    Não é necessário criar o arquivo System.map tb?

    Qual a diferença deste método em relação ao método que gera o .deb?

    Agradeço por compartilhar.

    Curtir

  4. edps disse:

    Agradeço aqui o comentário do Jonas Galo, pois ao executar o make headers_install e os comandos subsequentes, o tamanho da initrd foi reduzido drasticamente devido a cópia dos arquivos para /usr/include.

    E também agradeço ao colega Marcos Butch pelo seu comentário que junto ao do Jonas Galo deixaram este artigo bem mais completo, resta agora atualizá-lo.

    []’s

    Curtir

Deixe um comentário