Quando você precisará compilar seu próprio kernel

Quando você precisará compilar seu próprio kernel

Então, você decidiu experimentar essa coisa que ouviu outros falarem, chamado de 'Compilar um kernel personalizado'. Se você está tentando isso como um hobby, ou porque deseja aprender uma nova habilidade, muito bem - leia sobre.

No entanto, antes de começarmos, tentaremos explicar as situações em que surgir isso e como lidar com isso. Observe que este é um assunto extenso que precisa muito mais em termos de espaço do que forneceremos aqui. Você aprenderá o básico, o que você precisa, o que fazer e o que você alcançará.

Para mais informações, como sempre, o Google é seu amigo; Além disso, a documentação residente na árvore de origem do kernel responderá muitas perguntas. Então, vamos começar com o começo, com uma última nota: se necessário, publicaremos mais artigos relacionados à compilação de kernel pertencentes a outras distros.

Quando você precisará compilar seu próprio kernel

A primeira situação seria quando você precisar de um kernel mais novo do que sua distro, especialmente quando você executa uma distribuição estável (e.g. Debian estável, Centos), porque seu kernel não suporta algum recurso/driver que você precisa, ou simplesmente porque você sente que quer experimentar os melhores e mais recentes.

Um aviso, no entanto: Se você quiser executar um kernel de ponta, verifique se ele será compatível com outros componentes-chave do seu sistema (como o GLIBC), lembre-se de que mais recente significa menos testes e (provavelmente) mais instabilidade; Os mantenedores de kernel da sua distribuição geralmente fazem um bom trabalho backport alguns novos recursos para kernels mais velhos e mais estáveis, por isso, certifique-se de realmente precisar sangrar a borda. Nosso conselho é não usar esses kernels (os grãos de longo prazo fariam uma exceção aqui) nos sistemas de produção. Como dito, confie em mantenedores de sua distro.

A segunda situação é que você sente que está executando um kernel inchado, com muitos componentes desnecessários. Enquanto o kernel carrega apenas módulos que combinam com uma peça de hardware existente, uma pegada de memória menor do kernel geralmente ajuda a acelerar e inicializar o tempo.

# lspci -vv # lsusb # hwinfo # cat /proc /cpuinfo 

Comandos acima ajudam você a conhecer melhor seu hardware. Anote o que você encontrou e certifique -se de executar os comandos LS* acima como root, para obter informações extras.

Outra situação seria que você deseja ajudar no teste do kernel executando as últimas novidades em seu sistema. Os mesmos avisos que acima se aplicam: faça isso nos sistemas de teste, mantenha contato com a montante, caso você encontre um bug (lkml.Org é a principal lista de discussão do kernel - tráfego alto) e tenta ser o mais útil possível quando solicitado informações.Isso não pode ser enfatizado o suficiente: leia a documentação, porque você se encontra em uma situação desagradável, deseja relatar um bug ou simplesmente ter perguntas.

Em seguida, você pode querer ser o garoto legal do quarteirão e executar o melhor e o melhor, talvez olhando para a fonte (desde que você goste disso e tenha algum conhecimento C e ASM) e até envie patches. Você pode procurar primeiro se sua distribuição ainda não oferecer um pacote de kernel mais recente, por exemplo, você pode instalar kernels do Debian Experimental em um sistema de teste, se você alterar suas fontes.Liste de acordo. Mais uma vez, trabalhe com os mantenedores se você tropeçar em um bug.

Terminologia

Antes de nos aprofundarmos nesse assunto um tanto misterioso, devemos deixar alguns termos básicos claros (er); Isso é essencial para entender as partes importantes do teste e compilação do kernel.

  • núcleo - O núcleo do sistema operacional, responsável pelo gerenciamento de recursos de hardware (E/S, rede, CPU, memória…). Basicamente, é a parte essencial do sistema operacional responsável por todo o trabalho sujo. Os programas de usuários se comunicam com o kernel, solicitando tempo da CPU ou outros recursos por bibliotecas de sistemas que atuam como intermediários entre o usuário (veja abaixo) e o kernel / hardware. Os kernels podem ser monolíticos e microokernels (para obter mais informações, se você estiver interessado, consulte as abordagens de design em todo o kernel na Wikipedia.org . Os microkernels (como o Minix) usam um esquema de design que divide o núcleo do resto do kernel, e esse descanso é dividido em componentes, cada um fazendo algo específico: E/S, redes, etc. Os grãos monolíticos (Linux, BSD, Solaris), como o nome sugere, compreendem a maior parte do kernel em uma unidade, com funcionalidade extra (e.g. drivers) fornecidos por módulos. Há também kernels híbridos, uma combinação entre os dois, um bom exemplo sendo o kernel do Windows.
  • Userland - Tudo em um sistema operacional que não faz parte do kernel (bibliotecas, aplicativos) é considerado parte da terra do usuário. O nome é tão óbvio.
  • módulo - Como mostrado anteriormente, um módulo de kernel é um software binário que basicamente "ensina" o kernel como "falar" com um pedaço de hardware ou fornecer alguma funcionalidade (e.g. NFS)
  • compilador - O compilador é um aplicativo que basicamente pega o código escrito, como baixado por você do kernel.org e transforma em binários. O compilador encontrado nas distribuições Linux é chamado de 'GCC', e isso significa GNU Compiler Collection, que também precisa de componentes essenciais para a construção de software: utilitários encontrados em binutils como o assembler (AS) ou o arquiver de biblioteca (AR) .Nos sistemas Debian, ou Ubuntu, pode-se encontrar a qual pacote um arquivo pertence ao instalar e executar. Falando nisso, vamos ver quais pacotes precisamos instalar para uma construção de kernel de sucesso.
  • kernel de baunilha - Este é o nome usado para o kernel a montante, como encontrado no kernel.org, então sem patches específicos para distro.

Observe que sempre que você vir um comando neste documento começando com o prompt '$' Isso significa que o comando terá que ser executado como usuário normal e cotidiano; sempre que você vê o '#' Prompt, isso significa que o comando deve ser executado como root (usamos sudo, mas isso não é obrigatório). O diretório atual, a menos que especificado de outra forma, é aquele que segura sua árvore de origem, neste caso, Linux-2.6.

O que você precisa instalar

  • GCC - Claro, o compilador é essencial
  • BINUTILS - Este pacote contém o vinculador, o assembler e outros utilitários vitais para compilar programas escritos em c.
  • GCC -Doc - as páginas manual e de informação para GCC. Útil se você quiser se sujar e modificar algumas bandeiras de compilação. Útil de qualquer maneira se você quiser escrever ou compilar pacotes C.
  • GDB - O depurador GNU. Não é obrigatório, mas útil se algo der errado. GDB-Doc também ajudará.
  • biblibreadline5-dev-Para usar a interface baseada na configuração do kernel. Você pode usar outras interfaces (veja abaixo).
  • make - será instalado como dependência, mas poucas palavras estão em ordem. Consulte o manual ou os livros, porque este não é um sujeito a ser explicado levemente em um espaço tão curto. Make é uma utilidade usada ao compilar os programas C/C ++, e o que faz é olhar em um makefile, contendo regras sobre como e em que ordem a construção deve acontecer, e tenta executar essas diretivas. Leia os makefiles na árvore de origem para ter um vislumbre.
  • Git-Git é um VCS (Sistema de Controle de Versão), fazendo o que CVS ou Subversion faz, a saber, mantendo você atualizado com a última árvore do kernel.

Obtendo a fonte do kernel

Se você deseja instalar a fonte da sua distribuição, use

# APT-Get Install Linux-Source-

Onde pode ser reunido da emissão:

uname -r 

Use isso se desejar modificar seu kernel existente (adicionando motoristas, aparar, etc. ). Caso contrário, você quer o kernel de baunilha. Você pode obtê -lo de www.núcleo.org (sugerimos wget ou cacho aqui como gerentes de download) ou, se você quiser o mais recente, você usará o git. Recomendamos armazenar a fonte no diretório doméstico do seu usuário, e o comando para obter a mais recente árvore principal é (veja Man Git):

$ git clone git: // git.núcleo.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.Git Linux-2.6 

No passado, encontramos o mini-howto em http: // linux.yyz.EUA/Git-Howto.html para ser útil; Confira também Kernelnewbies.org . O comando acima criará uma pasta no seu diretório atual chamado Linux-2.6, que pode ser atualizado posteriormente, cd'ing nele e emitindo um simples

tornar limpo; Git Pull 

Agora, depois de você ter a fonte, teremos que configurar o kernel .

Configuração e construção

Se você tem um existente .arquivo de configuração (o arquivo que contém as opções para o edifício do kernel - o que entra e o que não faz), copie -o no Linux -2.6 (de /bota /config- ou /proc /config.gz - a configuração atual). Se você não deseja modificar o existente .Config, apenas emitir

$ Make OldConfig 

Caso contrário, continue lendo. Se você deseja modificar a configuração existente, o problema

$ Faça Menuconfig 

(Recomendação: você pode usar o FATE CONFIG para obter muitas perguntas sobre opções no kernel ou fazer Xconfig, que requer bibliotecas QT, para um menu mais agradável e gráfico) e selecione “Carregar um arquivo de configuração alternativo” e pressione Enter para .Config, o nome padrão do arquivo de configuração ou digite um nome de arquivo alternativo já salvo no Linux-2.6.

Depois disso, comece a passar pelos menus para fazer as alterações necessárias que a regra de dedão aqui é "se você não sabe o que faz, não mexa com isso", pelo menos até que você obtenha alguma experiência. No final, no menu superior, selecione “Salvar um arquivo de configuração alternativo”, pressione Enter para o nome padrão (.Config - recomendado) e depois "Sair" de baixo. Se você quiser começar do zero, esqueça a etapa “Carregar um arquivo de configuração alternativo” e continue. Na sua próxima compilação do kernel, depois de limpar e atualizar a árvore, use 'Make OldConfig' como acima para usar a configuração antiga. Ok, agora temos a configuração adaptada às nossas necessidades que apenas esperam para serem construídas. Construir um kernel é tão simples quanto configurá -lo (!). Basta digitar a marca e a saída deve ficar abaixo:

$ Make Hostcc Scripts/Basic/FixDep HOSTCC Scripts/Kconfig/Conf.o Scripts enviados/kconfig/zconf.aba.s scripts enviados/kconfig/zconf.Lex.s scripts enviados/kconfig/zconf.cerquilha.c scripts h -hostcc/kconfig/zconf.aba.o scripts hostld/kconfig/conf chk incluir/linux/versão.h up Incluir/linux/versão.h chk incluir/gerado/utsrelease.h up Incluir/gerado/utsrelease.h cc kernel/limites.s GEN Incluir/gerado/limites.h cc arch/x86/kernel/asm-offsets.s… 

e, depois de um tempo, dependendo da sua máquina e configuração do kernel, será feito. Se você deseja acelerar um pouco as coisas, use a bandeira -jn para fazer, onde n é o número de processadores/núcleos + 1. Tenha cuidado, no entanto, isso pode expor bugs no kernel ou construir infraestrutura, por isso. Se depois de ler o manual do GCC (e se você ainda for sã), você se sente aventureiro e deseja modificar algumas bandeiras específicas de hardware ou sentir vontade de otimizar o código, use a página manual Make para descobrir como (principalmente copts e cflags ). No entanto, otimizações maiores que -o2 são arriscadas.

Tenha cuidado e espere quebra, o kernel pode compilar sem problemas, mas pode agir estranho. Lembre -se de digitar todos os comandos como usuário normal. Não há necessidade de construir como raiz e os desenvolvedores do kernel desaprovaram a ideia.

Instalação

Agora vamos instalar os módulos: isso precisa ser feito como root, pois os módulos são instalados em /lib, e o usuário normal não tem acesso de gravação lá. Então,

# faça módulos_install 

Faz exatamente isso, e isso precisa ser feito antes de instalar o kernel para que os módulos e o kernel instalado estejam sincronizados. Usar

# faça instalar 

Para instalar o kernel para /inicializar, então

# depmod 

e prepare -se para a criação de um initramfs (sistema inicial de arquivos RAM), que é um sistema de arquivos temporário carregado na RAM nos estágios iniciais de inicialização, e é usado para fornecer drivers básicos e outras instalações para que o sistema de arquivos raiz seja montado. Mais informações podem ser encontradas na página initrd da Wikipedia. O comando necessário para a tarefa é a atualização -initramfs (isso é chamado também sempre que um novo kernel é instalado, acionado pelo gerenciador de pacotes) que pode criar um initramfs (-c) ou atualizar um existente (-u) . O comando completo é

# update -initramfs -c -k 

A versão é a que você verá após o acabamento 'Make Modules_install' (a última linha de sua saída será "depmod").Se você deseja ter o número exato e mais longo da versão, para que os desenvolvedores "momento git" usem, selecione "Configuração geral" → "Anexar automaticamente as informações da versão. Saída no meu sistema Ubuntu parece assim:

Update-Initramfs: Gerando /Boot /Initrd.IMG-3.1.0-RC3+… 

Atualize seu grub para que ele perceba seu novo kernel com

# update-grub 

Na minha máquina de teste debian, a saída se parece com a seguinte:

Gerando grub.CFG… Encontrado Imagem de fundo:/usr/share/imagens/desktop-base/desktop-grub.png encontrado linux imagem: /boot /vmllUz-3.0.0-1-AMD64 Encontrado Initrd Imagem: /Boot /initrd.IMG-3.0.0-1-AMD64 Encontrado Linux Imagem: /boot /vmlluz-3.0.0-RC6-AMD64 Encontrado Initrd Image: /Boot /initrd.IMG-3.0.0-RC6-AMD64 Encontrado Linux Imagem: /Boot /Vmlluz-2.6.39-07727-GBD1BFE4 Encontrado Initrd Imagem: /Boot /initrd.IMG-2.6.39-07727-GBD1BFE4 Encontrado Linux Imagem: /boot /vmlluz-2.6.39-2-AMD64 Encontrado Initrd Imagem: /Boot /Initrd.IMG-2.6.39-2-AMD64 Encontrado Linux Imagem: /Boot /VmlLUZ-2.6.39-RC7-AMD64 Encontrado Initrd Imagem: /Boot /initrd.IMG-2.6.A imagem.6.38.5 Encontrado Initrd Image: /boot /initrd.IMG-2.6.38.5 Encontrado Linux Image: /boot /vmllUz-2.6.38.4-00001-GFAA8EE7 Encontrado Initrd Imagem: /Boot /initrd.IMG-2.6.38.4-00001-GFAA8EE7 Encontrado Linux Imagem: /Boot /Vmlluz-2.6.38.4 Encontrado Initrd Image: /boot /initrd.IMG-2.6.38.4 Encontrado Linux Image: /boot /vmlluz-2.6.38-2-AMD64 Encontrado Initrd Imagem: /Boot /Initrd.IMG-2.6.38-2-AMD64 Encontrado Linux Imagem: /boot /vmlluz-2.6.32-5-AMD64 Encontrado Initrd Image: /Boot /initrd.IMG-2.6.32-5-AMD64 Encontrado memtest86+ imagem: /memtest86+.bin encontrado memtest86+ imagem multiboot: /memtest86+ _multiboot.Bin feito 

Obviamente, sua saída não parecerá exatamente a mesma, mas o contorno deve ser o mesmo; Por fim, lembre-se: se você quiser, editar/etc/padrão/grub para alterar algumas opções antes da atualização-grub e, com os dedos cruzados, reinicie sua máquina para testar o novo kernel.

Se algo der errado

As situações mais comuns em que seu novo kernel é inutilizável é que você não pode inicializá -lo em primeiro lugar, ou que ele inicializa e não tem algum driver essencial (por exemplo, drivers de rede). Normalmente, o Update-Grub faz um bom trabalho ao escrever o arquivo de menu Grub, mas você pode querer conferir de qualquer maneira. Se você passa pelo grub, é provável que você tenha um driver essencial demais para o sistema, como as peças relacionadas ao disco (ATA, SATA, SCSI…) ou talvez NFS, se você tiver uma raiz montada em NFS. Inicialize um kernel de trabalho e reconfigure -o, usando o Google e possíveis outras fontes, como o IRC .

Provavelmente, alguém já tropeçou no seu problema no passado e você tem chances de encontrar uma resposta. Se o problema for mais sério e você está confiante de ler sobre netiqueta e como postar na lista de discussão do kernel, pergunte bem. Há muitas pessoas agradáveis ​​e prestativas por aí, mas elas tendem a não ser tão interessantes quando você não fez sua lição de casa e/ou perdendo o tempo deles. Se você tiver uma inicialização /inicialização, lembre -se de que geralmente não é muito grande e pode se encher com núcleos rapidamente. Além. Lembre -se de que o kernel é um software complexo e muitas causas podem estar na raiz de seus problemas. Se você não teve problemas para seguir este guia, você está pronto para uma configuração mais avançada do kernel Linux.

Tutoriais do Linux relacionados:

  • Coisas para instalar no Ubuntu 20.04
  • Coisas para fazer depois de instalar o Ubuntu 20.04 fossa focal linux
  • Uma introdução à automação, ferramentas e técnicas do Linux
  • Ubuntu 20.04 Guia
  • Como remover kernels antigos no Ubuntu
  • Coisas para fazer depois de instalar o Ubuntu 22.04 Jellyfish…
  • Mint 20: Melhor que o Ubuntu e o Microsoft Windows?
  • Sistema Linux Hung? Como escapar para a linha de comando e…
  • Coisas para instalar no Ubuntu 22.04
  • Instale Arch Linux na estação de trabalho VMware