O que acontece em cada etapa do processo de criação do kernel do Linux?

27

Eu li muitos tutoriais sobre como criar kernels personalizados e inicializar o Ubuntu usando esses kernels, e segui com êxito os guias e os kernels personalizados de inicialização, mas não entendo o que cada comando dos guias faz e o que realmente está acontecendo. cada comando.

O procedimento descrito no site da Ubuntu faz um monte de trabalho com fakeroot, dpkg, make-kpkg, alguns initramfs, e outras coisas horríveis que obras, mas simplesmente não me ajudar a entender o que está acontecendo.

  • Qual é a saída de makeum diretório do kernel do linux?
  • Ele cria uma "imagem de kernel compactada"?
  • Qual é o nome do arquivo "imagem compactada do kernel" e onde ele é colocado?
  • O que make modulesfaz?
  • Deve make modulesser feito antes ou depois make?
  • Não makeconstrói meus módulos automaticamente?
  • Qual é o processo (em inglês, não apenas a lista de comandos) de adicionar kernels recém-criados à lista de kernels inicializáveis?
  • O que make installfaz?
  • Vou make installadicioná-lo à minha lista de kernels inicializáveis ​​para que eu não precise fazer mais nada?
  • Existe um equivalente make modules_install?
AnkurVj
fonte
Isso deve ser dividido em várias perguntas.
Ciro Santilli新疆改造中心法轮功六四事件

Respostas:

34

Do topo...

  • makecompila e vincula a imagem do kernel. Este é um único arquivo chamado vmlinuz.
  • make modulescompila arquivos individuais para cada pergunta que você respondeu Mdurante a configuração do kernel. O código do objeto está vinculado ao seu kernel recém-construído. (Para perguntas respondidas Y, elas já fazem parte vmlinuze, para perguntas respondidas N, são ignoradas).
  • make installinstala seu kernel construído no /vmlinuz.
  • make modules_installinstala seus módulos do kernel em /lib/modulesou /lib/modules/<version>.

Quanto a adicioná-lo à lista de kernels disponíveis, isso é tratado pelo gerenciador de inicialização. É diferente para cada carregador de inicialização, mas grubé o mais comum em x86 e amd64, então descreverei isso. Na verdade, é bastante simples. O Grub procura e /, por qualquer coisa que pareça, pode ser um kernel funcional e o adiciona. E sim, esta é uma descrição simplificada./boot/lib/modules

Esse "material horrível" extra na documentação do Ubuntu é um material extra para criar um debpacote. Quando você está fazendo isso por mais do que você, é muito melhor empacotá-lo. Você vai mudar a tempo.

A construção do kernel e dos módulos é mantida separada porque, para as pessoas que precisam (isto é, desenvolvedores do kernel), elas geralmente estão fazendo alterações em apenas um módulo. Eles podem aplicar suas alterações, reconstruir e instalar apenas os módulos. Isso economiza muito tempo quando deve ser feito 20 vezes por dia. Ele nunca será atualizado para ter um único make everythingcomando. Em vez disso, execute make && make modules && make install && make modules_install como a documentação diz . O processo de compilação favorece os desenvolvedores do kernel, não você. E é assim que deve ser.

Na realidade, quase não há razão para ninguém, exceto os desenvolvedores do kernel ou os distribuidores de distribuição, compilarem um kernel. Em quase qualquer circunstância, o recurso do kernel que você deseja já foi criado para você e está disponível em um dos kernels pré-empacotados. Existem exceções, mas são extremamente raras atualmente.

Não que eu esteja desencorajando você a criar seu próprio kernel, na verdade eu o encorajo a fazê-lo. Eu acho que construir seu kernel do zero é uma prática valiosa para aprender como tudo funciona lá embaixo. Em parte, porque talvez um dia você vai ser a exceção que precisa. Mas também ensina muito sobre o processo de kernel e inicialização em geral. Você será uma pessoa melhor por ter feito isso.

bahamat
fonte
11
Muito obrigado pela descrição legível para humanos do processo. Eu tenho algumas duvidas. Minha compilação do kernel produziu o vmlinux e não o vmlinuz. Eu acho que a diferença é compressão. Devo compactar a imagem manualmente? Há /vmlinuzum diretório na pasta raiz? quando eu fizer uma instalação make, esse diretório será criado e o novo kernel será colocado lá? Vai make modules_installsubstituir o meu módulos instalados atualmente? Suponhamos que eu coloco meu vmlinux no diretório / boot, que eu preciso para fazer outra coisa (como arquivos de configuração editar grub e fazer grub-update ou algo depois disso?)
AnkurVj
3
Você está certo, a diferença é compressão. O comando make bzimageé o que faz isso. /vmlinuzé um arquivo binário, não um diretório. Eu tenho feito apenas kernels empacotados nos últimos 5 anos, então não me lembro exatamente do comportamento de modules_installum kernel instalado diretamente. O Grub encontrará seu kernel /bootsem ajuda. Sim, você sempre deve executar grub-updateapós instalar um novo kernel.
bahamat
então eu deveria ter feito em make bzimagevez de make? Preciso fazer uma make cleane make bzimageoutra vez? Por /vmlinuzque você quer dizer o arquivo será criado no diretório raiz ou no diretório de fonte do kernel linux?
AnkurVj
11
Realmente não importa se o seu kernel está compactado ou não. Descomprimido, ocupa apenas um pouco mais de espaço em disco. Qualquer coisa com o prefixo /é um caminho absoluto, então sim, esse é um arquivo na raiz.
bahamat
11
Os módulos @GuyAvraham respondidos Ysão compilados (ou seja, fazem parte do vmlinuz). Os módulos respondidos Msão compilados como módulos carregáveis. Módulos respondidos Nnão são compilados. make modules_installaplica-se apenas aos que responderam M.
bahamat 4/09/18