Arch boot process (Português)

From ArchWiki
Status de tradução: Esse artigo é uma tradução de Arch boot process. Data da última tradução: 2020-06-18. Você pode ajudar a sincronizar a tradução, se houver alterações na versão em inglês.

Para inicializar o Arch Linux, um carregador gerenciador de boot compatível com Linux deve ser configurado. O gerenciador de boot é responsável por carregar o kernel e o ramdisk inicial antes de iniciar o processo de inicialização. O procedimento é bastante diferente para sistemas BIOS e UEFI, a descrição detalhada é fornecida nesta página ou em páginas vinculadas.

Tipos de firmware

BIOS

Uma BIOS (acrônimo para Basic Input-Output System) é o primeiro programa (firmware) que é executado assim que o sistema é ligado. Na maioria dos casos, é armazenado em uma memória flash na própria placa-mãe e é independente do armazenamento do sistema.

UEFI

Unified Extensible Firmware Interface tem suporte para ler a tabela de partições e os sistemas de arquivos. UEFI não inicia qualquer código de inicialização do Master Boot Record (MBR) independentemente de existir ou não - em vez disso, a inicialização depende de entradas de inicialização na NVRAM.

A especificação UEFI determina o suporte para os sistemas de arquivos FAT12, FAT16 e FAT32 (veja Especificação UEFI versão 2.8, seção 13.3.1.1), mas qualquer fornecedor em conformidade pode, opcionalmente, adicionar suporte para sistemas de arquivos adicionais; por exemplo, o Mac da Apple (e por padrão) oferece suporte a seus próprios drivers de sistema de arquivos HFS+. As implementações da UEFI também suportam ISO-9660 para discos ópticos.

O UEFI inicia aplicativos EFI, por exemplo gerenciadores de boot, Shell UEFI, etc. Esses aplicativos geralmente são armazenados como arquivos na partição de sistema EFI. Cada fornecedor pode armazenar seus arquivos na partição do sistema EFI sob a pasta /EFI/nome_fornecedor. Os aplicativos podem ser iniciados adicionando uma entrada de inicialização à NVRAM ou a partir do shell UEFI.

A especificação UEFI tem suporte para inicializar BIOS legado com sua Compatibility Support Module (CSM). Se o CSM estiver ativado no UEFI, o UEFI gerará entradas de inicialização do CSM para todas as unidades. Se uma entrada de inicialização do CSM for escolhida para ser inicializada, o CSM do UEFI tentará inicializar a partir do MBR da unidade.

Inicialização do sistema

Na BIOS

  1. Sistema ligado, o power-on self-test (POST) (autoteste de inicialização) é executado.
  2. Após o POST, a BIOS inicializa o hardware necessário para inicializar (disco, controladores de teclado etc.).
  3. A BIOS inicia os primeiros 440 bytes (a área de código de bootstrap do Master Boot Record) do primeiro disco na ordem de disco da BIOS.
  4. O primeiro estágio do gerenciador de boot no código de inicialização da MBR, então, inicia o código de seu segundo estágio (se houver) de:
  5. O atual gerenciador de boot é iniciado.
  6. O gerenciador de boot carrega um sistema operacional por encadeamento ou diretamente o kernel do sistema operacional.

No UEFI

  1. Sistema ligado, o power-on self-test (POST) (autoteste de inicialização) é executado.
  2. Após o POST, o UEFI inicializa o hardware necessário para carregar o sistema (disco, controladores de teclado etc.).
  3. O firmware lê as entradas de inicialização na NVRAM para determinar qual aplicativo EFI deve ser iniciado e de onde (por exemplo, de qual disco e partição).
    • Uma entrada de inicialização pode ser simplesmente um disco. Nesse caso, o firmware procura uma partição de sistema EFI nesse disco e tenta localizar o aplicativo EFI no caminho reserva de inicialização \EFI\BOOT\BOOTX64.EFI (BOOTIA32.EFI em sistemas com um IA32 (32 bits)). É assim que as mídias removíveis inicializáveis UEFI funcionam.
  4. O firmware inicia o aplicativo EFI.

Se Secure Boot estiver habilitado, o processo de inicialização vai verificar a autenticidade do binário EFI pela assinatura.

Nota: Alguns sistemas UEFI só podem inicializar a partir do caminho reserva de inicialização.

Multiboot no UEFI

Como cada sistema operacional ou fornecedor pode manter seus próprios arquivos dentro da partição de sistema EFI sem afetar o outro, a inicialização múltipla (multi-booting) usando UEFI é apenas uma questão de iniciar um aplicativo EFI diferente correspondente ao gerenciador de boot do sistema operacional específico. Isso elimina a necessidade de contar com mecanismos de carregamento em cadeia de um gerenciador de boot para carregar outro sistema operacional.

Veja também Dual boot com Windows.

Gerenciador de boot

Um gerenciador de boot é um peça de software iniciada pelo firmware (BIOS ou UEFI). Ele é responsável por carregar o kernel com os parâmetros do kernel desejados e o disco de RAM inicial com base nos arquivos de configuração. No caso do UEFI, o kernel em si pode ser lançado diretamente pelo UEFI usando o stub de inicialização EFI. Um gerenciador de boot separado ainda pode ser usado para editar os parâmetros do kernel antes de inicializar.

Atenção: Um gerenciador de boot deve poder acessar as imagens do kernel e do initramfs, caso contrário, o sistema não inicializará. Portanto, em uma configuração típica, ele deve suportar o acesso a /boot. Isso significa que ele deve ter suporte a tudo, desde os dispositivos de bloco, dispositivos de bloco empilhados (LVM, RAID, dm-crypt, LUKS etc.) e terminando com o sistema de arquivos no qual residem o(s) kernel(s) e as imagens initramfs.
Note: Carregar atualizações de microcódigo exige ajustes na configuração de gerenciador de boot. [1]

Comparação de recursos

Nota:
  • Como o GPT é parte da especificação UEFI, todos os gerenciadores de boot UEFI oferecem suporte a discos GPT. O GPT em sistemas BIOS é possível, usando hybrid booting com Hybrid MBR ("inicialização híbrida") ou o novo protocolo somente GPT. Porém, esse protocolo pode causar problemas com certas implementações de BIOS; veja rodsbooks para mais detalhes.
  • A criptografia mencionada no suporte a sistema de arquivos é uma criptografia a nível de sistema de arquivos, não influenciando criptografia a nível de bloco.
Nome Firmware Tabela de partição Multiboot Sistema de arquivos Notas
BIOS UEFI MBR GPT Btrfs ext4 ReiserFS VFAT XFS
EFISTUB Sim Sim Sim Herdado do firmware1 O kernel se tornou em um executável EFI para ser carregado diretamente do firmware UEFI ou de outro gerenciado de boot.
Clover Emula UEFI Sim Sim Sim Sim2 Não Sem criptografia Não Herdado do firmware1 Não Fork do rEFIt modificado para funcionar em macOS em hardware que não seja da Apple.
GRUB Sim Sim Sim Sim Sim Sim Sim Sim Sim Sim No BIOS/GPT, configuração requer uma partição de inicialização de BIOS.
Possui suporte a RAID, LUKS1 e LVM (mas não volumes de provisionamento fino).
rEFInd Não Sim Sim Sim Sim2 Sem: criptografia, compressão zstd Sem criptografia Sem recurso de tail-packing Herdado do firmware1 Não Possui suporte a autodetecção de kernels e parâmetros sem configuração explícita.
Syslinux Sim Parcial Sim Sim Parcial Sem: volumes de vários dispositivos, compressão, criptografia Sem criptografia Não Sim Somente MBR; sem nós-i esparsos Sem suporte a certos recursos de sistema de arquivos [2]
Não tem drivers de sistema de arquivos[3], podendo acessar apenas o sistema de arquivos para o qual foi instalado.
systemd-boot Não Sim Somente instalação manual Sim Sim1 Não Não Não Herdado do firmware1 Não Não é possível iniciar binários de outras partições além da ESP ou da Extended Boot Loader Partition (partição XBOOTLDR).
GRUB Legacy Sim Não Sim Não Sim Não Não Sim Sim Somente XFS v4 Descontinuado em favor do GRUB.
LILO Sim Não Sim Não Sim Não Sem criptografia Sim Sim Sim Descontinuado em razão de limitações (p.ex., com Btrfs, GPT, RAID).
  1. O suporte ao sistema de arquivos é herdado do firmware. A especificação UEFI exige suporte para os sistemas de arquivos FAT12, FAT16 e FAT32[4], mas os fornecedores podem opcionalmente adicionar suporte para sistemas de arquivos adicionais; por exemplo, o firmware dos Macs da Apple têm suporte ao sistema de arquivos HFS+. Se o firmware fornecer uma interface para carregar [Unified Extensible Firmware Interface#UEFI|drivers UEFI]] na inicialização, o suporte a sistemas de arquivos adicionais poderá ser adicionado carregando drivers de sistema de arquivos (adquiridos independentemente).
  2. Um gerenciador de boot. Ele só pode iniciar outros aplicativos EFI, por exemplo, imagens de kernel do Linux criadas com CONFIG_EFI_STUB=y e Windows bootmgfw.efi.

Veja também Wikipedia:Comparison of boot loaders.

Kernel

O kernel é o núcleo de um sistema operacional. Ele funciona em um baixo nível (kernelspace ou espaço de kernel) interagindo entre o hardware da máquina e os programas que usam o hardware para funcionar. O kernel interrompe temporariamente os programas para executar outros programas, entretanto, conhecido como preemptividade ou preempção. Isso cria a ilusão de muitas tarefas sendo executadas simultaneamente, mesmo em CPUs de núcleo único. O kernel usa o agendador da CPU para decidir qual programa tem prioridade a qualquer momento.

Para fazer uso eficiente da CPU, o kernel usa um agendador para arbitrar quais tarefas têm prioridade em qualquer momento, criando a ilusão de que muitas tarefas são executadas simultaneamente.

initramfs

Depois que o gerenciador de boot carrega o kernel e os possíveis arquivos initramfs e executa o kernel, o kernel extrai os arquivos initramfs (sistema de arquivos RAM inicial) no (então vazio) rootfs (sistema de arquivos raiz inicial, especificamente um ramfs ou tmpfs). O primeiro initramfs extraído é aquele embutido no binário do kernel durante a construção do kernel, então os possíveis arquivos initramfs externos são extraídos. Assim, os arquivos no initramfs externo sobrescrevem arquivos com o mesmo nome no initramfs incorporado. O kernel então executa /init (no rootfs) como o primeiro processo. O early userspace é iniciado.

O Arch Linux usa um arquivo vazio para o initramfs incorporado (que é o padrão ao construir o Linux). Veja mkinitcpio para mais informações específicas do Arch sobre o initramfs externo.

Depois que o kernel é carregado, ele descompacta o initramfs (sistema de arquivos RAM inicial ou initial RAM filesystem), que se torna o sistema de arquivos raiz inicial. O kernel então executa /init como o primeiro processo. O early userspace é iniciado.

O objetivo do initramfs é inicializar o sistema até o ponto em que ele pode acessar o sistema de arquivos raiz (consulte FHS para obter detalhes). Isso significa que quaisquer módulos necessários para dispositivos como IDE, SCSI, SATA, USB/FW (se inicializando de uma unidade externa) devem poder ser carregados a partir do initramfs, se não estiverem embutidos no kernel; uma vez que os módulos apropriados são carregados (seja explicitamente através de um programa ou script, ou implicitamente via udev), o processo de inicialização continua. Por esse motivo, o initramfs precisa apenas conter os módulos necessários para acessar o sistema de arquivos raiz; não precisa conter todos os módulos que alguém desejaria usar. A maioria dos módulos será carregada mais tarde pelo udev, durante o processo de inicialização.

Processo init

No estágio final do início do espaço de usuário, a raiz real é montada e, em seguida, substitui o sistema de arquivos raiz inicial. /sbin/init é executado, substituindo o processo /init. Arch usa systemd como o init padrão.

getty

init chama getty uma vez para cada terminal virtual (geralmente seis deles), que inicializa cada tty e solicita um nome de usuário e senha. Uma vez que o nome de usuário e a senha são fornecidos, o getty os verifica em /etc/passwd e /etc/shadow, depois chama login. Alternativamente, o getty pode iniciar um gerenciador de exibição se houver um presente no sistema.

Gerenciador de exibição

Um gerenciador de exibição pode ser configurado para substituir o prompt de login do getty em um tty.

Para inicializar automaticamente um gerenciador de exibição após a inicialização, é necessário ativar manualmente a unidade de serviço através de systemd. Para obter mais informações sobre como ativar e iniciar unidades de serviço, consulte Systemd#Usando units.

Login

O programa login começa uma sessão para o usuário definindo as variáveis de ambiente e iniciando o shell do usuário, com base no /etc/passwd.

O programa login exibe o conteúdo de /etc/motd (message of the day ou, em português, mensagem do dia) após um login bem sucedido, logo antes dele executar o shell de login. É um bom lugar para exibir seus Terms of Service (Termos de Serviços) para lembrar seus usuários de suas políticas locais ou qualquer outra coisa que você deseje falar para eles.

Shell

Uma vez iniciado o shell do usuário, ele normalmente executará um arquivo de configuração de tempo de execução, como o bashrc, antes de apresentar um prompt ao usuário. Se a conta estiver configurada para iniciar X no login, o arquivo de configuração de tempo de execução chamará startx ou xinit.

GUI, xinit ou wayland

xinit executa o arquivo de configuração de tempo de execução xinitrc do usuário, que normalmente inicia um gerenciador de janelas. Quando o usuário terminar e sair do gerenciador de janelas, xinit, startx, o shell e o login serão encerrados nessa ordem, retornando ao getty.

Veja também