10.3. Linux-6.1.11

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

Tempo aproximado de construção: 1.5 - 130.0 SBU (tipicamente cerca de 12 SBU)
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.

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.

Para informação geral a respeito de configuração do núcleo, veja-se https://www.linuxfromscratch.org/hints/downloads/files/kernel-configuration.txt. O BLFS tem alguma informação relativa a exigências específicas de configuração do núcleo de pacotes fora do LFS em https://www.linuxfromscratch.org/blfs/view/11.3/longindex.html#kernel-config-index. Informação adicional acerca de configurar e construir o núcleo pode ser encontrada em http://www.kroah.com/lkn/

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

Processor type and features --->
   [*] Build a relocatable kernel [CONFIG_RELOCATABLE]
   [*]   Randomize the address of the kernel image (KASLR) [CONFIG_RANDOMIZE_BASE]
General setup --->
   [ ] Compile the kernel with warnings as errors [CONFIG_WERROR]
   < > Enable kernel headers through /sys/kernel/kheaders.tar.xz [CONFIG_IKHEADERS]
General architecture-dependent options  --->
   [*] Stack Protector buffer overflow detection [CONFIG_STACKPROTECTOR]
   [*]   Strong Stack Protector [CONFIG_STACKPROTECTOR_STRONG]
Device Drivers  --->
  Graphics support --->
   Frame buffer Devices --->
      <*> Support for frame buffer devices --->
   Console display driver support --->
      [*] Framebuffer Console support [CONFIG_FRAMEBUFFER_CONSOLE]
  Generic Driver Options  --->
   [ ] Support for uevent helper [CONFIG_UEVENT_HELPER]
   [*] Maintain a devtmpfs filesystem to mount at /dev [CONFIG_DEVTMPFS]
   [*]   Automount devtmpfs at /dev, after the kernel mounted the rootfs [CONFIG_DEVTMPFS_MOUNT]

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 [CONFIG_X86_X2APIC]
Device Drivers --->
  [*] PCI Support ---> [CONFIG_PCI]
    [*] Message Signaled Interrupts (MSI and MSI-X) [CONFIG_PCI_MSI]
  [*] IOMMU Hardware Support ---> [CONFIG_IOMMU_SUPPORT]
    [*] Support for Interrupt Remapping [CONFIG_IRQ_REMAP]

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 (https://www.linuxfromscratch.org/blfs/view/11.3/longindex.html#kernel-config-index).

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

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.

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/Eudev.

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/Eudev.

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

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, [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.1.11 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.1.11/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.1.11-lfs-11.3

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

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

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

install -d /usr/share/doc/linux-6.1.11
cp -r Documentation/* /usr/share/doc/linux-6.1.11

É 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.1.11 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.1.11”. 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.1.11, vmlinuz-6.1.11-lfs-11.3 e System.map-6.1.11
Diretórios instalados: /lib/modules e /usr/share/doc/linux-6.1.11

Descrições Curtas

config-6.1.11

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

vmlinuz-6.1.11-lfs-11.3

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

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