10.3. Linux-6.13.4

O pacote Linux contém o núcleo Linux.

Tempo aproximado de construção: 0,4 - 32 UPC (tipicamente cerca de 2,5 UPC)
Espaço em disco exigido: 1,7 - 14 GB (tipicamente cerca de 2,3 GB)

10.3.1. Instalação do Núcleo

Construir o núcleo envolve uns poucos passos—configuração; compilação; e instalação. Leia-se o arquivo README na árvore do fonte do núcleo para métodos alternativos à maneira que este livro configura o núcleo.

[Importante]

Importante

Construir o núcleo Linux pela primeira vez é uma das tarefas mais desafiadoras no LFS. Acertar depende do hardware específico para o sistema alvo e de tuas necessidades específicas. Existem quase 12.000 itens de configuração que estão disponíveis para o núcleo, embora somente cerca de um terço deles sejam necessários para a maioria dos computadores. Os(As) editores(as) do LFS recomendam que os(as) usuários(as) não familiarizados(as) com esse processo sigam os procedimentos abaixo bastante de perto. O objetivo é o de obter um sistema inicial em um ponto onde você consiga se logar na linha de comando quando reinicializar posteriormente na Seção 11.3, “Reinicializando o Sistema.” Nesse ponto, otimização e personalização não é um objetivo.

Para informação geral a respeito da configuração do núcleo, veja-se https://www.linuxfromscratch.org/hints/downloads/files/kernel-configuration.txt. Informação adicional acerca de configurar e construir o núcleo podem ser encontradas em https://anduin.linuxfromscratch.org/LFS/kernel-nutshell/. Essas referências estão um pouco desatualizadas, mas ainda fornecem uma visão geral razoável do processo.

Se tudo mais falhar, você consegue pedir ajuda na lista de discussão lfs-support. Observe que a assinatura é exigida para a finalidade de que a lista evite mensagens indesejadas.

Prepare para compilação executando o seguinte comando:

make mrproper

Isso garante que a árvore do núcleo esteja absolutamente limpa. A equipe do núcleo recomenda que esse comando seja emitido antes de cada compilação do núcleo. Não confie que a árvore do fonte esteja limpa depois de descompactar.

Existem várias maneiras para configurar as opções do núcleo. Usualmente, isso é feito por meio de uma interface orientada por menus, por exemplo:

make menuconfig

O significado das variáveis opcionais de ambiente do make:

LANG=<host_LANG_value> LC_ALL=

Isso estabelece a configuração da localidade para aquela usada no anfitrião. Isso possivelmente seja necessário para um adequado desenho de linha da interface ncurses do menuconfig em um console de texto UTF-8 do Linux.

Se usada, assegure-se de substituir <host_LANG_value> pelo valor da variável $LANG oriunda do teu anfitrião. Você pode, alternativamente, usar, em vez disso, o valor do anfitrião de $LC_ALL ou $LC_CTYPE.

make menuconfig

Isso lança uma interface ncurses controlada por menu. Para outras (gráficas) interfaces, digite make help.

[Nota]

Nota

Um bom lugar de partida para configurar a configuração do núcleo é executar make defconfig. Isso configurará a configuração base para um bom estado que leve a sua atual arquitetura de sistema em conta.

Assegure-se de habilitar/desabilitar/configurar os seguintes recursos ou o sistema poderia não funcionar corretamente ou inicializar de jeito nenhum:

General setup --->
  [ ] Compile the kernel with warnings as errors                        [WERROR]
  CPU/Task time and stats accounting --->
    [*] Pressure stall information tracking                                [PSI]
    [ ]   Require boot parameter to enable pressure stall information tracking
                                                     ...  [PSI_DEFAULT_DISABLED]
  < > Enable kernel headers through /sys/kernel/kheaders.tar.xz      [IKHEADERS]
  [*] Control Group support --->                                       [CGROUPS]
    [*]   Memory controller                                              [MEMCG]
    [ /*] CPU controller --->                                     [CGROUP_SCHED]
      # This may cause some systemd features malfunction:
      [ ] Group scheduling for SCHED_RR/FIFO                    [RT_GROUP_SCHED]
  [ ] Configure standard kernel features (expert users) --->            [EXPERT]

Processor type and features --->
  [*] Build a relocatable kernel                                   [RELOCATABLE]
  [*]   Randomize the address of the kernel image (KASLR)       [RANDOMIZE_BASE]

General architecture-dependent options --->
  [*] Stack Protector buffer overflow detection                 [STACKPROTECTOR]
  [*]   Strong Stack Protector                           [STACKPROTECTOR_STRONG]

[*] Networking support --->                                                [NET]
  Networking options --->
    [*] TCP/IP networking                                                 [INET]
    <*>   The IPv6 protocol --->                                          [IPV6]

Device Drivers --->
  Generic Driver Options --->
    [ ] Support for uevent helper                                [UEVENT_HELPER]
    [*] Maintain a devtmpfs filesystem to mount at /dev               [DEVTMPFS]
    [*]   Automount devtmpfs at /dev, after the kernel mounted the rootfs
                                                           ...  [DEVTMPFS_MOUNT]
    Firmware loader --->
      < /*> Firmware loading facility                                [FW_LOADER]
      [ ]     Enable the firmware sysfs fallback mechanism
                                                    ...  [FW_LOADER_USER_HELPER]
  Firmware Drivers --->
    [*] Export DMI identification via sysfs to userspace                 [DMIID]
    [*] Mark VGA/VBE/EFI FB as generic system framebuffer       [SYSFB_SIMPLEFB]
  Graphics support --->
    <*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->
                                                                      ...  [DRM]
      [*]    Display a user-friendly message when a kernel panic occurs
                                                                ...  [DRM_PANIC]
      (kmsg)   Panic screen formatter                         [DRM_PANIC_SCREEN]
      Supported DRM clients --->
        [*] Enable legacy fbdev support for your modesetting driver
                                                      ...  [DRM_FBDEV_EMULATION]
      <*>    Simple framebuffer driver                           [DRM_SIMPLEDRM]
    Console display driver support --->
      [*] Framebuffer Console support                      [FRAMEBUFFER_CONSOLE]

File systems --->
  [*] Inotify support for userspace                               [INOTIFY_USER]
  Pseudo filesystems --->
    [*] Tmpfs virtual memory file system support (former shm fs)         [TMPFS]
    [*]   Tmpfs POSIX Access Control Lists                     [TMPFS_POSIX_ACL]

Habilite alguns recursos adicionais se você estiver construindo um sistema de 64 bits. Se você estiver usando o menuconfig, habilite-as na ordem de CONFIG_PCI_MSI primeiro; então CONFIG_IRQ_REMAP; e finalmente CONFIG_X86_X2APIC, pois uma opção somente aparece depois que as dependências dela forem selecionadas.

Processor type and features --->
  [*] Support x2apic                                                [X86_X2APIC]

Device Drivers --->
  [*] PCI support --->                                                     [PCI]
    [*] Message Signaled Interrupts (MSI and MSI-X)                    [PCI_MSI]
  [*] IOMMU Hardware Support --->                                [IOMMU_SUPPORT]
    [*] Support for Interrupt Remapping                              [IRQ_REMAP]

Se você estiver construindo um sistema de 32 bits executando em um hardware com RAM mais que 4 GB, ajuste a configuração, de modo que o núcleo consiga usar até 64 GB de RAM física:

Processor type and features --->
  High Memory Support --->
    (X) 64GB                                                         [HIGHMEM64G]

Se a partição para o sistema LFS estiver em um SSD NVME (isto é, o nó do dispositivo para a partição for /dev/nvme*, em vez de /dev/sd*), habilite o suporte a NVME ou o sistema LFS não inicializaria:

Device Drivers --->
  NVME Support --->
    <*> NVM Express block device                                  [BLK_DEV_NVME]
[Nota]

Nota

Embora "The IPv6 Protocol" não seja estritamente exigida, ela é altamente recomendada pelos(as) desenvolvedores(as) do systemd.

Existem várias outras opções que possivelmente sejam desejadas, dependendo das exigências para o sistema. Para uma lista das opções necessárias para pacotes do BLFS, veja-se o Índice do BLFS das Configurações do Núcleo.

[Nota]

Nota

Se teu hardware do anfitrião estiver usando UEFI e você desejar inicializar o sistema LFS com ela, você deveria ajustar alguma configuração do núcleo seguindo a página do BLFS, mesmo se você usará o carregador de inicialização UEFI proveniente da distribuição anfitriã.

A justificativa para os itens de configuração acima:

Randomize the address of the kernel image (KASLR)

Habilita ASLR para imagem do núcleo, para mitigar alguns ataques baseados em endereços fixos de dados ou código sensíveis no núcleo.

Compile the kernel with warnings as errors

Isso possivelmente cause falha de construção se o compilador e (ou) a configuração forem diferentes daqueles dos(as) desenvolvedores(as) do núcleo.

Enable kernel headers through /sys/kernel/kheaders.tar.xz

Isso exigirá cpio ao se construir o núcleo. cpio não é instalado pelo LFS.

Configure standard kernel features (expert users)

Isso fará com que algumas opções apareçam na interface de configuração, mas mudar essas opções possivelmente seja perigoso. Não use isso, a menos que você saiba o que está fazendo.

Strong Stack Protector

Habilita SSP para o núcleo. Nós o habilitamos para o espaço inteiro de usuário(a) com --enable-default-ssp ao configurar o GCC, porém o núcleo não usa a configuração padrão do GCC para SSP. Nós o habilitamos explicitamente aqui.

Support for uevent helper

Ter essa opção configurada possivelmente interfira com o gerenciamento de dispositivo quando se usar o Udev.

Maintain a devtmpfs

Isso criará nós automatizados de dispositivos, os quais são povoados pelo núcleo, mesmo sem o Udev executando. O Udev então executa no topo disso, gerenciando permissões e adicionando links simbólicos. Esse item de configuração é exigido para todos(as) os(as) usuários(as) do Udev.

Automount devtmpfs at /dev

Isso montará a visão do núcleo dos dispositivos em /dev assim que alternar para o sistema de arquivos raiz pouco antes de iniciar o init.

Display a user-friendly message when a kernel panic occurs

Isso fará com que o núcleo exiba corretamente a mensagem caso ocorra um pânico de núcleo e um controlador DRM em execução suporte fazer isso. Sem isso, seria mais difícil diagnosticar um pânico: se nenhum controlador DRM estiver em execução, nós estaríamos no console VGA que só pode conter 24 linhas e a mensagem relevante do núcleo frequentemente é descartada; se um controlador DRM estiver em execução, a exibição geralmente fica completamente bagunçada no pânico. A partir do Linux-6.12, nenhum dos controladores dedicados para modelos de GPU convencionais realmente suporta isso, mas é suportado pelo Simple framebuffer driver que executa no framebuffer VESA (ou EFI) antes do controlador de GPU dedicado ser carregado. Se o controlador de GPU dedicado for construído como um módulo (em vez de parte da imagem do núcleo) e nenhum initramfs for usado, essa funcionalidade funcionará perfeitamente antes que o sistema de arquivos raiz seja montado e já será suficiente para fornecer informações acerca da maioria dos erros de configuração do LFS que causam um pânico (por exemplo, uma configuração root= incorreta em Seção 10.4, “Usando o GRUB para Configurar o Processo de Inicialização”).

Panic screen formatter

Configure esse kmsg para garantir que as últimas linhas de mensagens do núcleo sejam exibidas quando um pânico de núcleo acontecer. O padrão, user, faria o núcleo mostrar somente uma mensagem de pânico amigável para o(a) usuário(a), o que não é útil no diagnóstico. A terceira opção, qr_code, faria o núcleo comprimir as últimas linhas de mensagens do núcleo em um código QR e exibi-lo. O código QR pode conter mais linhas de mensagens que texto simples e pode ser decodificado com um dispositivo externo (como um telefone inteligente). Mas exige um compilador Rust que o LFS não fornece.

Mark VGA/VBE/EFI FB as generic system framebuffer e Simple framebuffer driver

Esses permitem usar o framebuffer VESA (ou o framebuffer EFI se inicializar o sistema LFS via UEFI) como um dispositivo DRM. O framebuffer VESA será configurado pelo GRUB (ou o framebuffer EFI será configurado pelo firmware UEFI), de forma que o manuseador de pânico DRM consegue funcionar antes que o controlador DRM específico da GPU seja carregado.

Enable legacy fbdev support for your modesetting driver e Framebuffer Console support

Esses são necessários para exibir o console Linux em uma GPU controlada por um controlador DRI (Direct Rendering Infrastructure). Como CONFIG_DRM (Direct Rendering Manager) está habilitada, nós deveríamos habilitar essas duas opções também ou veremos uma tela em branco quando o controlador DRI for carregado.

Support x2apic

Suporta executar o controlador de interrupção dos processadores x86 de 64 bits em modo x2APIC. O x2APIC possivelmente seja habilitado por firmware em sistemas x86 de 64 bits e um núcleo sem essa opção habilitada dará pânico na inicialização se o x2APIC for habilitado por firmware. Essa opção não tem efeito, porém também não danifica, se o x2APIC for desabilitado pelo firmware.

Alternativamente, make oldconfig possivelmente seja mais apropriado em algumas situações. Veja-se o arquivo README para mais informação.

Se desejado, pule a configuração do núcleo copiando o arquivo de configuração do núcleo, .config, a partir do sistema anfitrião (assumindo que ele esteja disponível) para o diretório linux-6.13.4 desempacotado. Entretanto, nós não recomendamos essa opção. Frequentemente é melhor explorar todos os menus de configuração e criar a configuração do núcleo a partir do zero.

Compile a imagem do núcleo e módulos:

make

Se usar módulos do núcleo, a configuração do módulo em /etc/modprobe.d possivelmente seja exigida. Informação pertinente à configuração de módulos e núcleo está localizada na Seção 9.3, “Visão Geral do Manuseio de Dispositivo e de Módulo” e na documentação do núcleo no diretório linux-6.13.4/Documentation. Também, modprobe.d(5) possivelmente seja de interesse.

A menos que o suporte a módulo tenha sido desabilitado na configuração do núcleo, instale os módulos com:

make modules_install

Depois que a compilação do núcleo estiver completa, passos adicionais são exigidos para completar a instalação. Alguns arquivos precisam ser copiados para o diretório /boot.

[Cuidado]

Cuidado

Se você tiver decidido usar uma partição /boot separada para o sistema LFS (talvez compartilhando uma partição /boot com a distribuição anfitriã), os arquivos copiados abaixo deveriam ir para lá. A maneira mais fácil de fazer isso é a de criar a entrada para /boot em /etc/fstab primeiro (leia-se a seção anterior para detalhes), então emitir o seguinte comando como o(a) usuário(a) root no ambiente chroot:

mount /boot

O caminho para o nó de dispositivo está omitido no comando, pois mount consegue lê-lo a partir de /etc/fstab.

O caminho para a imagem do núcleo possivelmente varie, dependendo da plataforma sendo usada. O nome de arquivo abaixo pode ser mudado para se adequar ao seu gosto, porém o tronco do nome de arquivo deveria ser vmlinuz para ser compatível com a configuração automática do processo de inicialização descrito na próxima seção. O seguinte comando assume uma arquitetura x86:

cp -iv arch/x86/boot/bzImage /boot/vmlinuz-6.13.4-lfs-12.3-systemd

System.map é um arquivo de símbolo para o núcleo. Ele mapeia os pontos de entrada de função de cada função na API do núcleo, bem como os endereços das estruturas de dados do núcleo para o núcleo em execução. Ele é usado como um recurso quando se investigar problemas do núcleo. Emita o seguinte comando para instalar o arquivo de mapa:

cp -iv System.map /boot/System.map-6.13.4

O arquivo de configuração do núcleo .config produzido pelo passo make menuconfig acima contém todas as seleções de configuração para o núcleo que foi recém compilado. É uma boa ideia manter esse arquivo para futura referência:

cp -iv .config /boot/config-6.13.4

Instale a documentação para o núcleo Linux:

cp -r Documentation -T /usr/share/doc/linux-6.13.4

É importante observar que os arquivos no diretório do fonte do núcleo não são de propriedade do(a) root. Sempre que um pacote é desempacotado como o(a) usuário(a) root (como nós fizemos dentro do chroot), os arquivos tem os IDs de usuário(a) e de grupo do que quer que fossem no computador do(a) empacotador(a). Isso geralmente não é um problema para qualquer outro pacote ser instalado, pois a árvore do fonte é removida depois da instalação. Entretanto, a árvore do fonte do Linux frequentemente é mantida por um longo tempo. Devido a isso, existe uma chance de que qualquer ID de usuário(a) que o(a) empacotador(a) usou seja atribuído para alguém na máquina. Essa pessoa então teria acesso de escrita ao fonte do núcleo.

[Nota]

Nota

Em muitos casos, a configuração do núcleo precisará ser atualizada para pacotes que serão instalados posteriormente no BLFS. Diferente de outros pacotes, não é necessário remover a árvore do fonte do núcleo depois que o recém construído núcleo for instalado.

Se a árvore do fonte do núcleo será mantida, [então] execute chown -R 0:0 no diretório linux-6.13.4 para assegurar que todos os arquivos sejam de propriedade do(a) usuário(a) root.

Se você estiver atualizando a configuração e reconstruindo o núcleo a partir de uma árvore retida de fonte do núcleo, normalmente você não deveria executar o comando make mrproper. O comando expurgaria o arquivo .config e todos os arquivos .o provenientes da construção anterior. Apesar de ser fácil restaurar .config a partir da cópia em /boot, expurgar todos os arquivos .o ainda é um desperdício: para uma simples mudança de configuração, geralmente somente uns poucos arquivos .o precisam ser (re)construídos e o sistema de construção do núcleo ignorará corretamente outros arquivos .o se eles não forem expurgados.

Por outro lado, se você tiver atualizado o GCC, você deveria executar make clean para expurgar todos os arquivos .o provenientes da construção anterior, ou a nova construção possivelmente falhe.

[Atenção]

Atenção

Alguma documentação do núcleo recomenda criar um link simbólico a partir de /usr/src/linux apontando para o diretório do fonte do núcleo. Isso é específico para núcleos anteriores à série 2.6 e precisa não ser criado em um sistema LFS, uma vez que ele pode causar problemas para pacotes que você possivelmente deseje construir tão logo seu sistema base LFS esteja completo.

10.3.2. Configurando a Ordem de Carregamento de Módulo do Linux

Na maior parte do tempo, os módulos do Linux são carregados automaticamente, porém algumas vezes precisa-se de alguma direção específica. O aplicativo que carrega os módulos, modprobe ou o insmod, usa /etc/modprobe.d/usb.conf para esse propósito. Esse arquivo precisa ser criado, de forma que, se os controladores do USB (ehci_hcd, ohci_hcd e uhci_hcd) tiverem sido construídos como módulos, [então] eles sejam carregados na ordem correta; ehci_hcd precisa ser carregado antes de ohci_hcd e uhci_hcd para a finalidade de evitar um aviso sendo produzido em tempo de inicialização.

Crie um novo arquivo /etc/modprobe.d/usb.conf executando o seguinte:

install -v -m755 -d /etc/modprobe.d
cat > /etc/modprobe.d/usb.conf << "EOF"
# Inicia do /etc/modprobe.d/usb.conf

install ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; true
install uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true

# Termina do /etc/modprobe.d/usb.conf
EOF

10.3.3. Conteúdo do Linux

Arquivos instalados: config-6.13.4, vmlinuz-6.13.4-lfs-12.3-systemd e System.map-6.13.4
Diretórios instalados: /lib/modules e /usr/share/doc/linux-6.13.4

Descrições Curtas

config-6.13.4

Contém todas as seleções de configuração para o núcleo

vmlinuz-6.13.4-lfs-12.3-systemd

O motor do sistema Linux. Quando se liga o computador, o núcleo é a primeira parte do sistema operacional que se torna carregada. Ele detecta e inicializa todos os componentes do hardware do computador, então torna esses componentes disponíveis como uma árvore de arquivos para o software e transforma uma CPU individual em uma máquina multitarefa capaz de executar dezenas de aplicativos aparentemente ao mesmo tempo

System.map-6.13.4

Uma lista de endereços e símbolos; ele mapeia os pontos de entrada e endereços de todas as funções e estruturas de dados no núcleo