Como construir um kernel personalizado com o localmodconfig que suporta hardware de várias máquinas?

9

Ao configurar um servidor para executar uma única tarefa, como um appliance, pode surgir a necessidade de criar um kernel personalizado. Por exemplo, para economizar espaço em disco.

Ubuntu Core 13.10 amd64 root filesystem is a 38 MB download, where the "linux-image-generic" meta package including required dependencies will download 79 MB of archives, and the size of a kernel-image-x.y.z-generic package is still 14 MB.

Para construir um kernel que é retirado de módulos que seu hardware não irá usar, o comando make localmodconfig é a ferramenta certa para o trabalho. No entanto, sua máquina virtual que executa seu ambiente de criação e teste carrega módulos diferentes do hardware de implementação de destino. E / ou após algum tempo, seu hardware de implantação pode se tornar eol e um hardware diferente é usado. E na frequência em que as atualizações do kernel são lançadas, pode se tornar muito complicado construir um kernel personalizado para cada configuração de hardware diferente.

Como criar rapidamente um kernel Linux personalizado que seja executado em algumas caixas de hardware diferentes?

    
por Pro Backup 15.03.2014 / 23:32

1 resposta

11

O comando make localmodconfig ainda é a ferramenta certa para o trabalho. De fato, make localmodconfig runs scripts/kconfig/streamline_config.pl .

Entrada de arquivo

Ao ler o código-fonte streamline_config.pl (perl), há um recurso não documentado my $lsmod_file = $ENV{'LSMOD'}; que permite a entrada de arquivos para a detecção do módulo carregado em vez da saída do comando lsmod .

CD ao vivo

Porque o localmodconfig usa a saída lsmod para detectar os módulos carregados. Nós rodamos um Ubuntu Live CD em cada uma das diferentes configurações de hardware, abrimos um terminal ( Ctrl + Alt + T ), rodando lsmod e salve sua saída.

Concatenar saída

Ao concatenar os arquivos de saída lsmod ao remover linhas de cabeçalhos consecutivos, você pode criar rapidamente um arquivo de entrada que cubra todos os módulos do kernel necessários. Gostamos de revisar a lista de módulos manualmente e usar uma receita mais manual:

  1. $ cd linux-3.11.0/
    ou vá no diretório onde você irá executar o comando make

  2. $ lsmod > lsmod.txt
    cria um arquivo de texto com seus módulos carregados

  3. $ nano lsmod.txt
    vai abrir o editor de texto nano, é claro que você pode usar o seu aplicativo de editor favorito

  4. Anexe seus módulos desejados que ainda não estão lá, na parte inferior deste arquivo (veja um exemplo no final deste anwer), e salve-o quando estiver pronto.
    Nota: use espaços não guias para corresponder às posições do tabulador da coluna.

  5. $ make LSMOD="lsmod.txt" localmodconfig
    isto irá dizer ao localmodconfig para usar seu arquivo lsmod.txt como entrada para detecção de módulos carregados

Com relação a Steven Rostedt - autor de steamline_config.pl - por sugerir uma notação mais curta na etapa 5.

Exemplo do que acrescentar e não anexar ao lsmod.txt (etapa 4):

Como a placa principal Intel D33217CK possui sensores térmicos da Intel que gostaríamos de ler, anexamos estas linhas:

x86_pkg_temp_thermal   13810  0
intel_powerclamp       14239  0

Mas não queremos rodar máquinas virtuais neste hardware, é por isso que pulamos estas linhas:

kvm_intel             128218  0
kvm                   364766  1 kvm_intel

Ele tem um adaptador ethernet Gibabit da Apple (Broadcom) conectado à sua porta Thunderbolt, então nós acrescentamos:

tg3                   152066  0
ptp                    18156  1 tg3
pps_core               18546  1 ptp

Achamos que não precisamos de espelhamento de volume e, portanto, não adicione:

dm_mirror              21715  0
dm_region_hash         15984  1 dm_mirror
dm_log                 18072  2 dm_region_hash,dm_mirror

E também não precisamos de saída gráfica (o texto será feito em um servidor sem cabeçalho), por isso não incluímos:

i915                  589697  3
i2c_algo_bit           13197  1 i915
drm_kms_helper         46867  1 i915
drm                   242354  4 i915,drm_kms_helper

Para outra máquina, precisamos deste driver ethernet Realtek adicionalmente:

r8169                  61434  0
mii                    13654  1 r8169
    
por 15.03.2014 / 23:32