10.3. Linux-6.4.12

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

Tempo aproximado de construção: 1,5 - 130,0 UPC (tipicamente cerca de 12 UPC)
Espaço em disco exigido: 1200 - 8800 MB (tipicamente cerca de 1700 MB)

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 suas 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ê possa 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 controlada por menu, 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 do locale 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, [então] assegure-se de substituir <host_LANG_value> pelo valor da variável $LANG oriunda do seu 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]
  [ ] 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]

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]
  Graphics support --->
    Frame buffer Devices --->
      <*> Support for frame buffer devices --->                             [FB]
    Console display driver support --->
      [*] Framebuffer Console support                      [FRAMEBUFFER_CONSOLE]

Habilite alguns recursos adicionais se você estiver construindo um sistema de 64 bits. Se você estiver usando o menuconfig, [então] 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]

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 seu hardware do anfitrião estiver usando UEFI e você desejar inicializar o sistema LFS com ela, [então] 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 da distribuição anfitriã.

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

Torne aleatório o endereço da imagem do núcleo (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.

Compila o núcleo com avisos como erros

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.

Habilita cabeçalhos do núcleo por meio de /sys/kernel/kheaders.tar.xz

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

Configurar recursos padrão do núcleo (usuários(as) experientes)

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

Protetor Forte da Pilha

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.

Suporte a auxiliar do uevent

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

Mantém um 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.

Automonta devtmpfs em /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.

Suporte a Console do Framebuffer

Isso é necessário para exibir o console do Linux em um dispositivo de buffer de quadros. Para permitir que o núcleo imprima mensagens de depuração em um estágio inicial de inicialização, não deveria ser construído como um módulo do núcleo, a menos que um initramfs seja usado. E, se CONFIG_DRM (Direct Rendering Manager) estiver habilitado, [então] é provável que CONFIG_DRM_FBDEV_EMULATION (Habilita suporte legado a fbdev para o seu controlador de configuração de modo) devesse estar habilitado também.

Suporte a x2apic

Support running the interrupt controller of 64-bit x86 processors in x2APIC mode. x2APIC may be enabled by firmware on 64-bit x86 systems, and a kernel without this option enabled will panic on boot if x2APIC is enabled by firmware. This option has has no effect, but also does no harm if x2APIC is disabled by the firmware.

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

Se desejado, [então] pule a configuração do núcleo copiando o arquivo config do núcleo, .config, a partir do sistema anfitrião (assumindo que ele esteja disponível) para o diretório linux-6.4.12 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, [então] 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.4.12/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ã), [então] 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 dentro do 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.4.12-lfs-12.0

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.4.12

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.4.12

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

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

É 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.4.12 para assegurar que todos os arquivos sejam de propriedade do(a) usuário(a) root.

[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.

[Atenção]

Atenção

Os cabeçalhos no diretório include do sistema (/usr/include) deveriam sempre ser aqueles contra os quais a Glibc foi compilada, isto é, os cabeçalhos sanitizados instalados na Seção 5.4, “Cabeçalhos da API do Linux-6.4.12”. Portanto, eles nunca deveriam ser substituídos nem pelos cabeçalhos crus do núcleo nem por quaisquer outros cabeçalhos sanitizados do núcleo.

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"
# Início 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

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

10.3.3. Conteúdo do Linux

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

Descrições Curtas

config-6.4.12

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

vmlinuz-6.4.12-lfs-12.0

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.4.12

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