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
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 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 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
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]
[ ] Auditing support [AUDIT]
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]
[*] 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]
Graphics support --->
< /*/M> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->
... [DRM]
# If [DRM] is selected as * or M, this must be selected:
[ /*] Enable legacy fbdev support for your modesetting driver
... [DRM_FBDEV_EMULATION]
Console display driver support --->
# If [DRM] is selected as * or M, this must be selected:
[ /*] 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,
[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]
Nota
Enquanto que "The IPv6 Protocol" não é estritamente exigido, 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
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.
-
Enable legacy
fbdev support for your modesetting driver
e
Framebuffer Console
support
-
Esses são necessários para exibir o console do Linux em uma
"GPU" controlada por um controlador "Direct Rendering
Infrastructure" ("DRI"). Se "CONFIG_DRM
" ("Direct Rendering Manager")
estiver habilitado, [então] você deveria habilitar essas duas
opções também ou verá uma tela em branco quando o controlador
"DRI" for carregado.
-
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.7.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, [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.7.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
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.7.4-lfs-12.1-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.7.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.7.4
Instale a documentação para o núcleo Linux:
cp -r Documentation -T /usr/share/doc/linux-6.7.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
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.7.4
para
assegurar que todos os arquivos sejam de propriedade do(a)
usuário(a) root.
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
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.7.4”. 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.