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 dispositivo, pode surgir a necessidade de criar um kernel personalizado. Por exemplo, para economizar espaço em disco.

O sistema de arquivos raiz Ubuntu Core 13.10 amd64 é um download de 38 MB , onde o meta-pacote "linux-image-generic" incluindo as dependências necessárias fará o download de 79 MB de arquivos, e o tamanho de um pacote kernel-image-xyz-generic ainda é de 14 MB .

Para construir um kernel que é retirado dos módulos que seu hardware não usará, o make localmodconfigcomando é a ferramenta certa para o trabalho. No entanto, sua máquina virtual que executa seu ambiente de construção e teste carrega módulos diferentes do hardware de implantação de destino. E / ou depois de um tempo, seu hardware de implantação pode se tornar um 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 criar um kernel personalizado para cada configuração de hardware diferente.

Como construir rapidamente um kernel Linux personalizado que roda em algumas caixas de hardware diferentes?

Pro Backup
fonte

Respostas:

11

O make localmodconfigcomando ainda é a ferramenta certa para o trabalho. De fato make localmodconfigfuncionascripts/kconfig/streamline_config.pl .

Entrada de arquivo

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

Live CD

Como o localmodconfig usa a saída lsmodpara detectar os módulos carregados. Executamos um Ubuntu Live CD em cada uma das diferentes configurações de hardware, abrimos um terminal ( Ctrl+ Alt+ T), executamos lsmode salvamos sua saída.

Concatenar saída

Concatenando os lsmodarquivos de saída e eliminando linhas de cabeçalhos consecutivos, você pode criar rapidamente um arquivo de entrada que cubra todos os módulos de 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 acesse o diretório em que você executará seu comando make

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

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

  4. Anexe os módulos desejados que ainda não estão lá, na parte inferior deste arquivo (veja, por exemplo, a parte inferior desta resposta) e salve-o quando estiver pronto.
    Nota: use espaços e não tabulações para corresponder às posições do tabulador de colunas.

  5. $ make LSMOD="lsmod.txt" localmodconfig
    isso informará o localmodconfig para usar seu arquivo lsmod.txt como entrada para a detecção de módulos carregados

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


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

Como a placa principal Intel D33217CK possui sensores térmicos 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

Possui um adaptador Ethernet Gibabit da Apple (Broadcom) conectado à sua porta Thunderbolt, portanto, anexamos:

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 adicionamos:

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 servirá em um servidor sem cabeçalho); portanto, 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
Pro Backup
fonte