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